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

时间:2018-10-22 07:01:49

标签: kubernetes kubectl kubeadm

我试图使我的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 node / pods命令上显示错误: “错误:您必须登录到服务器(未经授权)”

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我想出了一种在群集过期之前重新生成新的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.csr在kubernetes中创建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获取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)具有新的客户端证书数据和密钥。

希望这会有所帮助。

答案 2 :(得分:0)

  

已验证可与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
    

K8 kubeadm中的

v1.15.x具有新的有用功能。

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

  • 检查到期时间
    kubeadm alpha certs check-expiration
    
  • 要续订(例如scheduler.conf中的证书)
    kubeadm alpha certs renew scheduler.conf