Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-11-28 GMT+08:00

Antes de começar

Antes da atualização, você pode verificar se o cluster pode ser atualizado e quais versões estão disponíveis no console do CCE. Para mais detalhes, consulte Visão geral de atualização.

Precauções

Antes de atualizar um cluster, preste atenção aos seguintes pontos:

  • A atualização de um cluster não pode ser revertida. Realize uma atualização no momento adequado para minimizar o impacto em seus serviços. Para garantir a segurança dos dados, faça backup de seus dados antes de uma atualização.
  • Antes de atualizar um cluster, garanta que nenhuma operação de alto risco seja executada no cluster. Caso contrário, a atualização de cluster poderá falhar ou a configuração poderá ser perdida após a atualização. As operações comuns de alto risco incluem a modificação local das configurações de nós do cluster e a modificação das configurações dos ouvintes gerenciados pelo CCE no console do ELB. Em vez disso, modifique configurações no console do CCE para que as modificações possam ser herdadas automaticamente durante a atualização.
  • Antes de atualizar um cluster, verifique se o cluster está funcionando corretamente. Se o cluster não estiver funcionando corretamente, corrija a falha. Se a falha persistir, envie um tíquete de serviço para obter assistência.
  • Antes de atualizar um cluster, saiba mais sobre os recursos e as diferenças de cada versão de cluster em Observações de versão do Kubernetes para evitar exceções devido ao uso de uma versão de cluster incompatível. Por exemplo, verifique se alguma API preterida na versão de destino é usada no cluster. Caso contrário, chamar as APIs pode falhar após a atualização. Para mais detalhes, consulte APIs preteridas.

Durante uma atualização de cluster, preste atenção aos seguintes pontos que podem afetar seus serviços:

  • Durante uma atualização de cluster, não execute nenhuma operação no cluster. Não interrompa, reinicie ou exclua nós durante a atualização do cluster. Caso contrário, a atualização falhará.
  • Durante uma atualização de cluster, as cargas de trabalho em execução não serão interrompidas, mas o acesso ao servidor da API será temporariamente interrompido.
  • Durante uma atualização de cluster, a mancha node.kubernetes.io/upgrade (equivalente a NoSchedule) será adicionada aos nós no cluster. A mancha será removida depois que o cluster for atualizado. Não adicione manchas com o mesmo nome de chave em um nó. Mesmo que as manchas tenham efeitos diferentes, elas podem ser excluídas pelo sistema por engano após a atualização.

Restrições

  • Os clusters do CCE e os clusters do CCE Turbo com nós de VM podem ser atualizados.
  • Se houver nós criados usando uma imagem privada, o cluster não poderá ser atualizado.
  • Depois que o cluster for atualizado, se a vulnerabilidade em contêiner do mecanismo de contêiner for corrigida nas Observações de versão do Kubernetes, reinicie manualmente o contêiner para que a atualização entre em vigor. O mesmo se aplica aos pods existentes.
  • Se você montar o arquivo docker.sock em um nó em um pod usando o modo hostPath, ou seja, o Docker no cenário Docker, o Docker será reiniciado durante a atualização, mas o arquivo docker.sock não será alterado. Como resultado, seus serviços podem não funcionar corretamente. É aconselhável montar o arquivo docker.sock montando o diretório.
  • Quando os clusters que usam o modelo de rede de túnel são atualizados para v1.19.16-r4, v1.21.7-r0, v1.23.5-r0, v1.25.1-r0 ou posterior, a regra SNAT cujo endereço de destino é o bloco CIDR do contêiner, mas o endereço de origem não é o bloco CIDR do contêiner será removido. Se você configurou as rotas da VPC para acessar diretamente todos os pods fora do cluster, somente os pods nos nós correspondentes poderão ser acessados diretamente após a atualização.

APIs preteridas

Com a evolução das APIs do Kubernetes, as APIs são periodicamente reorganizadas ou atualizadas, e as APIs anteriores são preteridas e finalmente excluídas. As tabelas a seguir listam as APIs preteridas em cada versão da comunidade do Kubernetes. Para obter detalhes sobre mais APIs preteridas, consulte Guia de migração de APIs preteridas.

