Este documento descreve como renovar manualmente os certificados expirados para o seu Google Distributed Cloud. Os certificados Transport Layer Security (TLS) são usados pelos componentes do plano de controlo do Google Distributed Cloud. Quando estes certificados expiram, a sua capacidade de gerir cargas de trabalho e ciclos de vida de clusters é bloqueada até que os certificados possam ser renovados. Para mais informações sobre o impacto dos certificados expirados, consulte o artigo Expiração de certificados.
Esta página destina-se a administradores, arquitetos e operadores que gerem o ciclo de vida da infraestrutura tecnológica subjacente e respondem a alertas e páginas quando os objetivos de nível de serviço (SLOs) não são cumpridos ou as aplicações falham. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no Google Cloud conteúdo, consulte o artigoFunções e tarefas comuns do utilizador do GKE.
Por predefinição, os certificados TLS, incluindo os certificados etcd, têm um período de validade de 1 ano. O Google Distributed Cloud renova estes certificados durante as atualizações do cluster e quando roda as autoridades de certificação. Estes certificados não são atualizados periodicamente de forma autónoma. Recomendamos que atualize os seus clusters regularmente para os manter seguros, suportados e evitar que os certificados TLS expirem.
Erros causados pela expiração do certificado
Se os certificados TLS no seu cluster expirarem, os controladores principais não podem estabelecer ligações TLS com o servidor da API Kubernetes. Esta falta de conetividade causa os seguintes erros:
Não é possível estabelecer ligação ao servidor: x509
Quando usa
kubectlpara obter os nós do cluster, a resposta inclui um erro a indicar que os seus certificados expiraram, semelhante ao seguinte exemplo de resultado:Unable to connect to the server: x509: certificate has expired or is not yet validNão foi possível estabelecer ligação: x509 ou ligação rejeitada
Os certificados expirados bloqueiam o acesso ao cluster etcd, uma vez que os pares não conseguem comunicar entre si. Os registos do etcd podem conter entradas de erro como as seguintes:
W | rafthttp: health check for peer 6221a1d241bb2d0a could not connect: x509: certificate has expired or is not yet valid I | embed: rejected connection from "10.200.0.4:46108" (error "remote error: tls: bad certificate", ServerName "")
Verifique as horas de validade dos certificados
Para verificar os prazos de validade dos certificados, efetue os seguintes passos em cada nó do plano de controlo:
Inicie sessão numa das máquinas de nós do plano de controlo e execute o seguinte comando:
sudo kubeadm certs check-expirationA saída do comando apresenta os certificados criados pelo
kubeadmpara os componentes do plano de controlo e a respetiva data de validade, conforme mostrado na seguinte saída de exemplo:CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Nov 28, 2021 19:09 UTC 53m no apiserver Nov 28, 2021 19:09 UTC 53m ca no apiserver-etcd-client Nov 28, 2021 19:09 UTC 53m etcd-ca no apiserver-kubelet-client Nov 28, 2021 19:09 UTC 53m ca no controller-manager.conf Nov 28, 2021 19:09 UTC 53m no etcd-healthcheck-client Nov 28, 2021 19:09 UTC 53m etcd-ca no etcd-peer Nov 28, 2021 19:09 UTC 53m etcd-ca no etcd-server Nov 28, 2021 19:09 UTC 53m etcd-ca no front-proxy-client Nov 28, 2021 19:09 UTC 53m front-proxy-ca no scheduler.conf Nov 28, 2021 19:09 UTC 53m no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca Nov 26, 2031 18:06 UTC 9y no etcd-ca Nov 26, 2031 18:06 UTC 9y no front-proxy-ca Nov 26, 2031 18:06 UTC 9y noExecute o seguinte comando para verificar os prazos de validade dos
kubeletcertificados:sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text | grep Validity -A2 sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -text | grep Validity -A2A resposta para cada comando tem o seguinte aspeto:
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMTSe todos os nós do plano de controlo tiverem sido iniciados ao mesmo tempo, os prazos de validade dos certificados estão a poucos minutos uns dos outros. Esta relação de tempo aplica-se a todos os nós do plano de controlo. Pode verificar os prazos de validade executando os comandos anteriores em cada nó do plano de controlo.
Execute o seguinte comando na estação de trabalho do administrador para verificar a hora de expiração do certificado do cliente no ficheiro kubeconfig do cluster:
grep 'client-certificate-data' KUBECONFIG_PATH | \ awk '{print $2}' | base64 -d | openssl x509 -text | grep Validity -A2A resposta tem o seguinte aspeto:
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMTExecute o seguinte comando para procurar a data de validade do certificado para o kubeconfig do cluster no cluster de administrador:
kubectl get secret/CLUSTER_NAME-kubeconfig \ -n CLUSTER_NAMESPACE \ --kubeconfig ADMIN_KUBECONFIG \ -o jsonpath='{.data.value}' | base64 --decode | grep client-certificate-data | \ awk '{print $2}' | base64 -d | openssl x509 -text | grep Validity -A2Substitua o seguinte:
ADMIN_KUBECONFIG: o caminho do ficheiro kubeconfig do cluster de administrador.CLUSTER_NAME: o nome do cluster para o qual está a renovar os certificados.CLUSTER_NAMESPACE: o espaço de nomes do cluster para o qual está a renovar os certificados.
A resposta tem o seguinte aspeto:
Validity Not Before: Sep 17 22:27:53 2021 GMT Not After : Sep 17 22:33:16 2022 GMTO certificado kubeconfig no cluster de administrador e o certificado no ficheiro kubeconfig na estação de trabalho do administrador são iguais. Por conseguinte, o resultado deste comando e do comando do passo anterior têm de corresponder.
Renove certificados manualmente
Para renovar manualmente os certificados TLS de um cluster, siga as instruções nas secções seguintes.
Renove os certificados em cada nó do plano de controlo
Execute os seguintes passos em cada nó do plano de controlo do cluster afetado:
Faça uma cópia de segurança da pasta
/etc/kubernetes.Execute o seguinte comando
kubeadmpara renovar todos os certificados. O comando renova os certificados através das autoridades de certificação (ACs) existentes na máquina:sudo kubeadm certs renew allO resultado do comando é semelhante ao seguinte exemplo:
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed certificate for serving the Kubernetes API renewed certificate the apiserver uses to access etcd renewed certificate for the API server to connect to kubelet renewed certificate embedded in the kubeconfig file for the controller manager to use renewed certificate for liveness probes to healthcheck etcd renewed certificate for etcd nodes to communicate with each other renewed certificate for serving etcd renewed certificate for the front proxy client renewed certificate embedded in the kubeconfig file for the scheduler manager to use renewedVerifique se os certificados têm uma nova data de validade executando o seguinte comando:
sudo kubeadm certs check-expirationNem todos os componentes do plano de controlo suportam o recarregamento dinâmico de certificados. Para recolher os certificados renovados, os seguintes passos reiniciam os seguintes contentores:
kube-apiserver,etcd,kube-schedulerekube-controller-manager.Repita os seguintes passos para cada um dos quatro contentores:
Encontre o ID do contentor de cada contentor:
sudo crictl ps | grep CONTAINER_NAMESubstitua
CONTAINER_NAMEpelo nome dos seguintes contentores:kube-apiserver,etcd(nãoetcd-defrag),kube-scheduleroukube-controller-manager.A resposta é semelhante ao seguinte resultado:
c331ade490cb6 28df10594cd92 26 hours ago Running kube-apiserver ...O ID do contentor é o valor na primeira coluna.
Parar cada contentor:
sudo crictl stop CONTAINER_IDSubstitua
CONTAINER_IDpelo ID do contentor do passo anterior.Quando o contentor parado sai, o kubelet cria um novo contentor no respetivo lugar e elimina o parado. Se encontrar um erro, como
context deadline exceeded(código de erroDeadlineExceeded), volte a executar o comando.
Verifique se a conetividade foi restaurada
Os certificados do kubeadm devem ser renovados em todos os nós do plano de controlo. Se estiver a renovar certificados expirados, siga este passo:
Para validar a ligação ao servidor da API Kubernetes, execute o seguinte comando
kubectlem qualquer nó do plano de controlo:kubectl get nodes --kubeconfig /etc/kubernetes/admin.conf
A resposta deve devolver a lista de nós do cluster. Se os seus certificados forem renovados corretamente, não são devolvidos erros de TLS nem de certificado.
Atualize o segredo kubeconfig no cluster
Os passos seguintes usam os certificados renovados do ficheiro admin.conf para atualizar o segredo kubeconfig do cluster. No entanto, não é possível usar o conteúdo do ficheiro admin.conf atualizado tal como está. Primeiro, tem de fazer uma cópia do ficheiro admin.conf com algumas edições necessárias.
Para atualizar o novo kubeconfig para o segredo, execute os seguintes passos num nó do plano de controlo:
Use
sedpara substituirkubernetesno ficheiroadmin.confpelo nome do seu cluster e escreva as alterações num novo ficheiro,kubeconfig_secret.conf:sed "s/kubernetes/CLUSTER_NAME/g" \ /etc/kubernetes/admin.conf > /etc/kubernetes/kubeconfig_secret.confUse
diffpara confirmar que o ficheirokubeconfig_secret.conffoi atualizado:diff /etc/kubernetes/admin.conf /etc/kubernetes/kubeconfig_secret.confA resposta mostra todos os locais onde o ficheiro
kubeconfig_secret.confé diferente do ficheiroadmin.confatualizado. Por exemplo, se tivesse realizado o passo anterior para um cluster denominadodemo-cluster, o resultado seria semelhante ao seguinte:6c6 < name: kubernetes --- > name: demo-cluster 9,12c9,12 < cluster: kubernetes < user: kubernetes-admin < name: kubernetes-admin@kubernetes < current-context: kubernetes-admin@kubernetes --- > cluster: demo-cluster > user: demo-cluster-admin > name: demo-cluster-admin@demo-cluster > current-context: demo-cluster-admin@demo-cluster 16c16 < - name: kubernetes-admin --- > - name: demo-cluster-adminExecute os seguintes comandos para atualizar o secret kubeconfig no seu cluster:
CLUSTER_KUBECONFIG_BASE64=$(base64 /etc/kubernetes/kubeconfig_secret.conf -w 0) kubectl get secret/CLUSTER_NAME-kubeconfig \ -n CLUSTER_NAMESPACE \ --kubeconfig /etc/kubernetes/admin.conf -o json | jq \ --arg conf "${CLUSTER_KUBECONFIG_BASE64}" '.data."value" |= $conf' | kubectl apply \ --kubeconfig /etc/kubernetes/admin.conf -f -
Substitua o ficheiro kubeconfig do cluster
Para substituir o ficheiro kubeconfig do cluster por um que tenha os certificados renovados, use os seguintes passos:
Copie o ficheiro
admin.confde um dos nós do plano de controlo do cluster para a estação de trabalho do administrador.Conforme indicado nas secções anteriores, o ficheiro
admin.confencontra-se no diretórioetc/kubernetesnos nós do plano de controlo do cluster.Para criar o novo ficheiro kubeconfig, execute o seguinte comando
kubectlna estação de trabalho do administrador:kubectl --kubeconfig ADMIN_CONF_PATH get secret/CLUSTER_NAME-kubeconfig \ -n "CLUSTER_NAMESPACE" -o jsonpath='{.data.value}' | \ base64 --decode > new_kubeconfig.confSubstitua o seguinte:
ADMIN_CONF_PATH: o caminho do ficheiroadmin.confque foi copiado para a estação de trabalho do administrador a partir de um nó do plano de controlo.CLUSTER_NAME: o nome do cluster para o qual está a renovar os certificados.CLUSTER_NAMESPACE: o espaço de nomes do cluster para o qual está a renovar os certificados.
O ficheiro
new_kubeconfig.confcontém os dados do certificado atualizados.Verifique se o novo kubeconfig funciona executando qualquer comando
kubectlcom as novas credenciais:kubectl get nodes --kubeconfig new_kubeconfig.confSubstitua o conteúdo do ficheiro kubeconfig antigo guardado no diretório do cluster na estação de trabalho do administrador pelo conteúdo do novo ficheiro kubeconfig
new-kubeconfig.conf.Por predefinição, o caminho para o ficheiro de configuração do cluster é
bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig.
Valide os certificados do kubelet e reinicie o etcd-defrag
Para concluir o processo de renovação manual dos certificados do cluster, execute os seguintes passos para cada nó do plano de controlo:
Inicie sessão no nó do plano de controlo e verifique o cliente kubelet e a hora de validade do certificado de serviço executando os seguintes comandos:
Os certificados do Kubelet são rodados automaticamente, desde que o plano de controlo seja acessível. O período de renovação automática dos certificados kubelet é inferior ao período de validade dos certificados dos componentes do plano de controlo. Por conseguinte, é provável que os certificados do kubelet tenham sido renovados anteriormente:
sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text | grep Validity -A2 sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -text | grep Validity -A2O resultado de qualquer um dos comandos tem um aspeto semelhante ao seguinte exemplo:
Validity Not Before: Nov 28 18:04:57 2022 GMT Not After : Nov 28 19:04:57 2023 GMTUse o seguinte comando para reiniciar o contentor
etcd-defrag:O contentor
etcd-defragusa o certificado de clienteapiserver-etcdpara comunicar com o etcd e tem de ser reiniciado para receber os certificados atualizados.kubectl rollout restart daemonset etcd-defrag -n kube-system --kubeconfig KUBECONFIG_PATH
Depois de concluir estes passos manuais para renovar os certificados de cluster, verifique se todos os pods estão a ser executados corretamente e se não são comunicados erros de TLS para contentores do plano de controlo.
O que se segue?
Se precisar de assistência adicional, contacte o apoio ao cliente do Google Cloud. Também pode consultar o artigo Receber apoio técnico para mais informações sobre recursos de apoio técnico, incluindo o seguinte:
- Requisitos para abrir um registo de apoio ao cliente.
 - Ferramentas para ajudar a resolver problemas, como a configuração do ambiente, os registos e as métricas.
 - Componentes suportados.