如何为我的Kubernetes证书添加额外的IP / 主机名

156次阅读
没有评论

问题描述

在使用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
  1. 使用文本编辑器打开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} ~
  1. 使用kubeadm生成新的apiserver证书:
kubeadm init phase certs apiserver --config kubeadm.yaml
  1. 现在重新启动kube-apiserver容器:
  2. 运行docker ps | grep kube-apiserver | grep -v pause命令获取运行Kubernetes API服务器的容器的ID。
  3. 运行docker kill <containerID>命令杀死容器。
  4. Kubelet将自动重新启动容器,容器将使用新的证书。
  5. 如果一切正常,不要忘记更新存储在集群中的kubeadm ConfigMap,否则,未来的kubeadm升级将缺少你的新配置:
  6. 如果使用的是Kubernetes版本小于v1.15:
    shell
    kubeadm config upload from-file --config kubeadm.yaml
  7. 如果使用的是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.stopmicrok8s.start命令。
    这篇文章有一个更详细的指南,介绍了如何为Kubernetes API服务器证书添加名称

正文完