问题描述
在使用Kubernetes时,希望能够为证书添加额外的IP地址或主机名,以便能够从外部访问集群。用户已经在路由器上设置了端口转发,但是当他尝试从局域网外部连接时,出现了x509证书错误,指示证书是为本地的192.168地址签名的,而不是家庭的IP地址。用户可以使用--insecure-skip-tls-verify
选项绕过此错误,但他更希望证书能够包含他的IP地址。用户想知道在初始设置时是否应该使用--apiserver-advertise-address
选项来指定家庭IP地址,这样做是否会有任何不良影响(比如排除了本地/192.168 IP地址?)。另外,现在已经初始化了集群,是否有办法重新生成证书并替换它,还是需要重新创建集群?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
要为Kubernetes证书添加额外的IP地址或主机名,可以按照以下步骤操作:
1. 首先,需要获取kubeadm
配置文件。可以使用以下命令将配置保存到名为kubeadm.yaml
的文件中:
kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml
- 使用文本编辑器打开
kubeadm.yaml
文件,并找到apiServer
部分下的certSANs
列表。如果列表不存在,则需要添加它;如果已存在,则只需向该列表添加一个条目。例如:
apiServer:
certSANs:
- "172.29.50.162"
- "k8s.domain.com"
- "other-k8s.domain.net"
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
在上面的示例中,我们向certSANs
列表添加了一个IP地址和两个主机名。你可以根据需要添加更多的IP地址或主机名。
3. 将旧的证书移动到另一个文件夹中,否则kubeadm
将不会重新创建新的证书:
mv /etc/kubernetes/pki/apiserver.{crt,key} ~
- 使用
kubeadm
生成新的apiserver证书:
kubeadm init phase certs apiserver --config kubeadm.yaml
- 现在重新启动
kube-apiserver
容器: - 运行
docker ps | grep kube-apiserver | grep -v pause
命令获取运行Kubernetes API服务器的容器的ID。 - 运行
docker kill <containerID>
命令杀死容器。 - Kubelet将自动重新启动容器,容器将使用新的证书。
- 如果一切正常,不要忘记更新存储在集群中的
kubeadm
ConfigMap,否则,未来的kubeadm
升级将缺少你的新配置: - 如果使用的是Kubernetes版本小于v1.15:
shell
kubeadm config upload from-file --config kubeadm.yaml - 如果使用的是Kubernetes版本大于等于v1.15:
shell
kubeadm init phase upload-config kubeadm --config kubeadm.yaml
请注意,这些步骤适用于大多数Kubernetes安装。如果你在Ubuntu上使用的是MicroK8S的snap安装,步骤会有所不同。根据这个问题的说明,你需要更新/var/snap/microk8s/current/certs/csr.conf.template
文件,然后依次运行microk8s.stop
和microk8s.start
命令。
这篇文章有一个更详细的指南,介绍了如何为Kubernetes API服务器证书添加名称。
正文完