atualização online do certificado kubernetes

Tempo de expiração de cada certificado

/etc/kubernetes/pki/apiserver.crt                #1年有效期
/etc/kubernetes/pki/front-proxy-ca.crt           #10年有效期
/etc/kubernetes/pki/ca.crt                       #10年有效期
/etc/kubernetes/pki/apiserver-etcd-client.crt    #1年有效期
/etc/kubernetes/pki/front-proxy-client.crt       #1年有效期
/etc/kubernetes/pki/etcd/server.crt              #1年有效期
/etc/kubernetes/pki/etcd/ca.crt                  #10年有效期
/etc/kubernetes/pki/etcd/peer.crt                #1年有效期
/etc/kubernetes/pki/etcd/healthcheck-client.crt  #1年有效期
/etc/kubernetes/pki/apiserver-kubelet-client.crt #1年有效期

Pode ser usado para verificar o tempo de expiração do certificado:

Método 1

kubeadm alpha certs check-expiration

Método 2

openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
kubeadm alpha certs 命令详解:
Available Commands:
  certificate-key  生成证书和key
  check-expiration  检测证书过期时间
  renew            续订Kubernetes集群的证书
  kubeadm alpha certs命令仅支持v1.15及其以上的版本。
kubeadm alpha certs check-expiration

Este comando exibe o tempo de expiração / tempo restante do certificado do cliente na pasta / etc / kubernetes / pki e o certificado do cliente incorporado no arquivo KUBECONFIG usado pelo kubeadm.

Se você estiver executando um cluster altamente disponível, este comando precisa ser executado em todos os nós do painel de controle.

Em seguida, vamos atualizar nosso certificado de cluster. As seguintes operações são realizadas no nó mestre. Primeiro, faça backup do certificado original:

