Z.S.K.'s Records

Kubernetes学习(apiserver证书中新增IP/DNS)

主要用于修改由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
2
3
4
5
6
7
8
9
10
11
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.15.4
controlPlaneEndpoint: "172.20.25.26:16443"
imageRepository: "registry.aliyuncs.com/google_containers"
networking:
podSubnet: "10.244.0.0/16"
apiServer:
certSANs:
- "172.20.25.26"
- "k8s.cluster.local" # 新增域名

删除证书

删除k8s证书目录中的apiserver.crt 、apiserver.key

1
2
cd /etc/kubernetes/pki
mv apiserver.crt apiserver.key ~

生成新证书

1
kubeadm init phase certs apiserver --config kubeadm-config.yaml

更新kubeadm ConfigMap

1
kubeadm config upload from-file --config /root/kubeadmconf.yml

重启kubelet

1
2
systemctl daemon-reload
systemctl restart kubelet

重启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
2
3
I0326 02:57:52.228780    2975 version.go:237] remote version is much newer: v1.14.0; falling back to: stable-1.13
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.148.0.39]

因此也建议在部署时, 将所有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的认证列表中.

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?