Ative o HTTPS em um gateway do ASM para fornecer acesso criptografado a clientes externos. Os gateways do ASM suportam carregamento dinâmico de certificados, o que permite configurar chaves privadas, certificados de servidor e certificados raiz em tempo real. Essa abordagem evita reinicializar o gateway ou depender de montagens de volume de Secret, reduzindo a complexidade operacional e eliminando o risco de interrupções de serviço. Além disso, os gateways do ASM monitoram e gerenciam vários pares de certificados e chaves privadas, oferecendo comunicação flexível e segura para diferentes hosts e aumentando a segurança na transmissão de dados.
Pré-requisitos
Informações de fundo
O Istio suporta carregamento dinâmico de certificados. A chave privada, o certificado de servidor e o certificado raiz necessários para o Transport Layer Security (TLS) podem ser configurados dinamicamente sem reiniciar o gateway. Um gateway do ASM monitora Secrets em seu namespace e os carrega dinamicamente por meio do recurso personalizado (CR) Gateway. O uso de HTTPS em um gateway do ASM oferece os seguintes benefícios:
O gateway de entrada adiciona, exclui ou atualiza dinamicamente os certificados, chaves privadas ou certificados raiz correspondentes sem necessidade de reinicialização.
Não é necessário montar volumes de Secret. Após criar um Secret do Kubernetes, o gateway do ASM o detecta e envia o certificado, a chave privada ou o certificado raiz para o gateway de entrada.
Um gateway do ASM monitora múltiplos pares de certificados e chaves privadas. Basta criar Secrets para vários hosts e atualizar a configuração do Gateway.
Etapa 1: Prepare certificados e chaves privadas
Ao usar um nome de domínio, talvez seja necessário um registro ICP (Internet Content Provider) para garantir o acesso público. Este tópico usa aliyun.com como exemplo para gerar um certificado e uma chave privada e salvá-los posteriormente como um Secret.
Se você já tiver um certificado e uma chave privada para aliyun.com, renomeie a chave para aliyun.com.key e o certificado para aliyun.com.crt. Caso contrário, 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 -
Crie um Secret ou certificado conforme a versão da sua instância do ASM.
-
Para instâncias do ASM anteriores à v1.17
Com o kubeconfig do cluster do gateway de entrada, execute o comando abaixo para criar um Secret contendo o certificado e a chave privada no namespace istio-system.
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crtImportanteO nome do Secret não deve começar com
istioouprometheuse não pode conter o campotoken. -
Para instâncias do ASM v1.17 e posteriores
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em no nome da instância do ASM desejada. No painel de navegação à esquerda, escolha .
-
Na página Certificate Management, clique em Create. No painel Certificate Information, defina os parâmetros abaixo e clique em OK.
Parâmetro
Descrição
Name
Insira um nome para o certificado. Neste exemplo, utiliza-se myexample-credential.
Public Key Certificate
Conteúdo do arquivo
aliyun.com.crtgerado na subetapa 2.Private Key
Conteúdo do arquivo
aliyun.com.keygerado na subetapa 2.
-
Etapa 2: Defina o serviço de backend para a.aliyun.com
O serviço de backend neste exemplo usa NGINX. Para o serviço de backend a.aliyun.com, as requisições ao caminho /hello retornam a string Welcome to a.aliyun.com! com código de status 200. Abaixo está o conteúdo do arquivo myexample-nginx.conf.
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 80;
location /hello {
return 200 'Welcome to a.aliyun.com!';
add_header Content-Type text/plain;
}
}
}
-
Com o kubeconfig do cluster do gateway de entrada, execute o comando abaixo para criar um ConfigMap do Kubernetes para a configuração do servidor NGINX.
kubectl create configmap myexample-nginx-configmap --from-file=nginx.conf=./myexample-nginx.conf Ative a injeção automática de proxy sidecar para o namespace padrão. Para mais informações, consulte Ativar injeção automática de proxy sidecar.
-
Crie um arquivo chamado myexampleapp.yaml com o conteúdo a seguir. Em seguida, execute o comando
kubectl apply -f myexampleapp.yamlpara criar o serviço de backend do domínio a.aliyun.com.
Etapa 3: Defina o serviço de backend para b.aliyun.com
O serviço de backend deste exemplo usa httpbin.
-
Crie um arquivo chamado httpbin.example.yaml e copie o conteúdo abaixo para ele.
-
Com o kubeconfig do cluster onde reside o pod do gateway de entrada, execute o comando abaixo para criar o serviço de backend do domínio b.aliyun.com.
kubectl apply -f httpbin.example.yaml
Etapa 4: Crie um recurso Gateway
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create from YAML.
-
Na página Create, selecione o namespace desejado (neste exemplo, default) e qualquer Scenario Template. Em seguida, insira o YAML abaixo e clique em Create.
Após criar o recurso, o novo gateway aparece na página Gateway.
Etapa 5: Crie VirtualServices
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha . Na página exibida, clique em Create from YAML.
-
Na página Create, selecione os Namespaces desejados e qualquer Scenario Template. Em seguida, insira o YAML abaixo e clique em Create.
Repita esta etapa para criar um VirtualService para b.aliyun.com.
Após criar os serviços virtuais, eles aparecem na página VirtualService.
Verifique os resultados
Obtenha o endereço do serviço do gateway de entrada
Método 1: Visualize o endereço no console do ASM. Faça login no console do ASM, selecione a instância Service Mesh desejada e escolha no painel de navegação à esquerda. Na página Ingress Gateway, visualize as informações necessárias.
Método 2: Visualize o endereço no console do ACK. Para mais informações, consulte Visualizar informações de serviço de um gateway de entrada.
Acesse o gateway de entrada via linha de comando
-
Execute o comando abaixo para acessar o serviço a.aliyun.com via HTTPS.
curl -k -H Host:a.aliyun.com --resolve a.aliyun.com:443:{REPLACE_WITH_THE_INGRESS_GATEWAY_IP_ADDRESS} https://a.aliyun.com/helloSaída esperada:
Welcome to a.aliyun.com! -
Execute o comando abaixo para acessar o serviço b.aliyun.com via HTTPS.
curl -k -H Host:b.aliyun.com --resolve b.aliyun.com:443:{REPLACE_WITH_THE_INGRESS_GATEWAY_IP_ADDRESS} https://b.aliyun.com/status/418Saída esperada:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`
Operações relacionadas
Atualize o certificado do gateway
Para atualizar o certificado montado em um gateway, crie um novo Secret no plano de dados e altere o valor do campo credentialName no recurso Gateway para o nome do novo Secret. O gateway monta automaticamente o novo Secret. Este exemplo demonstra como criar um Secret chamado new-istio-ingressgateway-certs para o servidor example.com.
-
Crie um certificado cujo emissor seja myexample.
-
Na ferramenta OpenSSL, 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=example.com' -keyout example.root.key -out example.root.crt -
Execute os comandos a seguir para gerar um certificado de servidor e uma chave privada para o servidor example.com.
openssl req -out example.com.csr -newkey rsa:2048 -nodes -keyout example.com.key -subj "/CN=example.com/O=myexample organization" openssl x509 -req -days 365 -CA example.root.crt -CAkey example.root.key -set_serial 0 -in example.com.csr -out example.com.crt Obtenha o arquivo kubeconfig do cluster e use kubectl para conectar-se ao cluster.
-
Execute o comando abaixo para criar um Secret chamado new-istio-ingressgateway-certs.
kubectl create -n istio-system secret tls new-istio-ingressgateway-certs --key example.com.key --cert example.com.crt
-
-
Execute o comando abaixo no cluster para excluir o Secret do certificado antigo.
kubectl delete secret istio-ingressgateway-certs -n istio-system -
Atualize o recurso Gateway.
Faça login no console do ASM. No painel de navegação à esquerda, escolha .
Na página Mesh Management, clique em no nome da instância do ASM. No painel de navegação à esquerda, escolha .
Na página Gateway, localize o recurso Gateway desejado e clique em View YAML na coluna Actions.
Na caixa de diálogo edit, altere o valor de credentialName para o nome do novo Secret de certificado, new-istio-ingressgateway-certs, e clique em OK.
-
Verifique se o certificado do gateway foi atualizado.
-
Execute o comando abaixo para visualizar as informações atuais do certificado no cluster.
kubectl exec istio-ingressgateway-xxxx -n istio-system -- curl localhost:15000/config_dump > ingressgateway_dump.yaml -
Execute o comando abaixo para imprimir e buscar o certificado new-istio-ingressgateway-certs.
cat ingressgateway_dump.yaml | grep new-istio-ingressgateway-certs -A 3Saída esperada:
"name": "kubernetes://new-istio-ingressgateway-certs", "tls_certificate": { "certificate_chain": { "inline_bytes": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t..." } }Copie o conteúdo após o parâmetro inline_bytes para obter o certificado codificado em Base64.
-
Execute o comando abaixo na sua ferramenta de linha de comando local para decodificar o certificado em Base64.
echo <Base64-encoded-certificate-content> | base64 --decode Salve o conteúdo decodificado como um arquivo test.com.crt.
-
Execute o comando abaixo na ferramenta OpenSSL para visualizar a organização do certificado.
openssl x509 -in test.com.crt -text -nooutSaída esperada:
Certificate: Data: Version: 1 (0x0) Serial Number: 0 (0x0) Signature Algorithm: sha256WithRSAEncryption Issuer: O = myexample Inc., CN = example.com Validity Not Before: Mar 17 03:20:27 2022 GMT Not After : Mar 17 03:20:27 2023 GMT Subject: CN = example.com, O = myexample organizationNote que a organização foi alterada com sucesso para
myexample, o que indica que o certificado do gateway foi atualizado corretamente.
-