即使我所有的服务器证书都有效,也无法访问我的 kubernetes 集群
Can not access my kubernetes cluster even if all my server certificates are valid
我正在努力实现我的 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 命令上显示错误:
"error: You must be logged in to the server (Unauthorized)"
我能想到的可能问题是/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 在 kubernetes 中创建 CSR admin.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
现在批准使用生成的 CSR
kubectl 证书批准 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 有新的客户端证书数据和密钥。
希望对您有所帮助。
verified to work with K8s / kubeadm versions 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
kubeadm
在 K8s v1.15.x
中有新的有用功能。
确保在每个控制平面节点上执行这些步骤:
- 检查过期
kubeadm alpha certs check-expiration
- 更新(例如
scheduler.conf
中的证书)
kubeadm alpha certs renew scheduler.conf
我正在努力实现我的 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 命令上显示错误: "error: You must be logged in to the server (Unauthorized)"
我能想到的可能问题是/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.csropenssl genrsa -out admin.key 2048
openssl req -new -key admin.key -out admin.csr -subj "/O=system:masters/CN=kubernetes-admin"
现在使用上面的 openssl 在 kubernetes 中创建 CSR admin.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
现在批准使用生成的 CSR kubectl 证书批准 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 有新的客户端证书数据和密钥。
希望对您有所帮助。
verified to work with K8s / kubeadm versions
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
kubeadm
在 K8s v1.15.x
中有新的有用功能。
确保在每个控制平面节点上执行这些步骤:
- 检查过期
kubeadm alpha certs check-expiration
- 更新(例如
scheduler.conf
中的证书)kubeadm alpha certs renew scheduler.conf