44 Ações de ciclo de vida #
Esta seção aborda as ações de gerenciamento de ciclo de vida para clusters implantados pelo SUSE Telco Cloud.
44.1 Exclusão de balanceador de carga #
Há muitas ações de ciclo de vida que exigem drenagem dos nós. Durante o processo de drenagem, todos os pods são removidos para outros nós no cluster. Após o término do processo de drenagem, o nó não hospedará nenhum serviço e, portanto, nenhum tráfego deverá ser roteado para ele. É possível fazer com que os balanceadores de carga, como MetalLB, reconheçam isso aplicando um rótulo ao nó:
node.kubernetes.io/exclude-from-external-load-balancers: "true"Para obter mais detalhes, consulte: Documentação do Kubernetes.
Para ver os rótulos em todos os nós em um cluster, execute:
kubectl get nodes -o json | jq -r '.items[].metadata | .name, .labels'No caso de upgrades de clusters downstream, isso pode ser automatizado anotando o RKE2ControlPlane no cluster de gerenciamento:
rke2.controlplane.cluster.x-k8s.io/load-balancer-exclusion="true"Essa ação cria imediatamente uma anotação em todos os objetos de máquina no cluster de gerenciamento para esse RKE2ControlPlane.
pre-drain.delete.hook.machine.cluster.x-k8s.io/rke2-lb-exclusion: ""Com essa anotação nos objetos de máquina, qualquer nó no cluster downstream que esteja programado para drenagem receberá o rótulo do nó acima como anexo antes de iniciar o processo de drenagem. O rótulo será removido do nó assim que estiver disponível e pronto novamente.
44.2 Upgrades de cluster de gerenciamento #
O upgrade do cluster de gerenciamento está descrito na documentação do
cluster de gerenciamento do Dia 2 (Capítulo 36, Cluster de gerenciamento).
44.3 Upgrades de cluster downstream #
O upgrade de clusters downstream envolve a atualização de vários componentes. As seções a seguir abordam o processo de upgrade de cada um deles.
Fazendo upgrade do sistema operacional
Para este processo, consulte a seguinte referência (Seção 43.2, “Preparar uma imagem de cluster downstream para cenários conectados”) para criar uma imagem com uma nova
versão do sistema operacional. Com essa imagem gerada pelo
EIB, a próxima fase de provisionamento usará a nova
versão do sistema operacional fornecida. Na etapa seguinte, a nova imagem
será usada para fazer upgrade dos nós.
Fazendo upgrade do cluster RKE2
As alterações necessárias para fazer upgrade do cluster
RKE2 usando o fluxo de trabalho automatizado são as
seguintes:
Altere o bloco
RKE2ControlPlanenocapi-provisioning-example.yamlmostrado na seguinte seção (Seção 43.4, “Provisionamento de cluster downstream com provisionamento de rede direcionado (nó único)”):Especifique a
rolloutStrategydesejada.Altere a versão do cluster
RKE2para a nova versão, substituindo${RKE2_NEW_VERSION}.
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: RKE2ControlPlane
metadata:
name: single-node-cluster
namespace: default
spec:
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3MachineTemplate
name: single-node-cluster-controlplane
version: ${RKE2_NEW_VERSION}
replicas: 1
rolloutStrategy:
type: "RollingUpdate"
rollingUpdate:
maxSurge: 0
serverConfig:
cni: cilium
rolloutStrategy:
rollingUpdate:
maxSurge: 0
registrationMethod: "control-plane-endpoint"
agentConfig:
format: ignition
additionalUserData:
config: |
variant: fcos
version: 1.4.0
systemd:
units:
- name: rke2-preinstall.service
enabled: true
contents: |
[Unit]
Description=rke2-preinstall
Wants=network-online.target
Before=rke2-install.service
ConditionPathExists=!/run/cluster-api/bootstrap-success.complete
[Service]
Type=oneshot
User=root
ExecStartPre=/bin/sh -c "mount -L config-2 /mnt"
ExecStart=/bin/sh -c "sed -i \"s/BAREMETALHOST_UUID/$(jq -r .uuid /mnt/openstack/latest/meta_data.json)/\" /etc/rancher/rke2/config.yaml"
ExecStart=/bin/sh -c "echo \"node-name: $(jq -r .name /mnt/openstack/latest/meta_data.json)\" >> /etc/rancher/rke2/config.yaml"
ExecStartPost=/bin/sh -c "umount /mnt"
[Install]
WantedBy=multi-user.target
kubelet:
extraArgs:
- provider-id=metal3://BAREMETALHOST_UUID
nodeName: "localhost.localdomain"Altere o bloco
Metal3MachineTemplatenocapi-provisioning-example.yamlmostrado na seguinte seção (Seção 43.4, “Provisionamento de cluster downstream com provisionamento de rede direcionado (nó único)”):Altere o nome e o checksum da imagem para a nova versão gerada na etapa anterior.
Adicione a diretiva
nodeReuseatruepara evitar a criação de um novo nó.Adicione a diretiva
automatedCleaningModeametadatapara habilitar a limpeza automatizada do nó.
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: Metal3MachineTemplate
metadata:
name: single-node-cluster-controlplane
namespace: default
spec:
nodeReuse: True
template:
spec:
automatedCleaningMode: metadata
dataTemplate:
name: single-node-cluster-controlplane-template
hostSelector:
matchLabels:
cluster-role: control-plane
image:
checksum: http://imagecache.local:8080/${NEW_IMAGE_GENERATED}.sha256
checksumType: sha256
format: raw
url: http://imagecache.local:8080/${NEW_IMAGE_GENERATED}.rawAntes de aplicar o arquivo
capi-provisioning-example.yaml, é sempre recomendável
informar aos balanceadores de carga externos (ex. MetalLB) sobre os nós que
estão sendo drenados, assim eles não roteiam tráfego para os nós nesse
estado. Conforme mencionado na Seção 44.1, “Exclusão de balanceador de carga”,
você pode automatizar esse processo anotando o RKE2ControlPlane no cluster
de gerenciamento. Neste exemplo, um objeto no RKE2ControlPlane chamado
multinode-cluster foi anotado:
kubectl annotate RKE2ControlPlane/multinode-cluster rke2.controlplane.cluster.x-k8s.io/load-balancer-exclusion="true"Verifique se os objetos de máquina foram anotados:
pre-drain.delete.hook.machine.cluster.x-k8s.io/rke2-lb-exclusion: ""Busque as anotações em todos os objetos de máquina:
kubectl get machines -o json | jq -r '.items[].metadata | .name, .annotations'Sem essas anotações, os usuários poderão enfrentar tempos de resposta mais longos dos serviços já que os balanceadores de carga não foram informados sobre os nós drenados.
Depois de fazer essas alterações, o arquivo
capi-provisioning-example.yaml poderá ser aplicado ao
cluster usando o seguinte comando:
kubectl apply -f capi-provisioning-example.yaml