Todos os dados entre um ingress gateway e um sidecar proxy são transmitidos por um túnel Mutual Transport Layer Security (mTLS). Se houver sidecar proxies injetados na aplicação, recomenda-se configurar o término de TLS no ingress gateway para garantir criptografia de ponta a ponta. Caso não existam sidecar proxies injetados ou ocorram outras circunstâncias especiais, o ingress gateway oferece suporte a TLS pass-through. Este tópico descreve como ativar o TLS pass-through em um ingress gateway para assegurar acesso seguro a serviços HTTPS em um cluster.
Pré-requisitos
Um ingress gateway implantado. Para mais informações, consulte Crie um ingress gateway.
Uma aplicação implantada no cluster adicionado à instância do ASM. Para mais detalhes, consulte Deploy an application to an ASM-associated cluster.
Um nome de domínio com registro ICP (Internet Content Provider). Neste tópico, utiliza-se o nome de domínio aliyun.com.
Etapa 1: Preparar um certificado de servidor e uma chave privada
Caso já possua um certificado de servidor e uma chave privada disponíveis para o nome de domínio sample.aliyun.com, renomeie a chave privada para sample.aliyun.com.key e o certificado do servidor para sample.aliyun.com.crt. Alternativamente, execute os comandos do openssl abaixo para criar um certificado de servidor e uma chave privada para sample.aliyun.com.
-
Execute o comando a seguir para criar um certificado raiz e uma chave privada:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=mynginx Inc./CN=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt -
Execute os comandos abaixo para gerar um certificado de servidor e uma chave privada para o servidor de
sample.aliyun.com:openssl req -out sample.aliyun.com.csr -newkey rsa:2048 -nodes -keyout sample.aliyun.com.key -subj "/CN=sample.aliyun.com/O=mynginx sample organization" openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -in sample.aliyun.com.csr -out sample.aliyun.com.crt
Etapa 2: Definir um service interno
O service interno neste exemplo é um servidor NGINX. Primeiramente, crie um arquivo de configuração para esse servidor. Para o domínio aliyun.com, configure o caminho raiz para retornar a mensagem Welcome to aliyun.com without TLS Termination! com código de status 200. O conteúdo do arquivo mynginx.conf está apresentado a seguir.
events {
}
http {
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
server {
listen 443 ssl;
location / {
return 200 'Welcome to aliyun.com without TLS Termination!';
add_header Content-Type text/plain;
}
server_name www.aliyun.com;
ssl_certificate /etc/nginx-server-certs/tls.crt;
ssl_certificate_key /etc/nginx-server-certs/tls.key;
}
}
-
Conecte-se ao cluster ao qual o pod do ingress gateway pertence usando kubectl, com base nas informações do arquivo kubeconfig. Em seguida, execute o comando abaixo para criar um ConfigMap que armazene a configuração do servidor NGINX:
kubectl create configmap mynginx-configmap --from-file=nginx.conf=./mynginx.conf -
Conecte-se ao cluster do pod do ingress gateway usando kubectl, conforme as informações do arquivo kubeconfig. Depois, execute o seguinte comando para criar um secret contendo o certificado do servidor e a chave privada no namespace padrão:
kubectl create secret tls nginx-server-certs --key sample.aliyun.com.key --cert sample.aliyun.com.crt Ative a injeção automática de sidecar proxy no namespace padrão. Para mais informações sobre o procedimento, consulte Ative automatic sidecar proxy injection.
-
Crie um arquivo mynginxapp.yaml com o conteúdo a seguir. Em seguida, execute o comando
kubectl apply -f mynginxapp.yamlpara criar um service interno associado ao nome de domínio aliyun.com. -
Execute o comando abaixo para enviar uma solicitação do sidecar proxy ao servidor NGINX e verificar se a implantação foi concluída com sucesso:
kubectl exec -it $(kubectl get pod -l app=mynginxapp -o jsonpath={.items..metadata.name}) -c istio-proxy -- curl -v -k --resolve sample.aliyun.com:443:127.0.0.1 https://sample.aliyun.com
Etapa 3: Criar um gateway
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página Mesh Management, localize a instância do ASM desejada. Clique em no nome da instância ou em Manage na coluna Actions.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda. Na página exibida, clique em Create from YAML.
-
Configure o Gateway conforme descrito abaixo e clique em Create.
Selecione um namespace. Este exemplo utiliza o namespace default.
-
No editor de código, defina um gateway Istio utilizando o seguinte código YAML:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-mynginx-customingressgateway spec: selector: istio: ingressgateway servers: - hosts: - 'sample.aliyun.com' port: name: https number: 443 protocol: HTTPS tls: mode: PASSTHROUGH
Na página Gateway, visualize o gateway Istio criado.
Etapa 4: Criar um virtual service
Faça login no console do ASM.
No painel de navegação à esquerda, escolha .
Na página Mesh Management, localize a instância do ASM que deseja configurar. Clique em no nome da instância ou em Manage na coluna Actions.
Na página de detalhes da instância do ASM, escolha no painel de navegação à esquerda. Na página aberta, clique em Create from YAML.
-
Configure o VirtualService conforme indicado e clique em Create.
Selecione um namespace. Este exemplo utiliza o namespace default.
-
No editor de código, defina um virtual service com o código YAML a seguir:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: istio-mynginx-customvirtualservice spec: hosts: - "sample.aliyun.com" gateways: - istio-mynginx-customingressgateway tls: - match: - port: 443 sniHosts: - sample.aliyun.com route: - destination: host: mynginxapp.default.svc.cluster.local port: number: 443
Na página VirtualService, visualize o virtual service criado.
Visualize os resultados
-
Obtenha o endereço IP do ingress gateway por meio de um dos métodos abaixo:
Método 1: pelo console do ASM. Para mais detalhes, consulte a Subetapa 1 da Etapa 3 no tópico Use Istio resources to route traffic to different versions of a service.
-
Método 2: executando um comando kubectl.
Conecte-se ao cluster onde reside o pod do ingress gateway usando kubectl, seguindo as informações do arquivo kubeconfig. Em seguida, execute o comando abaixo para obter o endereço IP do ingress gateway:
kubectl get svc -n istio-system -l istio=ingressgateway
-
Execute o comando a seguir para acessar o nome de domínio aliyun.com via HTTPS:
curl -v --cacert aliyun.root.crt --resolve sample.aliyun.com:443:xx.xx.xx.xx https://sample.aliyun.comSaída esperada:
Welcome to aliyun.com without TLS Termination!%