mkdir /etc/kubernetes.bak
cp -r /etc/kubernetes/pki/ /etc/kubernetes.bak
cp /etc/kubernetes/*.conf /etc/kubernetes.bak
然后备份 etcd 数据目录:
cp -r /var/lib/etcd /var/lib/etcd.bak

Atualizar certificado com Kubernetes certificate API

Além da atualização manual do certificado com um clique mencionada acima, você também pode usar a API do certificado Kubernetes para realizar a atualização manual do certificado. Para o ambiente on-line, não podemos correr o risco de atualizar o cluster ou atualizar o certificado com frequência. Afinal, isso é arriscado. Portanto, esperamos que o período de validade do certificado gerado seja longo o suficiente. Embora isso não seja recomendado do ponto de vista da segurança, não é recomendado. Em alguns cenários, um período de validade de certificado suficientemente longo também é muito necessário. Muitos administradores alteram manualmente o código-fonte do kubeadm para 10 anos e, em seguida, recompilam para criar um cluster. Embora esse método possa atingir o objetivo, não é recomendado usar este método, especialmente quando você deseja atualizar o cluster. Deve ser atualizado com a nova versão. Na verdade, o Kubernetes fornece um método de API para nos ajudar a gerar um período de validade de certificado longo o suficiente.
Para usar o método de API integrado para assinar, primeiro precisamos configurar o parâmetro --experimental-cluster-Sign-duration do componente kube-controller-manager e ajustá-lo para 10 anos. Aqui está o cluster instalado pelo kubeadm, então modificamos diretamente o estático O arquivo yaml do pod pode ser:

vim /etc/kubernetes/manifests/kube-controller-manager.yaml
......
spec:
  containers:
  - command:
    - kube-controller-manager
     #设置证书有效期为 10 年
    - --experimental-cluster-signing-duration=87600h 
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
......

Depois que a modificação for concluída, o kube-controller-manager irá reiniciar automaticamente para entrar em vigor. Em seguida, precisamos usar o seguinte comando para criar uma solicitação de assinatura de certificado para a API de certificado do Kubernetes. Se você configurar um signatário externo, como cert-manager, as solicitações de assinatura de certificado (CSRs) serão aprovadas automaticamente. Caso contrário, você deve aprovar manualmente o certificado usando o comando kubectl certificate. O seguinte comando kubeadm exibe o nome do certificado a ser aprovado e, em seguida, aguarda a aprovação:

kubeadm alpha certs renew all --use-api --config kubeadm.yaml &

O resultado é semelhante ao seguinte:

[1] 2890
[certs] Certificate request "kubeadm-cert-kubernetes-admin-pn99f" created

#然后接下来我们需要去手动批准证书:

kubectl get csr
NAME                                  AGE   REQUESTOR          CONDITION
kubeadm-cert-kubernetes-admin-pn99f   64s   kubernetes-admin   Pending

Aprovar manualmente o certificado

kubectl certificate approve kubeadm-cert-kubernetes-admin-pn99f
certificatesigningrequest.certificates.k8s.io/kubeadm-cert-kubernetes-admin-pn99f approved 

用同样的方式为处于 Pending 状态的 csr 执行批准操作,直到所有的 csr 都批准完成为止。最后所有的 csr 列表状态如下所示:

kubectl get csr
NAME                                                AGE     REQUESTOR          CONDITION
kubeadm-cert-front-proxy-client-llhrj               30s     kubernetes-admin   Approved,Issued
kubeadm-cert-kube-apiserver-2s6kf                   2m43s   kubernetes-admin   Approved,Issued
kubeadm-cert-kube-apiserver-etcd-client-t9pkx       2m7s    kubernetes-admin   Approved,Issued
kubeadm-cert-kube-apiserver-kubelet-client-pjbjm    108s    kubernetes-admin   Approved,Issued
kubeadm-cert-kube-etcd-healthcheck-client-8dcn8     64s     kubernetes-admin   Approved,Issued
kubeadm-cert-kubernetes-admin-pn99f                 4m29s   kubernetes-admin   Approved,Issued
kubeadm-cert-system:kube-controller-manager-mr86h   79s     kubernetes-admin   Approved,Issued
kubeadm-cert-system:kube-scheduler-t8lnw            17s     kubernetes-admin   Approved,Issued
kubeadm-cert-ydzs-master-cqh4s                      52s     kubernetes-admin   Approved,Issued
kubeadm-cert-ydzs-master-lvbr5                      41s     kubernetes-admin   Approved,Issued

Verifique o período de validade do certificado após a aprovação:

kubeadm alpha certs check-expiration
CERTIFICATE                EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
admin.conf                 Nov 05, 2029 11:53 UTC   9y              no
apiserver                  Nov 05, 2029 11:54 UTC   9y              no
apiserver-etcd-client      Nov 05, 2029 11:53 UTC   9y              no
apiserver-kubelet-client   Nov 05, 2029 11:54 UTC   9y              no
controller-manager.conf    Nov 05, 2029 11:54 UTC   9y              no
etcd-healthcheck-client    Nov 05, 2029 11:53 UTC   9y              no
etcd-peer                  Nov 05, 2029 11:53 UTC   9y              no
etcd-server                Nov 05, 2029 11:54 UTC   9y              no
front-proxy-client         Nov 05, 2029 11:54 UTC   9y              no
scheduler.conf             Nov 05, 2029 11:53 UTC   9y              no

Podemos constatar que foi prorrogado por 10 anos, pois o prazo de validade do certificado CA é de apenas 10 anos.

Mas agora não podemos reiniciar diretamente vários componentes do painel de controle. Isso ocorre porque o etcd correspondente ao cluster instalado com kubeadm usa o certificado /etc/kubernetes/pki/etcd/ca.crt para o anterior O certificado aprovado pelo comando kubectl certificate approve é emitido usando o certificado /etc/kubernetes/pki/ca.crt padrão, portanto, precisamos substituir o certificado CA no etcd:

Copie a lista de recursos estáticos do pod primeiro

cp -r /etc/kubernetes/manifests/ /etc/kubernetes/manifests.bak
vi /etc/kubernetes/manifests/etcd.yaml
......
spec:
  containers:
  - command:
    - etcd
    # 修改为 CA 文件
    - --peer-trusted-ca-file=/etc/kubernetes/pki/ca.crt
    - --trusted-ca-file=/etc/kubernetes/pki/ca.crt
......
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data
    - mountPath: /etc/kubernetes/pki  # 更改证书目录
      name: etcd-certs
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki  # 将 pki 目录挂载到 etcd 中去
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /var/lib/etcd 
      type: DirectoryOrCreate
    name: etcd-data
......

Como o kube-apiserver precisa se conectar ao cluster etcd, o arquivo etcd ca correspondente também precisa ser revisado:

vim /etc/kubernetes/manifests/kube-apiserver.yaml
......
spec:
  containers:
  - command:
    - kube-apiserver
    # 将etcd ca文件修改为默认的ca.crt文件
    - --etcd-cafile=/etc/kubernetes/pki/ca.crt
......

Além disso, você precisa substituir o arquivo requestheader-client-ca-file, o padrão é o arquivo /etc/kubernetes/pki/front-proxy-ca.crt e agora você precisa substituí-lo pelo arquivo CA padrão, caso contrário, use a API de agregação, como Depois de instalar o metrics-server e executar o comando kubectl top, um erro será relatado:

cp /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/front-proxy-ca.crt
cp /etc/kubernetes/pki/ca.key /etc/kubernetes/pki/front-proxy-ca.key

Por ser um pod estático, os componentes acima serão reiniciados automaticamente para entrar em vigor após a conclusão da modificação. Como nossa versão atual do kubelet tem a rotação automática de certificados habilitada por padrão, o certificado kubelet não precisa mais ser gerenciado, então atualizarei o certificado para um período de validade de 10. Certifique-se de fazer backup do diretório do certificado antes da operação para evitar reversão de erros de operação.

Acho que você gosta

Origin blog.51cto.com/14034751/2552331
Recomendado
Clasificación