主要用于修改由kubeadm部署的集群需要修改apiserver中证书信息的DNS. 比如apiserver的vip突然变动就会需要这个操作,防范于未然, 到真遇到的时候也不至于手忙脚乱不知所措, 有预案就好办.
注: 以下步骤是假定集群部署时使用kubeadm, 且使用的默认的CA签署的证书.
###Kubeadm config配置修改
查看证书中包含的dns
1 | openssl x509 -in apiserver.crt -noout -text |
可以看到当前证书中已经存在的认证的域名
查看当前存在的kubeadm config.yaml
1 | kubeadm config view > /root/kubeadmconf.yml |
1 | apiVersion: kubeadm.k8s.io/v1beta1 |
删除证书
删除k8s证书目录中的apiserver.crt 、apiserver.key
1 | cd /etc/kubernetes/pki |
生成新证书
1 | kubeadm init phase certs apiserver --config kubeadm-config.yaml |
更新kubeadm ConfigMap
1 | kubeadm config upload from-file --config /root/kubeadmconf.yml |
重启kubelet
1 | systemctl daemon-reload |
重启apiserver
1 | docker ps -af name=k8s_kube-apiserver* -q | xargs --no-run-if-empty docker rm -f |
再次查看证书后会发现新增域名已经包含在证书里面了.
certSANs的作用
Kubernetes apiserver使用数字证书来加密去往/来自API服务器的流量以及对与apiserver的连接进行身份验证。这样,如果您尝试使用诸如kubectl之类的命令行客户端连接到APIserver,并且使用的证书Subject Alternative Names(SAN)列表中未包含的主机名或IP地址,就会得到一个错误,指示证书对于指定的IP地址或主机名无效。要解决此问题,需要更新证书,以便SAN列表中包含用于访问API服务器的所有IP地址或主机名
使用kubeadm默认部署的情况下, kubeadm会将一些默认的dns比如kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local
等加入到证书列表中
这个从kubeadm的部署日志中可以看到
1 | I0326 02:57:52.228780 2975 version.go:237] remote version is much newer: v1.14.0; falling back to: stable-1.13 |
因此也建议在部署时, 将所有master节点的hostname、ip、127.0.0.1、apiserver的VIP等加入到certSANs列表中
rancher是如何实现的
因为生产环境使用的是rancher做为k8s集群管理平台, 看到上面的结论让我想到一个疑问:
既然在证书列表中的ip才可以通过apiserver的认证, 为何从rancher上导出的kubeconfig file入到本地机器(ip不在apiserver的证书列表中, 与rancher平台网络是想通的)也可以访问集群?
其实想想也好解释, 我们在rancher上的操作,其实都不是直接访问的apiserver,而是通过rancher去连接的apiserver, 想想在用rancher托管k8s集群时, rancher是不是需要在k8s集群中安装agent?
答案就在agent上,rancher web上的所有操作都被转到了rancher server上而被下发到rancher agent上, 所有的认证及权限或者其它跟apiserver通信的操作都由rancher agent上完成
而rancher agent是以daemonset的方式部署在master上, 这样,master的ip自然是在apiserver的认证列表中.