Quando uma API é preterida, os recursos existentes não são afetados. No entanto, quando você criar ou editar os recursos, a versão da API será interceptada.

Tabela 1 APIs preteridas no Kubernetes v1.25

Nome do recurso

Versão da API preterida

Versão da API substituta

Descrição de mudança

CronJob

batch/v1beta1

batch/v1

(Esta API está disponível desde a v1.21.)

Nenhuma

EndpointSlice

discovery.k8s.io/v1beta1

discovery.k8s.io/v1

(Esta API está disponível desde a v1.21.)

Preste atenção às seguintes mudanças:

  • Em cada ponto de extremidade, o campo topology["kubernetes.io/hostname"] foi preterido. Substitua-o pelo campo nodeName.
  • Em cada ponto de extremidade, o campo topology["kubernetes.io/zone"] foi preterido. Substitua-o pelo campo zone.
  • O campo topology é substituído por deprecatedTopology e não pode ser gravado em v1.

Event

events.k8s.io/v1beta1

events.k8s.io/v1

(Esta API está disponível desde a v1.19.)

Preste atenção às seguintes mudanças:

  • O campo type só pode ser definido como Normal ou Warning.
  • O campo involvedObject é renomeado a regarding.
  • Os campos action, reason, reportingController e reportingInstance são obrigatórios para criar um novo evento events.k8s.io/v1.
  • Use eventTime em vez do campo firstTimestamp obsoleto (este campo foi renomeado como deprecatedFirstTimestamp e não tem permissão para aparecer no novo objeto de evento events.k8s.io/v1).
  • Use series.lastObservedTimee em vez do campo obsoleto lastTimestamp (este campo foi renomeado como deprecatedLastTimestamp e não pode aparecer no novo objeto de evento events.k8s.io/v1).
  • Use series.count em vez do campo obsoleto count (este campo foi renomeado como deprecatedCount e não pode aparecer no novo objeto de evento events.k8s.io/v1).
  • Use reportingController em vez do campo obsoleto source.component (esse campo foi renomeado como deprecatedSource.component e não tem permissão para aparecer no novo objeto de evento events.k8s.io/v1).
  • Use reportingInstance em vez do campo obsoleto source.host (este campo foi renomeado como deprecatedSource.host e não pode aparecer no novo objeto de evento events.k8s.io/v1).

HorizontalPodAutoscaler

autoscaling/v2beta1

autoscaling/v2

(Esta API está disponível desde a v1.23.)

Nenhuma

PodDisruptionBudget

policy/v1beta1

policy/v1

(Esta API está disponível desde a v1.21.)

Se spec.selector for definido como nulo ({}) em PodDisruptionBudget de policy/v1, todos os pods no namespace serão selecionados. (Em policy/v1beta1, um spec.selector vazio significa que nenhum pod será selecionado.) Se spec.selector não for especificado, pod será selecionado em nenhuma das versões da API.

PodSecurityPolicy

policy/v1beta1

Nenhuma

Desde a v1.25, o recurso PodSecurityPolicy não fornece mais APIs da versão policy/v1beta1, e o controlador de acesso de PodSecurityPolicy é excluído.

Substitua-o por Configuração de admissão de segurança do pod.

RuntimeClass

node.k8s.io/v1beta1

node.k8s.io/v1 (Esta API está disponível desde a v1.20.)

Nenhuma

Tabela 2 APIs preteridas no Kubernetes v1.22

Nome do recurso

Versão da API preterida

Versão da API substituta

Descrição de mudança

MutatingWebhookConfiguration

ValidatingWebhookConfiguration

admissionregistration.k8s.io/v1beta1

admissionregistration.k8s.io/v1

