O ASM permite usar recursos Ingress em clusters gerenciados e definir um gateway ASM como controlador de ingress. Este tópico descreve como configurar um recurso Ingress no ACK e usar um gateway ASM como controlador de ingress para expor serviços internos do cluster.
Pré-requisitos
Um cluster ACK adicionado a uma instância do ASM (v1.16 ou posterior). Para mais informações, consulte Add a cluster to an ASM instance.
Um service de gateway de ingress implantado com as portas 80 e 443 expostas. Para mais informações, consulte Deploy an ingress gateway service.
A aplicação httpbin implantada. Não é necessário expor a aplicação no gateway. Para mais informações, consulte Deploy the httpbin application.
Limitações
Ao usar um gateway ASM como controlador de ingress, o campo defaultBackend não tem suporte no Ingress. Para mais informações, consulte Ingress.
O plano de dados oferece suporte apenas à API Ingress v1.
Visão geral
O Ingress é um objeto padrão da API do Kubernetes que gerencia o acesso externo aos serviços em um cluster. Configure regras de roteamento em um recurso Ingress para expor serviços HTTP ou HTTPS ao tráfego externo.
O ASM possibilita o uso de recursos Ingress em clusters gerenciados e a especificação de um gateway ASM como Ingress Controller. Esse gateway oferece diversos recursos avançados, como dimensionamento automático, aceleração de hardware tls e desligamento graceful. Ao usá-lo como Ingress Controller, você aproveita as várias capacidades de observabilidade e segurança fornecidas pela Service Mesh. Além disso, o gateway ASM oferece suporte ao carregamento dinâmico de certificados. As chaves privadas, os certificados de servidor e os certificados raiz necessários para tls (Transport Layer Security) podem ser configurados dinamicamente sem reiniciar o gateway.
Etapa 1: Ativar o acesso à API Ingress
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha .
No gateway desejado, clique em Enable Ingress API access na seção Advanced features:. Na caixa de diálogo Confirm, clique em OK.
Etapa 2: Criar um recurso Ingress e especificar o controlador de ingress
Como não é possível especificar portas de listener em um recurso Ingress, o tráfego usa por padrão a porta 80 para HTTP e a porta 443 para HTTPS. Portanto, exponha essas portas no seu gateway ASM.
Especificar o controlador de ingress usando uma annotation
-
Crie um arquivo chamado ingress.yaml com o seguinte conteúdo.
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 -
Conecte-se ao cluster ACK com kubectl e execute o seguinte comando:
kubectl apply -f ingress.yaml
Especificar o controlador de ingress usando uma IngressClass
-
Use o conteúdo abaixo para criar o arquivo 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 -
Conecte-se ao cluster ACK com kubectl e execute o seguinte comando:
kubectl apply -f ingress.yaml
Etapa 3: Verificar o acesso HTTP
Execute o comando a seguir para acessar o service httpbin.
curl -H 'host: httpbin.aliyun.com' http://${ASM_GATEWAY_IP}/status/418
Saída esperada:
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
Essa saída confirma que o recurso Ingress expôs a aplicação httpbin por meio do gateway ASM.
Etapa 4: Configurar tls e verificar o acesso HTTPS
O ASM permite definir configurações tls em um recurso Ingress. Como o gateway ASM executa no namespace istio-system, qualquer Secret referenciado no recurso Ingress também deve existir no namespace istio-system.
O carregamento dinâmico de certificados do gateway ASM possibilita configurar tls montando Secrets sem reiniciar os pods do gateway. Monte múltiplos Secrets para carregar certificados diferentes. Esse processo não exige reinicialização dos pods do gateway.
O procedimento a seguir mostra como carregar um único certificado como exemplo. Caso precise oferecer suporte a vários certificados, crie um Secret adicional para cada um deles. Os certificados são carregados automaticamente quando referenciados no recurso Ingress, seguindo os padrões nas etapas 2 e 3 abaixo.
-
Prepare o certificado do servidor e a chave privada.
Um nome de domínio precisa ter registro ICP para ser acessível a partir da China continental. Este exemplo usa aliyun.com para gerar um certificado e uma chave privada, salvando-os como um Secret.
-
Cenário 1: Você não possui certificado e chave privada para aliyun.com
Use o openssl para gerar o certificado e a chave:
-
Execute o comando abaixo para criar 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 -
Execute os comandos a seguir para gerar 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 -
No seu ambiente KubeConfig, execute o comando abaixo para criar um Secret no namespace istio-system:
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt
-
-
Cenário 2: Você já possui um certificado válido e chave privada para aliyun.com
Nomeie o certificado como aliyun.com.crt e a chave privada como aliyun.com.key.
-
No seu ambiente KubeConfig, execute o comando abaixo para criar um Secret no namespace istio-system:
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt
-
-
Crie um recurso Ingress e especifique o Secret tls como myexample-credential, criado na Etapa 1.
-
Use o conteúdo a seguir para criar o arquivo ingress-https.yaml.
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-credentialNotaSe você criar um recurso Ingress no console do ACK, só poderá selecionar um Secret de certificado que esteja no mesmo namespace do recurso Ingress. Por exemplo, ao criar um recurso Ingress no namespace
default, apenas Secrets do namespacedefaultestarão disponíveis para seleção. Sendo assim, copie o Secretmyexample-credentialcriado na Etapa 1 para o namespacedefaultpara garantir que ele possa ser selecionado no console do ACK. -
Conecte-se ao cluster ACK usando kubectl e execute o comando a seguir para aplicar o recurso Ingress.
kubectl apply -f ingress-https.yaml
-
-
Execute o comando abaixo para acessar o service httpbin via HTTPS.
curl -H Host:httpbin.aliyun.com --resolve httpbin.aliyun.com:443:${ASM_GATEWAY_IP} https://httpbin.aliyun.com:443/status/418 -kSaída esperada:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/Essa saída confirma que o recurso Ingress expôs a aplicação httpbin via HTTPS por meio do gateway ASM.