Kubernetes apiserver证书新增SAN域名
Kubernetes API服务使用数字证书来加密与API交互的流量,以及验证与API服务的连接。因此,使用客户端去连接apiserver,比如kubectl,如果使用的域名或者IP没有包含在apiserver证书(certificate)的SAN(Subject Alternative Name)中,将会报错,当前证书对于指定的IP或者域名是无效的。在某些情况下,比如我们想为control plane增加负载均衡,要使用新域名,或者原来访问apiserver使用的是IP,打算更改为使用域名,这时我们就需要更新apiserver证书的SAN,以便可以支持新的域名或者IP。本文接下来将阐述如何为apiserver的证书增加SAN列表,但是操作步骤适用情况会有一些前提:
- Kubernetes 集群使用kubeadm创建;
- Kubernetes 集群使用的凭证管理中心(certificate authority)是使用kubeadm创建的;
- Kubernetes control plane为配置HA;
如果在使用kubeadm init
创建集群时使用了配置文件,那么接下来的更新步骤可以在这个配置文件的基础上来完成。如果创建集群时没有使用到配置文件,kubeadm会把它的一些默认配置写入到集群中,这时,我们先把配置文件从集群中拉取下来,这个配置文件存储在’kube-system’空间的’kubeadm-config’ ConfigMap中。拉取配置文件的命令如下:
1 | kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml |
拉取下来的配置会写入文件 kubeadm.yml,内容如下:
1 | apiServer: |
在apiServer section增加一个certSANs列表,例如:
1 | apiServer: |
在这个例子中,”172.29.50.162”、”k8s.domain.com”和”other-k8s.domain.net”就是要增加的SAN列表。更新了配置文件后,接下来通过生成新的apiserver证书来更新SAN。首先备份一下旧的证书:
1 | mv /etc/kubernetes/pki/apiserver.{crt,key} ~ |
使用kubeadm
生成新的证书:
1 | kubeadm init phase certs apiserver --config kubeadm.yaml |
更新证书之后,需要重启kube-apiserver服务,在master服务器上,可以通过docker命令进行重启:
1 | docker ps | grep kube-apiserver | grep -v pause |
更新证书之后,我们需要验证更新是否成功,一般有以下两种方式。
一种方式是使用kubectl命令,更改kubectl的配置文件,使用新的地址,通过kubectl来验证使用新的地址是否工作正常,kubectl配置文件 “~/.kube/config”。
另外一种方式是使用openssl来查看证书信息,查看 ‘X509v3 Subject Alternative Name’ 部分是否包含了新的域名或IP。:
1 | openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text |
最后我们需要把配置更新到集群的ConfigMap中,如果没有做这步,会影响到以后集群的升级,更新集群配置如下:
1 | kubeadm config upload from-file --config kubeadm.yaml |
更新之后,可以检查整个集群的配置:
1 | kubectl -n kube-system get configmap kubeadm-config -o yaml |