(Esta API está disponível desde a v1.16.)

  • O valor padrão de webhooks[*].failurePolicy é alterado de Ignore para Fail na v1.
  • O valor padrão de webhooks[*].matchPolicy é alterado de Exact para Equivalent na v1.
  • O valor padrão de webhooks[*].timeoutSeconds é alterado de 30s para 10s na v1.
  • O valor padrão de webhooks[*].sideEffects é excluído e esse campo deve ser especificado. Na v1, o valor só pode ser None ou NoneOnDryRun.
  • O valor padrão de webhooks[*].admissionReviewVersions é excluído. Na v1, este campo deve ser especificado. (Há suporte para AdmissionReview v1 e v1beta1.)
  • webhooks[*].name deve ser único na lista de objetos criados por meio de admissionregistration.k8s.io/v1.

CustomResourceDefinition

apiextensions.k8s.io/v1beta1

apiextensions/v1

(Esta API está disponível desde a v1.16.)

  • O valor padrão de spec.scope não é mais Namespaced. Este campo deve ser explicitamente especificado.
  • spec.version é excluído da v1. Use spec.versions em vez disso.
  • spec.validation é excluído da v1. Use spec.versions[*].schema em vez disso.
  • spec.subresources é excluído da v1. Use spec.versions[*].subresources em vez disso.
  • spec.additionalPrinterColumns é excluído da v1. Use spec.versions[*].additionalPrinterColumns em vez disso.
  • spec.conversion.webhookClientConfig é movido para spec.conversion.webhook.clientConfig na v1.
  • spec.conversion.conversionReviewVersions é movido para spec.conversion.webhook.conversionReviewVersions na v1.
  • spec.versions[*].schema.openAPIV3Schema torna-se um campo obrigatório quando o objeto CustomResourceDefinition da versão v1 é criado, e seu valor deve ser um esquema estrutural.
  • spec.preserveUnknownFields: true não pode ser especificado quando o objeto CustomResourceDefinition da versão v1 é criado. Essa configuração deve ser especificada usando x-kubernetes-preserve-unknown-fields: true na definição do esquema.
  • Na v1, o campo JSONPath na entrada de additionalPrinterColumns é renomeado como jsonPath (patch #66531).

APIService

apiregistration/v1beta1

apiregistration.k8s.io/v1

(Esta API está disponível desde a v1.10.)

Nenhuma

TokenReview

authentication.k8s.io/v1beta1

authentication.k8s.io/v1

(Esta API está disponível desde a v1.6.)

Nenhuma

LocalSubjectAccessReview

SelfSubjectAccessReview

SubjectAccessReview

SelfSubjectRulesReview

authorization.k8s.io/v1beta1

authorization.k8s.io/v1

(Esta API está disponível desde a v1.16.)

spec.group foi renomeado spec.groups na v1 (patch #32709).

CertificateSigningRequest

certificates.k8s.io/v1beta1

certificates.k8s.io/v1

(Esta API está disponível desde a v1.19.)

Preste atenção às seguintes alterações em certificates.k8s.io/v1:
  • Para um cliente de API que solicita um certificado:
    • spec.signerName se torna um campo obrigatório (consulte Signatários conhecidos do Kubernetes). Além disso, a API certificates.k8s.io/v1 não pode ser usada para criar solicitações cujo signatário seja kubernetes.io/legacy-unknown.
    • spec.usages agora se torna um campo obrigatório, que não pode conter valores de cadeia duplicados e pode conter apenas strings de uso conhecidas.
  • Para um cliente de API que precisa aprovar ou assinar um certificado:
    • status.conditions não pode conter tipos duplicados.
    • O campo status.conditions[*].status agora é obrigatório.
    • O status.certificate deve ser codificado pelo PEM e pode conter apenas o bloco de dados CERTIFICATE.

Lease

coordination.k8s.io/v1beta1

coordination.k8s.io/v1

(Esta API está disponível desde a v1.14.)

Nenhuma

Ingress

networking.k8s.io/v1beta1

extensions/v1beta1

networking.k8s.io/v1

(Esta API está disponível desde a v1.19.)

  • O campo spec.backend é renomeado spec.defaultBackend.
  • O campo serviceName do back-end é renomeado service.name.
  • O campo servicePort de back-end representado por um número é renomeado service.port.number.
  • O campo servicePort de back-end representado por uma cadeia é renomeado service.port.name.
  • O campo pathType é obrigatório para que todos os caminhos sejam especificados. As opções são Prefix, Exact e ImplementationSpecific. Para corresponder ao comportamento de não definir o tipo de caminho em v1beta1, use ImplementationSpecific.

IngressClass

networking.k8s.io/v1beta1

networking.k8s.io/v1

(Esta API está disponível desde a v1.19.)

Nenhuma

ClusterRole

ClusterRoleBinding

Role

RoleBinding

rbac.authorization.k8s.io/v1beta1

rbac.authorization.k8s.io/v1

(Esta API está disponível desde a v1.8.)

Nenhuma

PriorityClass

scheduling.k8s.io/v1beta1

scheduling.k8s.io/v1

(Esta API está disponível desde a v1.14.)

Nenhuma

CSIDriver

CSINode

StorageClass

VolumeAttachment

storage.k8s.io/v1beta1

storage.k8s.io/v1

  • CSIDriver está disponível em storage.k8s.io/v1 desde a v1.19.
  • CSINode está disponível em storage.k8s.io/v1 desde a v1.17.
  • StorageClass está disponível em storage.k8s.io/v1 desde a v1.6.
  • VolumeAttachment está disponível em storage.k8s.io/v1 desde a v1.13.
Tabela 3 APIs preteridas no Kubernetes v1.16

Nome do recurso

Versão da API preterida

Versão da API substituta

Descrição de mudança

NetworkPolicy

extensions/v1beta1

networking.k8s.io/v1

(Esta API está disponível desde a v1.8.)

Nenhuma

DaemonSet

extensions/v1beta1

apps/v1beta2

apps/v1

(Esta API está disponível desde a v1.9.)

  • O campo spec.templateGeneration é excluído.
  • spec.selector agora é um campo obrigatório e não pode ser alterado após a criação do objeto. O rótulo de um modelo existente pode ser usado como um seletor para migração perfeita.
  • O valor padrão de spec.updateStrategy.type é alterado para RollingUpdate (o valor padrão na versão da API extensions/v1beta1 é OnDelete).

Deployment

extensions/v1beta1

apps/v1beta1

apps/v1beta2

apps/v1

(Esta API está disponível desde a v1.9.)

  • O campo spec.rollbackTo é excluído.
  • spec.selector agora é um campo obrigatório e não pode ser alterado após a criação da Implementação. O rótulo de um modelo existente pode ser usado como um seletor para migração perfeita.
  • O valor padrão de spec.progressDeadlineSeconds é alterado para 600 segundos (o valor padrão em extensions/v1beta1 é ilimitado).
  • O valor padrão de spec.revisionHistoryLimit é alterado para 10. (Na versão da API apps/v1beta1, o valor padrão desse campo é 2. Na versão da API extensions/v1beta1, todos os registros históricos são mantidos por padrão.)
  • Os valores padrão de maxSurge e maxUnavailable são alterados para 25%. (Na versão da API extensions/v1beta1, esses campos têm como padrão 1.)

StatefulSet

apps/v1beta1

apps/v1beta2

apps/v1

(Esta API está disponível desde a v1.9.)

  • spec.selector agora é um campo obrigatório e não pode ser alterado após a criação do StatefulSet. O rótulo de um modelo existente pode ser usado como um seletor para migração perfeita.
  • O valor padrão de spec.updateStrategy.type é alterado para RollingUpdate (O valor padrão na versão da API apps/v1beta1 é OnDelete).

ReplicaSet

extensions/v1beta1

apps/v1beta1

apps/v1beta2

apps/v1

(Esta API está disponível desde a v1.9.)

spec.selector agora é um campo obrigatório e não pode ser alterado após a criação do objeto. O rótulo de um modelo existente pode ser usado como um seletor para migração perfeita.

PodSecurityPolicy

extensions/v1beta1

policy/v1beta1

(Esta API está disponível desde a v1.10.)

PodSecurityPolicy para a versão da API policy/v1beta1 será removida na v1.25.

Diferenças entre versões

Caminho de atualização

Diferença entre versões

Auto-verificação

v1.19 a v1.21

O bug de exec probe timeouts foi corrigido no Kubernetes 1.21. Antes que esse bug seja corrigido, a sonda exec não considera o campo timeoutSeconds. Em vez disso, a sonda será executada indefinidamente, mesmo após o data limite configurado. Ela irá parar até que o resultado seja retornado. Se este campo não for especificado, o valor padrão 1 será usado. Este campo entra em vigor após a atualização. Se a sonda for executada por mais de 1 segundo, a verificação de integridade da aplicação poderá falhar e a aplicação poderá ser reiniciada com frequência.

Antes do upgrade, verifique se o tempo limite está configurado corretamente para a sonda exec.

O kube-apiserver do CCE 1.19 ou posterior requer que o campo Subject Alternative Names (SANs) esteja configurado para o certificado do servidor webhook. Caso contrário, kube-apiserver falha ao chamar o servidor webhook após a atualização, e os contêineres não podem ser iniciados corretamente.

Causa raiz: X.509 CommonName é descartado em Go 1.15. kube-apiserver do CCE 1.19 é compilado usando Go 1.15. Se o seu certificado webhook não tiver SANs, kube-apiserver não processa o campo CommonName do certificado X.509 como o nome de host por padrão. Como resultado, a autenticação falha.

Antes da atualização, verifique se o campo SAN está configurado no certificado do servidor webhook.

  • Se você não tem seu próprio servidor webhook, você pode pular esta verificação.
  • Se o campo não estiver definido, é aconselhável usar o campo SAN para especificar o endereço IP e o nome de domínio suportados pelo certificado.

v1.15 a v1.19

O plano de controle de clusters do CCE de v1.19 é incompatível com kubelet v1.15. Se um nó não for atualizado ou o nó a ser atualizado for reiniciado após o nó principal ser atualizado com sucesso, há uma alta probabilidade de que o nó esteja no status NotReady.

Isso ocorre porque o nó falhou ao ser atualizado reinicia o kubelet e aciona o registro do nó. Em clusters de v1.15, as tags de registro padrão (failure-domain.beta.kubernetes.io/is-baremetal e kubernetes.io/availablezone) são consideradas tags inválidas pelo cluster da v1.19.

As tags válidas nos clusters da v1.19 são node.kubernetes.io/baremetal e failure-domain.beta.kubernetes.io/zone.

  1. Em casos normais, esse cenário não é acionado.
  2. Depois que o nó principal for atualizado, não suspenda a atualização para que o nó possa ser atualizado rapidamente.
  3. Se um nó não for atualizado e não puder ser restaurado, expulse aplicações no nó o mais rápido possível. Entre em contato com o suporte técnico e pule a atualização do nó. Após a conclusão da atualização, redefina o nó.

Nos clusters do CCE 1.15 e 1.19, o sistema de arquivos do driver de armazenamento Docker é alterado de XFS para Ext4. Como resultado, a sequência de pacote de importação nos pods da aplicação Java atualizado pode ser anormal, causando exceções de pod.

Antes da atualização, verifique o arquivo de configuração do Docker /etc/docker/daemon.json no nó. Verifique se o valor de dm.fs é xfs.

  • Se o valor for ext4 ou o driver de armazenamento for Overlay, você poderá ignorar as próximas etapas.
  • Se o valor for xfs, é aconselhável implementar aplicações no cluster da nova versão com antecedência para testar se os aplicativos são compatíveis com a nova versão do cluster.
{
      "storage-driver": "devicemapper",
      "storage-opts": [
      "dm.thinpooldev=/dev/mapper/vgpaas-thinpool",
      "dm.use_deferred_removal=true",
      "dm.fs=xfs",
      "dm.use_deferred_deletion=true"
      ]
}

O kube-apiserver do CCE 1.19 ou posterior requer que o campo Subject Alternative Names (SANs) esteja configurado para o certificado do servidor webhook. Caso contrário, kube-apiserver falha ao chamar o servidor webhook após a atualização, e os contêineres não podem ser iniciados corretamente.

Causa raiz: X.509 CommonName é descartado em Go 1.15. kube-apiserver do CCE 1.19 é compilado usando Go 1.15. O campo CommonName é processado como o nome do host. Como resultado, a autenticação falha.

Antes da atualização, verifique se o campo SAN está configurado no certificado do servidor webhook.

  • Se você não tem seu próprio servidor webhook, você pode pular esta verificação.
  • Se o campo não estiver definido, é aconselhável usar o campo SAN para especificar o endereço IP e o nome de domínio suportados pelo certificado.
AVISO:

Para mitigar o impacto das diferenças de versão na atualização do cluster, o CCE executa um processamento especial durante a atualização de 1.15 para 1.19 e ainda oferece suporte a certificados sem SANs. No entanto, nenhum processamento especial é necessário para atualizações subsequentes. Aconselha-se que retifique o seu certificado o mais rapidamente possível.

Em clusters da v1.17.17 e posteriores, o CCE cria automaticamente políticas de segurança de pods (PSPs) para você, o que restringe a criação de pods com configurações inseguras, por exemplo, pods para os quais net.core.somaxconn sob um sysctl é configurado no contexto de segurança.

Após uma atualização, você pode permitir configurações inseguras do sistema, conforme necessário. Para mais detalhes, consulte Configuração de uma política de segurança de pod.

Se initContainer ou Istio for usado na atualização in-loco de um cluster v1.15, preste atenção às seguintes restrições:

No kubelet 1.16 e versões posteriores, as classes de QoS são diferentes daquelas em versões anteriores. No kubelet 1.15 e versões anteriores, somente contêineres em spec.containers são contados. No kubelet 1.16 e versões posteriores, os contêineres em spec.containers e spec.initContainers são contados. A classe de QoS de um pod mudará após a atualização. Como resultado, o contêiner no pod é reiniciado.

É aconselhável modificar a classe de QoS do contêiner de serviço antes da atualização para evitar esse problema. Para mais detalhes, consulte Tabela 4.

v1.13 a v1.15

Depois que um cluster de rede da VPC é atualizado, o nó principal ocupa um bloco CIDR extra devido à atualização dos componentes de rede. Se nenhum bloco CIDR de contêiner estiver disponível para o novo nó, o pod agendado para o nó não poderá ser executado.

Geralmente, esse problema ocorre quando os nós no cluster estão prestes a ocupar totalmente o bloco CIDR do contêiner. Por exemplo, o bloco CIDR do contêiner é 10.0.0.0/16, o número de endereços IP disponíveis é 65.536 e a rede da VPC recebe um bloco CIDR com o tamanho fixo (usando a máscara para determinar o número máximo de endereços IP de contêiner alocados para cada nó). Se o limite superior for 128, o cluster suportará um máximo de 512 (65536/128) nós, incluindo os três nós principais. Depois que o cluster é atualizado, cada um dos três nós principais ocupa um bloco CIDR. Como resultado, 506 nós são suportados.

Tabela 4 Mudanças de classe de QoS antes e depois da atualização

Init contêiner (calculado com base em spec.initContainers)

Contêiner de serviço (calculado com base em spec.containers)

Pod (calculado com base em spec.containers e spec.initContainers)

Impactado ou não

Guaranteed

Besteffort

Burstable

Sim

Guaranteed

Burstable

Burstable

Não

Guaranteed

Guaranteed

Guaranteed

Não

Besteffort

Besteffort

Besteffort

Não

Besteffort

Burstable

Burstable

Não

Besteffort

Guaranteed

Burstable

Sim

Burstable

Besteffort

Burstable

Sim

Burstable

Burstable

Burstable

Não

Burstable

Guaranteed

Burstable

Sim

Atualizar backup

Como fazer backup de um nó:

  • Backup do banco de dados etcd: o CCE faz backup automaticamente do banco de dados etcd durante a atualização do cluster.
  • Backup de nó principal (recomendado, confirmação manual necessária): na página de confirmação da atualização, clique em Backup para fazer backup de todo o nó principal do cluster. O processo de backup usa o serviço Cloud Backup and Recovery (CBR) e leva cerca de 20 minutos. Se houver muitas tarefas de backup de nuvem no site atual, o tempo de backup pode ser prolongado