Algumas aplicações exigem que um pod mantenha um endereço IP consistente. Este tópico descreve como configurar um pod do Elastic Container Instance (ECI) para usar um endereço IP fixo.
Como funciona
Por padrão, ao criar um pod ECI, o sistema atribui um endereço IP aleatório ao pod a partir do bloco CIDR do vSwitch especificado no eci-profile. Quando uma falha libera um pod, o sistema libera seu endereço IP e atribui um novo ao pod substituto. Em certos cenários, como na exposição direta de um serviço pelo endereço IP, o pod pode exigir um endereço IP fixo para garantir a continuidade dos negócios.
Para atender a esses cenários, o ECI oferece o recurso de endereço IP fixo. Ao criar um pod ECI com esse recurso ativado, o sistema aloca dois endereços IP do vSwitch configurado: um endereço IP dinâmico, invisível dentro do cluster, e um endereço IP fixo. Após a liberação do pod, o sistema retém seu endereço IP fixo por um período específico (48 horas por padrão). Se você criar um novo pod dentro desse período de retenção com o mesmo ID de cluster, namespace e nome do pod liberado, e também ativar o recurso de endereço IP fixo, o sistema atribuirá o endereço IP retido ao novo pod. Isso garante a consistência do endereço IP do pod.
Nesse cenário, use um StatefulSet para implantar sua aplicação. Quando um pod em um StatefulSet é liberado, o sistema cria automaticamente um novo pod com o mesmo namespace e nome.
Configuração
Adicione annotations aos metadados do pod para ativar o recurso de endereço IP fixo e configurar o período de retenção. A tabela a seguir descreve as annotations.
|
Annotation |
Exemplo |
Descrição |
|
k8s.aliyun.com/eci-fixed-ip |
"true" |
Defina como |
|
k8s.aliyun.com/eci-fixed-ip-retain-hour |
"24" |
Número de horas para reter o endereço IP fixo após a liberação do pod. Se omitido, o padrão é 48 horas. |
Procedimento
-
Crie um Service e um StatefulSet.
kubectl apply -f fixedIp.yamlO arquivo
fixedIp.yamla seguir define um Service e um StatefulSet. O StatefulSet inclui um pod ECI com a annotation que ativa o recurso de endereço IP fixo.apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" minReadySeconds: 10 template: metadata: annotations: k8s.aliyun.com/eci-fixed-ip: "true" # Enable the fixed IP address feature. labels: app: nginx alibabacloud.com/eci: "true" spec: containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 ports: - containerPort: 80 name: web -
Execute o comando a seguir para monitorar as alterações de status do pod.
kubectl get pod -o wide -wA saída mostra que o StatefulSet criou um pod chamado
web-0com o endereço IP172.16.0.129.d:~$ kubectl get pod -o wide -w NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 0/1 Pending 0 9s <none> <none> <none> <none> web-0 0/1 Pending 0 20s <none> <none> <none> <none> web-0 0/1 Pending 0 20s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Pending 0 20s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 ContainerCreating 0 69s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 1/1 Running 0 76s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> -
Abra um novo terminal, conecte-se ao cluster e execute o comando a seguir para excluir o pod no StatefulSet.
kubectl delete pod web-0 -
Retorne ao primeiro terminal e continue observando as alterações de status do pod.
A saída indica que, após a exclusão do pod original, o StatefulSet cria automaticamente um novo pod que reutiliza o endereço IP original.
NotaA criação do novo pod pode sofrer atraso porque o endereço IP permanece ocupado até a exclusão completa do pod anterior.
1:~$ kubectl get pod -o wide -w NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 0/1 Pending 0 9s <none> <none> <none> <none> web-0 0/1 Pending 0 20s <none> <none> <none> <none> web-0 0/1 Pending 0 20s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Pending 0 20s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 ContainerCreating 0 69s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 1/1 Running 0 76s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 1/1 Terminating 0 2m37s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Terminating 0 2m39s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Terminating 0 2m55s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Terminating 0 2m55s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Pending 0 0s <none> <none> <none> web-0 0/1 Pending 0 0s <none> <none> <none> web-0 0/1 Pending 0 1s <none> <none> <none> web-0 0/1 Pending 0 1s <none> <none> <none> web-0 0/1 Pending 0 17s <none> <none> <none> web-0 0/1 Pending 0 17s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Pending 0 17s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 ContainerCreating 0 69s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 1/1 Running 0 76s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none>