Os clusters registrados do ACK One permitem conectar clusters Kubernetes locais ou de terceiros à plataforma de contêineres da Alibaba Cloud para gerenciamento unificado e operações de nuvem híbrida. Se a capacidade de computação local for limitada, expanda com pools de nós na nuvem usando ECS. Este tópico explica como criar scripts personalizados para pools de nós na nuvem.
Pré-requisitos
Antes de começar:
Um cluster registrado no ACK One com um cluster Kubernetes externo conectado.
A rede do cluster Kubernetes externo deve estar conectada à VPC do cluster registrado no ACK One.
A configuração de proxy do cluster Kubernetes externo deve ter sido importada para o cluster registrado no ACK One (modo de rede privada).
Limitações
Os scripts de exemplo suportam apenas sistemas operacionais que usam YUM (Yellowdog Updater, Modified) como gerenciador de pacotes.
Os scripts de exemplo aplicam-se somente a nós ECS comuns. Para nós acelerados por GPU, envie um ticket à equipe de P&D para obter um script personalizado.
Nós acelerados por GPU exigem drivers e plug-ins de dispositivo. Consulte Atualizar manualmente o driver NVIDIA de um nó .
Visão geral
O processo consiste em três etapas:
Preparar o script do nó: adapte um script personalizado existente ou use um modelo de exemplo.
Carregar o script em um servidor de arquivos acessível ao cluster registrado.
Registrar o caminho do script no ConfigMap
ack-agent-configpara recuperação durante a expansão.
Escolha o procedimento adequado para a etapa 1:
|
Situação |
Ação |
|
Script de bootstrap existente |
Siga a Etapa 1(A): adicione as variáveis de ambiente necessárias da Alibaba Cloud |
|
Nenhum script de bootstrap existente |
Siga a Etapa 1(B): baixe e personalize um exemplo |
Etapa 1(A): Adicionar variáveis de ambiente da Alibaba Cloud a um script existente
O cluster registrado injeta quatro variáveis de ambiente durante a expansão para gerenciar o pool de nós.
A variável ALIBABA_CLOUD_PROVIDER_ID é obrigatória para o funcionamento do cluster registrado. Sem ela no script, o cluster não opera normalmente.
Variáveis de ambiente:
|
Variável |
Obrigatória |
Efeito se ausente |
Valor de exemplo |
|
|
Sim |
O cluster registrado não funciona normalmente |
|
|
|
Sim |
Os nós podem entrar em estado anormal |
|
|
|
Sim |
O gerenciamento do pool de nós e o agendamento de cargas de trabalho podem falhar |
alibabacloud.com/nodepool-id=np0e2031e952c4492bab32f512ce142,ack.aliyun.com=cc3df6d939b0d4463b493b82d0d670,alibabacloud.com/instance-id=i-wz960ockeekr3dok0***,alibabacloud.com/external=true,workload=cpu |
|
|
Sim |
Os taints do pool de nós não entram em vigor |
|
EmALIBABA_CLOUD_LABELS, apenasworkload=cpué personalizado (definido na configuração do pool de nós). Todos os outros rótulos são de sistema.
Adicione o bloco de injeção de variáveis conforme o método de instalação do cluster.
Cluster criado com kubeadm
Insira este bloco após a configuração principal do nó e antes de reiniciar o kubelet.
####### Begin: Alibaba Cloud environment variable injection
# Configure node labels, taints, node name, and provider ID.
KUBELET_CONFIG_FILE="/etc/sysconfig/kubelet"
if [[ $ALIBABA_CLOUD_LABELS != "" ]];then
option="--node-labels"
if grep -- "${option}=" $KUBELET_CONFIG_FILE /dev/null;then
sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_LABELS},@g" $KUBELET_CONFIG_FILE
elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE /dev/null;then
sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_LABELS} @g" $KUBELET_CONFIG_FILE
else
sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_LABELS}\"" $KUBELET_CONFIG_FILE
fi
fi
if [[ $ALIBABA_CLOUD_TAINTS != "" ]];then
option="--register-with-taints"
if grep -- "${option}=" $KUBELET_CONFIG_FILE /dev/null;then
sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_TAINTS},@g" $KUBELET_CONFIG_FILE
elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE /dev/null;then
sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_TAINTS} @g" $KUBELET_CONFIG_FILE
else
sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_TAINTS}\"" $KUBELET_CONFIG_FILE
fi
fi
if [[ $ALIBABA_CLOUD_NODE_NAME != "" ]];then
option="--hostname-override"
if grep -- "${option}=" $KUBELET_CONFIG_FILE /dev/null;then
sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_NODE_NAME},@g" $KUBELET_CONFIG_FILE
elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE /dev/null;then
sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_NODE_NAME} @g" $KUBELET_CONFIG_FILE
else
sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_NODE_NAME}\"" $KUBELET_CONFIG_FILE
fi
fi
if [[ $ALIBABA_CLOUD_PROVIDER_ID != "" ]];then
option="--provider-id"
if grep -- "${option}=" $KUBELET_CONFIG_FILE /dev/null;then
sed -i "s@${option}=@${option}=${ALIBABA_CLOUD_PROVIDER_ID},@g" $KUBELET_CONFIG_FILE
elif grep "KUBELET_EXTRA_ARGS=" $KUBELET_CONFIG_FILE /dev/null;then
sed -i "s@KUBELET_EXTRA_ARGS=@KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_PROVIDER_ID} @g" $KUBELET_CONFIG_FILE
else
sed -i "/^\[Service\]/a\Environment=\"KUBELET_EXTRA_ARGS=${option}=${ALIBABA_CLOUD_PROVIDER_ID}\"" $KUBELET_CONFIG_FILE
fi
fi
####### End: Alibaba Cloud environment variable injection
Prossiga para a Etapa 2: Carregar o script.
Cluster instalado com arquivos binários
Para clusters instalados com arquivos binários do Kubernetes, modifique a configuração de inicialização do kubelet. O arquivo kubelet.service geralmente reside em /usr/lib/systemd/system/.
cat /usr/lib/systemd/system/kubelet.service EOF
# Custom configurations are not shown.
...
[Service]
ExecStart=/data0/kubernetes/bin/kubelet \
# Add the following flags:
--node-ip=${ALIBABA_CLOUD_NODE_NAME} \
--hostname-override=${ALIBABA_CLOUD_NODE_NAME} \
--node-labels=${ALIBABA_CLOUD_LABELS} \
--provider-id=${ALIBABA_CLOUD_PROVIDER_ID} \
--register-with-taints=${ALIBABA_CLOUD_TAINTS} \
....
--v=4
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
Prossiga para a Etapa 2: Carregar o script.
Etapa 1(B): Usar um script de exemplo
Caso não exista um script de bootstrap, utilize um dos exemplos abaixo. Os modelos abrangem Docker e containerd.
Coletar os valores necessários
Reúna três valores do seu cluster externo:
Etapa 1: Obter a versão do Kubernetes
Obtenha a versão do Kubernetes:
Para Kubernetes 1.18 ou posterior (use o rótulo control-plane):
kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/control-plane -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.kubeletVersion'
Para versões anteriores ao Kubernetes 1.18 (use o rótulo master):
kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/master -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.kubeletVersion'
Saída esperada:
v1.14.10
Salve o valor como KUBE_VERSION.
Etapa 2: Obter o runtime de contêiner e a versão
Para Kubernetes 1.18 ou posterior:
kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/control-plane -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.containerRuntimeVersion'
Para versões anteriores ao Kubernetes 1.18:
kubectl get no $(kubectl get nodes -l node-role.kubernetes.io/master -o json | jq -r '.items[0].metadata.name') -o json | jq -r '.status.nodeInfo.containerRuntimeVersion'
Saída esperada:
docker://18.6.3 # Docker runtime
containerd://1.4.3 # containerd runtime
Salve o número da versão (sem o prefixo docker:// ou containerd://) como RUNTIME_VERSION.
Etapa 3: Gerar o comando kubeadm join
A flag --ttl 0 é obrigatória. Sem ela, o token de associação expira e o Auto Scaling para de funcionar.
kubeadm token create --ttl 0 --print-join-command
Saída esperada:
kubeadm join 192.168.8.XXX:6443 --token k8xsq8.4oo8va9wcqpb*** \
--discovery-token-ca-cert-hash sha256:cb5fc894ab965dfbc4c194e1065869268f8845c3ec40f78f9021dde24610d***
Salve o resultado como KUBEADM_JOIN_CMD.
Script de exemplo: Docker
Substitua os três espaços reservados pelos valores coletados:
KUBE_VERSION— versão do Kubernetes (por exemplo,1.21.0)RUNTIME_VERSION— versão do Docker (por exemplo,18.6.3)KUBEADM_JOIN_CMD— comando completokubeadm join ...
Script de exemplo: containerd
Substitua os três espaços reservados pelos valores coletados:
KUBE_VERSION— versão do Kubernetes (por exemplo,1.21.0)RUNTIME_VERSION— versão do containerd (por exemplo,1.4.3)KUBEADM_JOIN_CMD— comando completokubeadm join ...
Etapa 2: Carregar o script
Carregue o script em um servidor de arquivos acessível ao cluster registrado. O Object Storage Service (OSS) é uma opção comum.
URL de exemplo:
https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh
Guarde a URL para a próxima etapa.
Etapa 3: Registrar o caminho do script
Conclua esta etapa antes de criar um pool de nós. Sem o registro do caminho do script, a expansão não recupera o arquivo e falha.
Defina addNodeScriptPath no ConfigMap ack-agent-config (namespace kube-system).
kubectl edit cm ack-agent-config -n kube-system
Configure addNodeScriptPath com a URL do seu script:
apiVersion: v1
data:
addNodeScriptPath: https://kubelet-****.oss-cn-hangzhou-internal.aliyuncs.com/join-ecs-nodes.sh
kind: ConfigMap
metadata:
name: ack-agent-config
namespace: kube-system
Salve e feche o arquivo. O cluster registrado usa esse script para inicializar nós ECS durante a expansão.