无法访问我的 kubernetes 集群,即使我的所有服务器证书都有效



我正在努力实现我的 kubernetes 集群的有效期为 5 年,所以我让我的 ca.crt、apiserver.crt、kubelet-client.crt、front-proxy.crt的有效期为 5 年,并将它们放在/etc/kubernetes/pki中。

另外,我已经启用了我的kubelet客户端证书轮换

Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki --feature-gates=RotateKubeletClientCertificate=true"

因此,为了验证我的集群是否正常工作,我将系统上的日期更改为 1 年到期前 1 天,并且证书轮换正确完成

Oct 22 06:00:16 ip-10-0-1-170.ec2.internal kubelet[28887]: I1022 06:00:16.806115   28887 reconciler.go:154] Reconciler: start to sync state
Oct 22 06:00:23 ip-10-0-1-170.ec2.internal kubelet[28887]: I1022 06:00:23.546154   28887 transport.go:126] certificate rotation detected, shutting down client connections to start using new credentials

但是一旦我的集群经过一年,它就会开始在任何 kubectl get nodes/pods 命令上显示错误: "错误:您必须登录到服务器(未经授权(">

我能想到的可能问题是/etc/kubernetes/admin.conf只有一年的有效性证书。感谢您的帮助

您的client-certificate(/etc/kubernetes/admin.conf(生成一年。您可以使用以下命令生成客户端证书:

kubeadm alpha phase kubeconfig admin --cert-dir /etc/kubernetes/pki --kubeconfig-dir /etc/kubernetes/

我已经找到了一种方法在集群到期之前重新生成新的admin.conf证书

使用 openssl 生成 admin.key 和 admin.csr

openssl genrsa -out admin.key 2048 
openssl req -new -key admin.key -out admin.csr -subj "/O=system:masters/CN=kubernetes-admin"

现在使用上面的openssl admin在Kubernetes中创建CSR.csr

cat <<EOF | kubectl create -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: admin_csr
spec:
groups:
- system:authenticated
request: $(cat admin.csr | base64 | tr -d 'n')
usages:
- digital signature
- key encipherment
- client auth
EOF

现在批准使用 库贝特尔证书批准admin_csr

现在从批准的 CSR 中提取 admin.crt Kubectl Get CSR admin_csr -o jsonpath='{.status.certificate}' |base64 -d> admin.crt

现在,更改当前用户和上下文以使用新的管理密钥和证书。

kubectl config set-credentials kubernetes-admin --client-certificate=/home/centos/certs/admin.crt  --client-key=/home/centos/certs/admin.key
kubectl config set-context kubernetes-admin@kubernetes --cluster=kubernetes --user=kubernetes-admin

在此步骤之后,您的 kubeconfig(在我的例子中是/root/.kube/config(具有新的客户端证书数据和密钥。

希望这有帮助。

经验证可与 K8s/kubeadm 版本配合使用v1.14.x

确保在每个控制平面节点上执行以下步骤:

  • 要手动重新生成证书,请使用以下命令

    # all certs
    kubeadm alpha certs renew all
    # individual cert
    # see `kubeadm alpha certs renew --help` for list
    kubeadm alpha certs renew apiserver-kubelet-client
    

    下面是一个有用的脚本,用于自动检查证书过期,并在过期时续订: https://gist.github.com/anapsix/974d6c51c7691af45e33302a704ad72b

  • 要重新生成/etc/kubernetes/admin.conf配置,可以使用以下命令,这显然是一个严密保护的秘密,因为我找不到任何提到关键--org system:masters部分的文档

    kubeadm alpha kubeconfig user 
    --org system:masters 
    --client-name kubernetes-admin
    

K8sv1.15.x中的kubeadm具有新的有用功能。

确保在每个控制平面节点上执行以下步骤:

  • 检查过期
    kubeadm alpha certs check-expiration
    
  • 续订(例如scheduler.conf中的证书(
    kubeadm alpha certs renew scheduler.conf
    

相关内容

  • 没有找到相关文章

最新更新