Por padrão, os pods em clusters ACK usam endereços IP privados. Em cenários como isolamento de dados multilocatário ou isolamento de segurança, um pod pode precisar de um endereço IP público independente. Você pode montar um Elastic IP Address (EIP) em um pod usando annotations.
Informações básicas
Por padrão, os pods acessam a internet por meio de um gateway NAT da Internet (Ative acesso à internet para um cluster). O tráfego de entrada geralmente flui por um Serviço LoadBalancer. No entanto, alguns cenários exigem que o pod tenha seu próprio endereço IP público:
Alocação dinâmica de portas: servidores de jogos UDP ou protocolos RTSP alocam portas aleatórias por cliente. Um endereço IP independente evita conflitos de porta.
Contorno de SNAT: quando um serviço externo exige um IP fixo em sua lista de permissões, o IP de saída SNAT compartilhado pode ser bloqueado.
Identidade direta de IP: conexões ponta a ponta com sistemas externos, como protocolos de comunicação em tempo real, requerem um endereço IP independente.
Limites
Leia os limites dos EIPs antes de começar.
Na alocação automática de EIP, os endereços podem ser solicitados e liberados repetidamente quando os pods são recriados ou quando a execução da Container Network Interface (CNI) falha, o que pode acionar limites de EIP. Para evitar isso, especifique um EIP definindo a annotation do pod
network.alibabacloud.com/allocated-eip-id.
Procedimento
Para montar um EIP em um pod, instale o componente ack-extend-network-controller na página Component Management.
Etapa 1: Instalar ou atualizar o componente
Se você já instalou o componente via Helm ou ACK Marketplace, desinstale-o antes de prosseguir.
Faça login no console ACS. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, clique em Add-ons.
-
Na caixa de pesquisa, procure por ACK Extend Network Controller e clique em Install no canto inferior direito do cartão do componente.

-
Na caixa de diálogo exibida, configure os parâmetros conforme a tabela a seguir e clique em OK.
Parâmetro
Descrição
enableControllers
Recursos a serem ativados:
-
eip: ativa o recurso de EIP.
-
ipv6gw: ativa o recurso de IPv6.
-
natgw: ativa o recurso de gateway DNAT.
eip e ipv6gw vêm selecionados por padrão e não exigem permissões adicionais de RAM.
natgw requer permissões de RAM. Para mais informações, consulte Configure permissões de RAM necessárias para DNAT.
natGwPool
Configuração de DNAT.
customStatefulWorkloadKinds
Tipos personalizados de contêineres com estado. StatefulSets do Kubernetes e pods criados diretamente têm suporte por padrão. Para adicionar outros tipos de contêiner, clique em + Add.
-
Etapa 2: Ative o recurso de EIP
Você pode montar um EIP em um pod adicionando annotations à configuração do pod. Para obter a lista completa de annotations compatíveis, consulte Annotations para anexar um EIP a um pod.
Você pode alocar automaticamente um novo EIP ou especifique uma instância de EIP existente. Os dois métodos diferem nas annotations e no comportamento de liberação: EIPs alocados automaticamente são liberados por padrão quando o pod é excluído; EIPs especificados são retidos. Para mais informações sobre políticas de liberação de EIP, consulte Configure a política de liberação de EIP.
Alocar automaticamente um EIP
Na página Clusters, clique em o nome do cluster desejado e escolha Workloads > Deployments no painel de navegação à esquerda.
No canto superior direito da página, clique em Create From YAML.
-
Use o YAML de exemplo a seguir para crie um deployment chamado example.
-
Após crie o deployment, abra a página de detalhes dele. Clique em o nome de um pod, como example-78d17b7xxx-adxxx, para visualize a página de Details do pod. A seção Annotations exibe as informações do EIP. Clique em Edit para ver os detalhes do EIP no YAML do pod.
Ao concluir o exemplo, exclua o deployment. Como nenhum ID de instância de EIP foi especificado, o EIP alocado automaticamente é liberado por padrão quando o pod é excluído.
Especifique uma instância de EIP
Prepare uma instância de EIP. Solicitar um EIP.
Na página Clusters, clique em o nome do cluster desejado e escolha Workloads > StatefulSets no painel de navegação à esquerda.
No canto superior direito da página, clique em Create From YAML.
-
Use o YAML de exemplo a seguir para crie um StatefulSet chamado example.
-
Após crie o StatefulSet, abra a página de detalhes dele. Clique em o nome de um pod, como example-0, para visualize a página de Details do pod. A seção Annotations exibe as informações do EIP anexado. Clique em Edit para ver os detalhes do EIP no YAML do pod.
Ao concluir o exemplo, exclua o StatefulSet. Como um ID de instância de EIP foi especificado, o EIP é retido quando o pod é excluído.
Operações relacionadas
O controlador VPC anexa um EIP após a alocação do endereço IP do pod. O pod pode entrar no estado Ready antes da anexação do EIP, o que pode causar interrupções de serviço ou tempos limite de conexão. Use os métodos a seguir para garantir que o EIP esteja anexado antes que o pod aceite tráfego.
Usar readiness gates para verificar o status de anexação do EIP
Com readinessGates configurado, o controlador VPC define as conditions do pod após anexar o EIP. O pod não entra no estado Ready até que a anexação do EIP seja concluída.
kind: Pod
...
spec:
readinessGates:
- conditionType: "k8s.aliyun.com/eip"
status:
conditions:
- lastProbeTime: "2022-12-12T03:45:48Z"
lastTransitionTime: "2022-12-12T03:45:48Z"
reason: Associate eip succeed
status: "True"
type: k8s.aliyun.com/eip
...
Usar initContainers para verificar o status de anexação do EIP
Configure initContainers para que o pod verifique se o EIP foi alocado nos initContainers. Código de exemplo para configure initContainers:
apiVersion: v1
kind: Pod
metadata:
name: example
annotations:
network.alibabacloud.com/pod-with-eip: "true"
spec:
containers:
- name: example
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
command: ['timeout', '-t' ,'60', 'sh','-c', "until grep -E '^k8s.aliyun.com\\/pod-ips=\\S?[0-9]+\\S?' /etc/podinfo/annotations; do echo waiting for annotations; sleep 2; done"]
volumeMounts:
- name: podinfo
mountPath: /etc/podinfo
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
Configure permissões de RAM necessárias para DNAT
O recurso DNAT exige que o ack-extend-network-controller acesse a OpenAPI da Alibaba Cloud. Configure as seguintes permissões de RAM.
Faça login no console Resource Access Management (RAM). No painel de navegação à esquerda, clique em Access Policies e, em seguida, clique em Create Policy.
-
Na página Create Policy, clique em Script Editor, cole o conteúdo a seguir na seção
Statementdo editor de código e clique em OK. Defina o Policy Name como DNAT-Policy e clique em OK novamente.{ "Effect": "Allow", "Action": [ "ecs:DescribeNetworkInterfaces", "vpc:DescribeNatGateways", "vpc:DescribeForwardTableEntries", "vpc:CreateForwardEntry", "vpc:DescribeEipAddresses", "vpc:DeleteForwardEntry", "vpc:DescribeRouteTableList", "vpc:DescribeRouteEntryList" ], "Resource": [ "*" ], "Condition": {} } No painel de navegação à esquerda, clique em Roles. Na caixa de pesquisa, procure por AliyunCCNECRole. Na coluna Actions, clique em Grant Permission.
Na caixa de pesquisa da seção Access Policy, procure e selecione DNAT-Policy. Em seguida, clique em Confirm.