Exponha um gateway de entrada através de um balanceador de carga externo
Vista geral
Com a Cloud Service Mesh, pode implementar e gerir gateways de entrada como parte da sua service mesh. Pode configurar ainda mais o equilíbrio de carga para o seu cluster com a Cloud Service Mesh através de equilibradores de carga externos (equilibradores de carga físicos ou de software fora do cluster) para enviar tráfego para o gateway de entrada.
Esta página mostra como configurar um equilibrador de carga externo com a Cloud Service Mesh. Em alternativa, pode configurar a entrada com várias configurações de back-end.
Antes de começar
Para concluir os passos neste documento, precisa dos seguintes recursos:
Um cluster do Kubernetes com o Cloud Service Mesh instalado.
Um balanceador de carga externo que pode aceder aos nós onde o cluster está a ser executado. Configura este balanceador de carga externo para ficar à frente do gateway de entrada do cluster através do endereço IP externo do balanceador de carga.
Configure o seu ambiente
Execute os seguintes comandos a partir de uma estação de trabalho que possa aceder ao cluster que
pretende usar. Certifique-se de que a ferramenta kubectl
está configurada para usar o contexto do cluster específico do seu cluster.
Defina as variáveis de ambiente.
export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
Defina o
IP address
do balanceador de carga externo.export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
[\Optional/] Etiquete os nós da gateway de entrada. Isto garante que o gateway é implementado em nós específicos no cluster.
kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
- INGRESSGATEWAY_NODE_IP: são os nós no seu cluster do Kubernetes que alojam o gateway de entrada. Execute este comando
kubectl
para todos os nós de entrada que tiver.
- INGRESSGATEWAY_NODE_IP: são os nós no seu cluster do Kubernetes que alojam o gateway de entrada. Execute este comando
Crie o gateway de entrada
Antes de concluir as instruções nesta secção, tem de determinar a implementação do plano de controlo. Use as instruções em Identifique a implementação do plano de controlo para o fazer.
Crie o espaço de nomes. Este espaço de nomes é usado para implementar o gateway de entrada.
kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
Ative o espaço de nomes para injeção. Os passos dependem da sua implementação do plano de controlo.
Gerido (TD)
- Aplique a etiqueta de injeção predefinida ao espaço de nomes:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
Gerido (Istiod)
Recomendado: execute o seguinte comando para aplicar a etiqueta de injeção predefinida ao espaço de nomes:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
Se for um utilizador existente com o plano de controlo do Istiod gerido: recomendamos que use a injeção predefinida, mas a injeção baseada em revisões é suportada. Siga as instruções abaixo:
Execute o seguinte comando para localizar os canais de lançamento disponíveis:
kubectl -n istio-system get controlplanerevision
O resultado é semelhante ao seguinte:
NAME AGE asm-managed-rapid 6d7h
NOTA: se aparecerem duas revisões do plano de controlo na lista acima, remova uma delas. Ter vários canais do plano de controlo no cluster não é suportado.
Na saída, o valor na coluna
NAME
é a etiqueta de revisão que corresponde ao canal de lançamento disponível para a versão do Cloud Service Mesh.Aplique a etiqueta de revisão ao espaço de nomes:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
No cluster
Recomendado: execute o seguinte comando para aplicar a etiqueta de injeção predefinida ao espaço de nomes:
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
Recomendamos que use a injeção predefinida, mas a injeção baseada em revisões é suportada: siga estas instruções:
Use o seguinte comando para localizar a etiqueta de revisão em
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
Aplique a etiqueta de revisão ao espaço de nomes. No comando seguinte,
REVISION_LABEL
é o valor da etiqueta de revisãoistiod
que anotou no passo anterior.kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
Aplique o ficheiro de manifesto da gateway de entrada.
kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
Resultado esperado:
serviceaccount/asm-ingressgateway created role.rbac.authorization.k8s.io/asm-ingressgateway created rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created deployment.apps/asm-ingressgateway created service/asm-ingressgateway created poddisruptionbudget.policy/asm-ingressgateway created horizontalpodautoscaler.autoscaling/asm-ingressgateway created
Aplique uma correção ao serviço
ingressgateway
com o endereço IP do balanceador de carga externo.cat <<EOF > asm-external-ip-patch.yaml spec: externalIPs: - ${EXTERNAL_LB_IP_ADDRESS} loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS} EOF kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
[Opcional] Aplique uma patch à implementação da afinidade de etiquetas dos nós do gateway de entrada.
ingressgateway
cat <<EOF > asm-ingress-node-label-patch.yaml spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ${ASM_INGRESSGATEWAY_NODE_LABEL} operator: Exists EOF kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
Configure o balanceador de carga externo
Nesta secção, configura o balanceador de carga externo para estabelecer ligação ao gateway de entrada do cluster.
Obtenha informações da porta do gateway de entrada Service
Apanhe a linha
NodePorts
.export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
Apresentar o
NodePorts
.echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT} echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT} echo STATUS_PORT=${STATUS_PORT}
Configure o balanceador de carga externo
Use o NodePorts
apresentado no passo anterior para configurar a conetividade
entre o equilibrador de carga externo e o gateway de entrada.
Configure a verificação de funcionamento na configuração do balanceador de carga.
hosts: CLUSTER_NODE_IP Protocol: HTTP Port: STATUS_PORT Path: /healthz/ready
CLUSTER_NODE_IP: é o endereço IP dos nós no seu cluster do Kubernetes que aloja o gateway de entrada. Este endereço IP tem de estar acessível a partir do seu balanceador de carga externo. Pode ter de configurar esta configuração várias vezes, uma vez por nó do cluster.
STATUS_PORT: é o
NodePort
através do qual a API de estado de funcionamento do gateway de entrada é exposta. Pode copiar estas informações do passo anterior. O valor é o mesmo para todos os nós no cluster.
Configure pools de nós no balanceador de carga para encaminhar o tráfego
HTTP
eHTTPS
. Use a seguinte configuração deIP:PORT
para o tráfego na porta 80 (HTTP
) e na porta 443 (HTTPS
).80 -> CLUSTER_NODE_IP:HTTP_INGRESS_PORT 443 -> CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
CLUSTER_NODE_IP: é o endereço IP dos nós no seu cluster do Kubernetes que aloja o gateway de entrada. Este endereço IP tem de estar acessível a partir do seu balanceador de carga externo. Pode ter de configurar esta configuração várias vezes, uma vez por nó do cluster.
HTTP_INGRESS_PORT: é a
NodePort
através da qual o tráfego HTTP do gateway de entrada é exposto. Pode copiar estas informações do passo anterior. O valor é o mesmo para todos os nós no cluster.HTTPS_INGRESS_PORT: é a
NodePort
através da qual o tráfego HTTPS do gateway de entrada é exposto. Pode copiar estas informações do passo anterior. O valor é o mesmo para todos os nós no cluster.
Para validar a configuração, certifique-se de que as verificações de funcionamento no balanceador de carga estão a ser aprovadas.
O que se segue?
- Leia mais sobre a instalação e a atualização de gateways