Quando as cargas de trabalho em um cluster do Container Service for Kubernetes (ACK) precisam de acesso HTTP ou HTTPS de clientes externos, exponha-as por meio de um recurso de Ingress padrão do Kubernetes com suporte de um gateway do Alibaba Cloud Service Mesh (ASM). Essa abordagem oferece dimensionamento automático, aceleração de Transport Layer Security (TLS), desligamento graceful da instância do Server Load Balancer (SLB), carregamento dinâmico de certificados e recursos integrados de observabilidade e segurança, sem a necessidade de manter um controlador de ingress separado.
O Ingress gerencia o roteamento padrão de HTTP/HTTPS. Para gerenciamento avançado de tráfego, como divisão de tráfego, injeção de falhas ou políticas de autorização, utilize os recursos ASM Gateway e VirtualService. Para obter mais informações sobre a API Gateway do Kubernetes, consulte Ingress Gateways.
Pré-requisitos
Antes de começar, verifique se você possui:
Um cluster do ACK adicionado a uma instância do ASM versão 1,16 ou posterior. Para obter mais informações, consulte Adicionar um cluster a uma instância do ASM
Um gateway de ingress com as portas 80 e 443 expostas. Para obter mais informações, consulte Criar um serviço de gateway de ingress
A aplicação httpbin implantada no cluster (não precisa estar exposta no gateway). Para obter mais informações, consulte Implantar a aplicação HTTPBin
kubectl configurado para conectar-se ao cluster do ACK
Limitações
|
Limitação |
Detalhes |
|
|
O gateway do ASM não oferece suporte ao campo |
|
Versão da API de Ingress |
Apenas |
Ativar o Ingress no gateway do ASM
Faça login no console do ASM. No painel de navegação à esquerda, selecione Service Mesh > Mesh Management.
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, selecione ASM Gateways > Ingress Gateway.
Na seção Advanced features, clique em Enable Ingress API access. Na mensagem Submit, clique em OK.
Criar um recurso de Ingress
O Ingress não suporta portas de escuta personalizadas. Por padrão, a porta 80 gerencia o tráfego HTTP e a porta 443 gerencia o tráfego HTTPS. Certifique-se de que ambas as portas estejam habilitadas no gateway do ASM.
Existem dois métodos para designar o gateway do ASM como controlador de ingress:
|
Método |
Campo / Anotação |
Status |
|
Campo IngressClass (recomendado) |
|
Abordagem padrão do Kubernetes |
|
Anotação (obsoleta) |
|
Usar o campo ingressClassName (recomendado)
O campo ingressClassName referencia um recurso IngressClass que identifica o controlador responsável pelo Ingress.
-
Crie um arquivo chamado
ingress.yaml:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress spec: ingressClassName: istio rules: - host: httpbin.aliyun.com http: paths: - path: / pathType: Prefix backend: service: name: httpbin port: number: 8000 -
Aplique o Ingress:
kubectl apply -f ingress.yaml
Usar a anotação (obsoleta)
A anotação kubernetes.io/ingress.class foi tornada obsoleta pelo Kubernetes. Utilize o campo ingressClassName para garantir compatibilidade futura.
-
Crie um arquivo chamado
ingress.yaml:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: istio name: ingress spec: rules: - host: httpbin.aliyun.com http: paths: - path: /status pathType: Prefix backend: service: name: httpbin port: number: 8000 -
Aplique o Ingress:
kubectl apply -f ingress.yaml
Verificar o acesso HTTP
-
Obtenha o endereço IP externo do gateway do ASM:
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway \ -o jsonpath='{.status.loadBalancer.ingress[0].ip}') -
Envie uma solicitação para o serviço httpbin:
curl -H 'Host: httpbin.aliyun.com' "http://${INGRESS_HOST}/status/418"Saída esperada:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/Essa saída confirma que o Ingress roteia com sucesso o tráfego para a aplicação httpbin por meio do gateway do ASM.
Configurar TLS para acesso HTTPS
O gateway do ASM suporta carregamento dinâmico de certificados. É possível atualizar chaves privadas, certificados de servidor e certificados raiz sem reiniciar o pod do gateway. Vários Secrets podem ser montados para servir diferentes certificados.
Como o gateway do ASM executa no namespace istio-system, os Secrets de TLS referenciados no Ingress também devem residir em istio-system.
Preparar um certificado de servidor e chave privada
Um nome de domínio deve possuir um registro ICP (Internet Content Provider) antes de se tornar acessível. O exemplo a seguir gera um certificado autoassinado para aliyun.com.
Escolha um dos cenários abaixo:
Cenário 1: Gerar um novo certificado
-
Crie um certificado raiz e uma chave privada:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=myexample Inc./CN=aliyun.com' \ -keyout aliyun.root.key -out aliyun.root.crt -
Gere um certificado de servidor e uma chave privada para
aliyun.com:openssl req -out aliyun.com.csr -newkey rsa:2048 -nodes \ -keyout aliyun.com.key -subj "/CN=aliyun.com/O=myexample organization" openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key \ -set_serial 0 -in aliyun.com.csr -out aliyun.com.crt -
Crie um Secret de TLS no namespace
istio-system:kubectl create -n istio-system secret tls myexample-credential \ --key=aliyun.com.key --cert=aliyun.com.crt
Cenário 2: Usar um certificado existente
Nomeie o arquivo de certificado como
aliyun.com.crte o arquivo de chave privada comoaliyun.com.key.-
Crie um Secret de TLS no namespace
istio-system:kubectl create -n istio-system secret tls myexample-credential \ --key=aliyun.com.key --cert=aliyun.com.crt
Criar um Ingress com TLS
-
Crie um arquivo chamado
ingress-https.yaml:NotaAo criar um Ingress no console do ACK, você só pode selecionar Secrets do namespace onde o Ingress reside. Se o Ingress estiver no namespace
default, copie o Secretmyexample-credentialparadefaultpara que ele apareça no console:kubectl get secret myexample-credential -n istio-system -o yaml \ | sed 's/namespace: istio-system/namespace: default/' \ | kubectl apply -f -apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress annotations: kubernetes.io/ingress.class: istio spec: rules: - host: httpbin.aliyun.com http: paths: - backend: service: name: httpbin port: number: 8000 path: /status pathType: Prefix tls: - hosts: - httpbin.aliyun.com secretName: myexample-credential -
Aplique o Ingress:
kubectl apply -f ingress-https.yaml
Verificar o acesso HTTPS
Envie uma solicitação para o serviço httpbin via HTTPS:
curl -H 'Host: httpbin.aliyun.com' \
--resolve "httpbin.aliyun.com:443:${INGRESS_HOST}" \
"https://httpbin.aliyun.com:443/status/418" -k
Saída esperada:
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
Essa saída confirma que o Ingress roteia com sucesso o tráfego para a aplicação httpbin via HTTPS por meio do gateway do ASM.
Carregar certificados adicionais
Para atender a vários domínios com certificados diferentes, repita as etapas de preparação do certificado e criação do Secret para cada domínio e adicione entradas ao array tls no seu recurso de Ingress. O gateway do ASM carrega novos certificados dinamicamente sem reiniciar o pod.