Adicione anotações a um arquivo YAML de Service para configurar instâncias do Edge Load Balancer (ELB), listeners, grupos de servidores de backend e endereços IP elásticos de borda (EIPs de borda) no Edge Node Service (ENS).
Observações de uso
As chaves e os valores das anotações diferenciam maiúsculas de minúsculas. Use apenas letras minúsculas.
Defina
spec.typecomoLoadBalancer.Defina
spec.loadBalancerClasscomoalibabacloud.com/elb.-
Todos os valores de anotação devem ser strings. Codifique tipos não string da seguinte forma:
Tipo
Codificação
Exemplo
Booleano
String entre aspas
"true"Inteiro
String entre aspas
"10"Lista
String separada por vírgulas
"k1=v1,k2=v2"
Referência rápida
A tabela a seguir lista todas as anotações compatíveis. Clique em um link para acessar a descrição completa.
|
Anotação |
Padrão |
Seção |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nenhum |
|
|
|
|
|
|
|
|
|
|
|
N/A |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
— |
|
|
|
— |
Instâncias de ELB
Não é possível atualizar a configuração de uma instância ELB após a criação. Para obter detalhes sobre tipos de instância e faturamento, consulte CreateLoadBalancer.
Criar uma instância ELB gerenciada pelo ECM
O EdgeControllerManager (ECM) cria e gerencia automaticamente as instâncias de ELB ao criar um Service. Especifique quais pools de nós do ENS receberão instâncias de ELB usando a anotação service.openyurt.io/nodepool-labelselector (NodePoolSelector).
Sintaxe do NodePoolSelector:
|
Formato |
Lógica |
Exemplo |
|
|
AND — o pool de nós deve corresponder a todos os rótulos |
|
|
|
OR — o pool de nós deve corresponder a qualquer valor |
|
A anotação openyurt.io/topologyKeys: openyurt.io/nodepool restringe o encaminhamento de tráfego apenas aos Pods no pool de nós especificado.
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Restrict traffic to Pods in the selected node pool.
service.openyurt.io/nodepool-labelselector: key1=val1 # Select ENS node pools by label.
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
Especificar um tipo de instância ELB
|
Anotação |
Descrição |
Padrão |
|
|
Tipo de instância ELB. Para tipos disponíveis, consulte Tipos de instância e faturamento. |
|
|
|
Método de faturamento. Há suporte apenas para pagamento conforme o uso ( |
|
Exemplo:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: elb.s1.small
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-pay-type: PostPaid
YAML completo:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: elb.s1.small
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-pay-type: PostPaid
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
Especificar o modo de exposição do serviço
|
Anotação |
Descrição |
Padrão |
|
|
|
|
Por padrão, as instâncias de ELB ficam expostas à Internet. Para restringir o acesso apenas a redes privadas, defina esta anotação como intranet.
Exemplo:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet
YAML completo:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
Configurar definições de EIP para exposição na Internet
Para expor um Service à Internet, adquira uma instância de ELB voltada para a rede interna e um EIP. Use as anotações a seguir para configurar o EIP.
|
Anotação |
Descrição |
Padrão |
|
|
Largura de banda máxima de Internet do EIP. Unidade: Mbit/s. |
|
|
|
ISP do EIP: |
Nenhum |
|
|
Método de faturamento do EIP. Há suporte apenas para pagamento conforme o uso ( |
|
|
|
Método de faturamento de largura de banda de Internet. Há suporte apenas para pagamento pelo percentil 95 mensal ( |
|
Exemplo:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-bandwidth: "10"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-isp: cmcc
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-instance-charge-type: "PostPaid"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-internet-charge-type: "95BandwidthByMonth"
YAML completo:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Restrict traffic to Pods in the selected node pool.
service.openyurt.io/nodepool-labelselector: key1=val1 # Select ENS node pools by label.
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-bandwidth: "10"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-isp: cmcc
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-instance-charge-type: "PostPaid"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-internet-charge-type: "95BandwidthByMonth"
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
Grupos de servidores de backend
Por padrão, o ECM adiciona todos os nós do ENS na Virtual Private Cloud (VPC) como servidores de backend (modo cluster). Para adicionar apenas os nós que hospedam Pods da aplicação como servidores de backend, defina spec.externalTrafficPolicy como Local.
Se vários Services compartilharem uma única instância de ELB,externalTrafficPolicydeverá ser definido comoCluster(padrão). Não há suporte para o modo Local neste caso.
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Restrict traffic to Pods in the selected node pool.
service.openyurt.io/nodepool-labelselector: key1=val1 # Select ENS node pools by label.
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
externalTrafficPolicy: Local
Filtrar servidores de backend por rótulo
|
Anotação |
Descrição |
Padrão |
|
|
Rótulos dos nós de trabalho a serem adicionados como servidores de backend. Separe vários rótulos com vírgulas (,). A relação lógica entre vários rótulos é AND. Exemplo: |
N/A |
Para excluir nós de borda específicos do grupo de servidores de backend, adicione o rótulo node.kubernetes.io/exclude-from-external-load-balancers=true a esses nós.
Exemplo:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label: key2=val2
YAML completo:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label: key2=val2
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
externalTrafficPolicy: Local
Configurar pesos dos servidores de backend
|
Anotação |
Descrição |
Padrão |
|
|
Pesos por nó para listeners com round-robin ponderado (WRR). Formato: |
|
Exemplo — definir um peso padrão de 50 e substituir pesos para node1 e node2:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-weight: base=50,node1=80,node2=90
YAML completo:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-weight: base=50,node1=80,node2=90
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
Listeners
O ECM cria listeners automaticamente com base em spec.ports. O cluster aloca as portas dos servidores de backend por padrão. Para escutar em uma porta específica do servidor de backend, defina nodePort na definição da porta.
# ...
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
nodePort: 30080 # Pin the backend server port.
targetPort: 80
Configurar um algoritmo de agendamento
|
Anotação |
Descrição |
Padrão |
|
|
Algoritmo de agendamento para listeners: |
|
Exemplo:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: "wrr"
YAML completo:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: "wrr"
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
nodePort: 30080
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
Configurar persistência de sessão para listeners TCP
|
Anotação |
Descrição |
Padrão |
|
|
Período de persistência de sessão para listeners TCP. Aplica-se a todos os listeners TCP na instância ELB. Unidade: segundos. Valores válidos: 0–3600. Defina como |
|
Exemplo:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-persistence-timeout: "300"
Configurar o timeout de conexão para listeners TCP
|
Anotação |
Descrição |
Padrão |
|
|
Período de timeout de conexão para listeners TCP. Unidade: segundos. Valores válidos: 10–900. |
|
Exemplo:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-established-timeout: "900"
YAML completo combinando timeout de conexão com outras configurações de listener:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-established-timeout: "900"
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
nodePort: 30080
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
Configurar verificações de integridade
|
Anotação |
Descrição |
Valores válidos |
Padrão |
|
|
Número de verificações de integridade bem-sucedidas consecutivas necessárias antes que um servidor de backend seja marcado como disponível. |
2–10 |
|
|
|
Número de verificações de integridade com falha consecutivas necessárias antes que um servidor de backend seja marcado como indisponível. |
2–10 |
|
|
|
Intervalo entre verificações de integridade consecutivas. Unidade: segundos. |
2–10 |
|
|
|
Timeout para resposta de uma verificação de integridade. Se um servidor de backend não responder dentro desse período, a verificação falhará. Unidade: segundos. |
1–300 |
|
Exemplo:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "5"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "5"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: "2"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout: "5"
YAML completo:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool
service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "5"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "5"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: "2"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout: "5"
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
nodePort: 30080
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb
Configuração avançada
Usar uma instância ELB existente
Para usar uma instância de ELB autogerenciada em vez de permitir que o ECM crie uma, siga estas etapas.
-
Crie o Service com a anotação
alibaba-cloud-loadbalancer-managed-by-user: "true":apiVersion: v1 kind: Service metadata: name: nginx namespace: default annotations: openyurt.io/topologyKeys: openyurt.io/nodepool # Restrict traffic to Pods in the selected node pool. service.openyurt.io/nodepool-labelselector: key1=val1 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true" spec: ports: - name: nginx-80 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer loadBalancerClass: alibabacloud.com/elb -
Localize o PoolService correspondente ao pool de nós (ENS VPC) e adicione uma anotação com o ID da instância ELB:
kubectl annotate ps {<SERVICENAME>-NodePoolID} service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=<lb_ID>Substitua
<SERVICENAME>pelo nome do PoolService do pool de nós (ENS VPC) e<lb_ID>pelo ID da instância ELB.
Compartilhar uma instância ELB entre vários serviços
Para configurar vários Services de modo que compartilhem uma única instância de ELB, atenda aos seguintes requisitos:
Defina
externalTrafficPolicycomoCluster.Use uma instância de ELB autogerenciada e adicione uma anotação com seu ID em cada Service (consulte Usar uma instância ELB existente).
Para habilitar o acesso à Internet usando EIPs, crie e gerencie manualmente um EIP.
Defina
service.openyurt.io/elb-force-override-listeners: "true"para permitir a sobrescrita de listeners.
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
annotations:
openyurt.io/topologyKeys: openyurt.io/nodepool # Restrict traffic to Pods in the selected node pool.
service.openyurt.io/nodepool-labelselector: key1=val1
service.openyurt.io/elb-force-override-listeners: "true"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true"
spec:
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
loadBalancerClass: alibabacloud.com/elb