我最近按照本指南在本地Raspberry Pi集群上设置了Kubernetes。我可以在局域网上正常访问它;但是我也希望能够远程访问它。我已经在路由器上设置了端口转发,但是当我尝试从LAN外部连接时,出现x509证书错误,表明该证书是针对我的本地192.168地址而不是我的家庭IP签名的。我可以使用--insecure-skip-tls-verify选项绕过此操作,但我宁愿使用的证书仅包含我的IP地址。只是...尽管我确实有一些想法,但我不确定如何做到这一点。 IP?这样做会产生任何不利影响(例如排除我的local / 192.168 IP吗?)。理想情况下,我希望为内部和外部IP都签署证书。还是我应该给kubeadm init其他选择?其次,既然已经初始化了,是否有任何方法可以重新生成证书并换出证书,还是需要对集群进行核对?

要澄清一下,我没有任何证书管理器已安装。我不是在谈论Ingress。我说的是kubeadm在首次安装群集时生成的实际“根”证书(由于缺少更好的术语),即位于--apiserver-advertise-address的证书。

#1 楼

为此,您首先需要kubeadm配置文件。这将创建一个名为kubeadm.yaml的文件:

kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml

现在在编辑器中打开该文件,并在certSANs部分下找到apiServer列表。如果不存在,则需要添加它;如果是这样,您只需在该列表中添加另一个条目。示例:

apiServer:
  certSANs:
  - "172.29.50.162"
  - "k8s.domain.com"
  - "other-k8s.domain.net"
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s


现在将旧证书移动到另一个文件夹,否则kubeadm将不会重新创建新证书:

mv /etc/kubernetes/pki/apiserver.{crt,key} ~

使用kubeadm生成新的apiserver证书:

kubeadm init phase certs apiserver --config kubeadm.yaml

现在重新启动kubeapiserver容器:


运行docker ps | grep kube-apiserver | grep -v pause以获得
运行Kubernetes API服务器的容器的容器ID
运行docker kill <containerID>杀死该容器。
Kubelet将自动重新启动该容器,这将获取新证书。

如果一切正常,请不要忘记更新存储在集群中的kubeadm ConfigMap,否则,将来的kubeadm升级将缺少新配置:

如果使用Kubernetes
kubeadm config upload from-file --config kubeadm.yaml

对于Kubernetes版本> = v1.15:

kubeadm init phase upload-config kubeadm --config kubeadm.yaml

本文有一个有关如何向Kubernetes API Server证书添加名称的更完整的指南te

评论


像魅力一样工作!只需注意一件事:在最后指定的from-file选项实际上已被弃用。上载该文件的新命令是kubeadm init phase upload-config kubeadm --config = kubeadm.yaml谢谢!

–soapergem
19年11月3日在5:09

@soapergem感谢您的注意!答案已使用新命令更新。

–爱德华多·贝特洛(Eduardo Baitello)
19年11月4日在2:42

#2 楼

@Eduardo Baitello给出的答案是绝大多数Kube安装的正确答案。但是我了解到,如果您在Ubuntu上安装了MicroK8S snap安装,则说明会有所不同。对于此问题,您需要更新/var/snap/microk8s/current/certs/csr.conf.template文件,然后依次运行microk8s.stopmicrok8s.start