Gerenciando e expondo apps na malha de serviços
Após você instalar o complemento do Istio em seu cluster, será possível implementar os seus apps na malha de serviço do Istio configurando a injeção de sidecar do proxy do Envoy e expondo os seus apps com um subdomínio.
Entendendo o app de amostra BookInfo
O aplicativo de amostra BookInfo para Istio inclui a configuração de demo base e as regras de destino padrão para que você possa experimentar os recursos do Istio imediatamente.
No Istio versão 1.4 e mais recente, o BookInfo não é oferecido como um complemento gerenciado e deve ser instalado separadamente. Para instalar o BookInfo, consulte Configurando o aplicativo de amostra BookInfo.
Os quatro microsserviços de BookInfo incluem:
productpagechama os microsserviçosdetailsereviewspara preencher a página.detailscontém informações sobre o manual.ratingscontém informações de classificação de livro que acompanham uma revisão de livro.reviewscontém revisões de livro e chama o microsserviçoratings. O microsserviçoreviewstem várias versões:v1não chama o microsserviçoratings.v2chama o microsserviçoratingse exibe classificações como 1 a 5 estrelas pretas.v3chama o microsserviçoratingse exibe classificações como 1 a 5 estrelas vermelhas.
Os YAMLs de implementação para cada um desses microsserviços são modificados para que os proxies do sidecar do Envoy sejam pré-injetados como contêineres nos pods de microsserviços antes de serem implementados. Para obter mais informações sobre a injeção de sidecar manual, consulte a Documentação do Istio. O app BookInfo também já está exposto em um endereço IP público por um gateway do Istio. Embora o app BookInfo possa ajudá-lo a começar, o app não é destinado ao uso de produção.
Configurando o aplicativo de amostra BookInfo
- Instale o BookInfo em seu cluster. Faça download do pacote do Istio mais recente para o seu sistema operacional, que inclui os arquivos de configuração para o app BookInfo.
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.29.5 sh - - Navegue para o diretório do pacote Istio.
cd istio-1.29.5 - Rotule o namespace
defaultpara injeção de sidecar automática.kubectl label namespace default istio-injection=enabled - Implemente o aplicativo BookInfo, o gateway e as regras de destino.
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml - Assegure-se de que os microsserviços do BookInfo e seus pods correspondentes sejam implementados.
kubectl get svc kubectl get podsNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 172.21.19.104 <none> 9080/TCP 2m kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 1d productpage ClusterIP 172.21.168.196 <none> 9080/TCP 2m ratings ClusterIP 172.21.11.131 <none> 9080/TCP 2m reviews ClusterIP 172.21.117.164 <none> 9080/TCP 2m NAME READY STATUS RESTARTS AGE details-v1-6865b9b99d-7v9h8 2/2 Running 0 2m productpage-v1-f8c8fb8-tbsz9 2/2 Running 0 2m ratings-v1-77f657f55d-png6j 2/2 Running 0 2m reviews-v1-6b7f6db5c5-fdmbq 2/2 Running 0 2m reviews-v2-7ff5966b99-zflkv 2/2 Running 0 2m reviews-v3-5df889bcff-nlmjp 2/2 Running 0 2m
Acessando publicamente o BookInfo
Obtenha o endereço público para o balanceador de carga istio-ingressgateway que expõe o BookInfo.
Criando uma URL de gateway em clusters Clássicos
- Configure o host de entrada do Istio.
export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - Configure a porta de entrada do Istio.
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}') - Crie uma variável de ambiente
GATEWAY_URLque use o host e a porta de entrada do Istio.export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT - Execute curl para a variável
GATEWAY_URLpara verificar se o app BookInfo está em execução. Uma resposta200significa que o app BookInfo está sendo executado adequadamente com o Istio.curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage - Tente atualizar a página várias vezes. Versões diferentes da seção de revisões fazem round-robin por estrelas vermelhas, por estrelas negras e por nenhuma estrela.
Criando uma URL de gateway em clusters VPC
- Crie uma variável de ambiente
GATEWAY_URLque use o nome do host de ingresso Istio.export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') - Execute curl para a variável
GATEWAY_URLpara verificar se o app BookInfo está em execução. Uma resposta200significa que o app BookInfo está sendo executado adequadamente com o Istio.curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
Visualizando a página da web do BookInfo em um navegador
Execute o comando a seguir com base em sua operação para visualizar o app BookInfo em seu navegador.
Mac OS ou Linux
open http://$GATEWAY_URL/productpage
Windows
start http://$GATEWAY_URL/productpage
Tente atualizar a página várias vezes. Versões diferentes da seção de revisões fazem round-robin por estrelas vermelhas, por estrelas negras e por nenhuma estrela.
Expondo o BookInfo usando um subdomínio fornecido pela IBM sem TLS
Quando você ativa o complemento do BookInfo em seu cluster, o gateway bookinfo-gateway do Istio é criado para você. O gateway usa as regras de serviço virtual e de destino do Istio para configurar um balanceador de carga, istio-ingressgateway,
que expõe publicamente o app BookInfo. Nas etapas a seguir, você cria um subdomínio para o endereço IP do balanceador de carga istio-ingressgateway em clusters clássicos ou o nome do host em clusters VPC por meio dos quais é
possível acessar publicamente o BookInfo.
- Registre o endereço IP em clusters clássicos ou o nome do host em clusters VPC para o balanceador de carga
istio-ingressgatewaycriando um subdomínio do DNS.- Clássico:
ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --cluster <cluster_name_or_id> ``` * VPC: ```sh {: pre} ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --cluster <cluster_name_or_id> ``` - Verifique se o subdomínio foi criado e copie o subdomínio.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
Exemplo de saída para clusters clássicos
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name
mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>
Exemplo de saída para clusters VPC
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name
mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
Em um navegador da web, abra a página do produto BookInfo. Como nenhum TLS é configurado, certifique-se de que você usa HTTP.
http://<subdomain>/productpage
Tente atualizar a página várias vezes. As solicitações para http://<subdomain>/productpage são recebidas pelo balanceador de carga do Istio Gateway. As diferentes versões do microsserviço reviews ainda são retornadas
aleatoriamente porque o gateway do Istio gerencia as regras de serviço virtual e de roteamento de destino para microsserviços.
Expondo o BookInfo usando um subdomínio fornecido pela IBM com TLS
Quando você ativa o complemento do BookInfo em seu cluster, o gateway bookinfo-gateway do Istio é criado para você. O gateway usa as regras de serviço virtual e de destino do Istio para configurar um balanceador de carga, istio-ingressgateway,
que expõe publicamente o app BookInfo. Nas etapas a seguir, você cria um subdomínio para o endereço IP do balanceador de carga istio-ingressgateway em clusters clássicos ou o nome do host em clusters VPC por meio dos quais é
possível acessar publicamente o BookInfo. Você também usa o certificado SSL para permitir conexões HTTPS com o app BookInfo.
-
Registre o endereço IP em clusters clássicos ou o nome do host em clusters VPC para o balanceador de carga
istio-ingressgatewaycriando um subdomínio do DNS.- Clássico:
ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --secret-namespace istio-system --cluster <cluster_name_or_id> ``` * VPC: ```sh {: pre} ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --secret-namespace istio-system --cluster <cluster_name_or_id> ``` -
Verifique se o subdomínio foi criado e anote o nome de seu segredo de SSL no campo Nome do segredo do certificado SSL.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>Exemplo de saída para clusters clássicos.
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>Exemplo de saída para clusters VPC
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate>
Configurando o bookinfo-gateway para usar a rescisão de TLS
Conclua as etapas a seguir para configurar a rescisão de TLS para o bookinfo-gateway.
- Exclua o
bookinfo-gatewayexistente, que não está configurado para manipular conexões TLS.kubectl delete gateway bookinfo-gateway - Crie um novo arquivo de configuração
bookinfo-gatewayque usa a finalização TLS. Salve o arquivo YAML a seguir comobookinfo-gateway.yaml. Substitua<secret_name>pelo nome do segredo SSL localizado anteriormente.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: <secret_name> hosts: - "*" - Crie o novo
bookinfo-gatewayem seu cluster.kubectl apply -f bookinfo-gateway.yaml - Em um navegador da web, abra a página do produto BookInfo. Certifique-se de que você usa HTTPS para o subdomínio encontrado na etapa 2.
https://<subdomain>/productpage - Tente atualizar a página várias vezes. As solicitações para
https://<subdomain>/productpagesão recebidas pelo balanceador de carga do Istio Gateway. As diferentes versões do microsserviçoreviewsainda são retornadas aleatoriamente porque o gateway do Istio gerencia as regras de serviço virtual e de roteamento de destino para microsserviços.
Entendendo o que aconteceu
O BookInfo de amostra demonstra como três componentes de gerenciamento de tráfego do Istio trabalham juntos para rotear o tráfego de ingresso para o app.
Gateway- O Gateway
bookinfo-gatewaydescreve um balanceador de carga, o serviçoistio-ingressgatewayno namespaceistio-systemque age como o ponto de entrada para tráfego HTTP/TCP de entrada para o BookInfo. O Istio configura o balanceador de carga para atender solicitações recebidas nos apps gerenciados pelo Istio nas portas que estão definidas no arquivo de configuração de gateway. Para ver o arquivo de configuração para o gateway BookInfo, execute o comando a seguir.
kubectl get gateway bookinfo-gateway -o yaml
VirtualService- O VirtualService
bookinfoespecifica as regras que controlam como as solicitações são roteadas dentro da malha de serviço definindo microsserviços comodestinations. No serviço virtualbookinfo, o URI/productpagede uma solicitação é roteado para o hostproductpagena porta9080. Dessa maneira, todas as solicitações para o app BookInfo são roteadas primeiro para o microsserviçoproductpage, que, em seguida, chama os outros microsserviços do BookInfo. Para ver a regra de serviço virtual, execute o comando a seguir.
kubectl get virtualservice bookinfo -o yaml
DestinationRule- Depois que o gateway roteia a solicitação de acordo com a regra de serviço virtual, os DestinationRules
details,productpage,ratingsereviewsdefinem as políticas que são aplicadas à solicitação quando ela atinge um microsserviço. Por exemplo, quando você atualiza a página do produto BookInfo, as mudanças que você vê são o resultado do microsserviçoproductpagealeatoriamente chamando versões diferentes,v1,v2ev3, do microsserviçoreviews. As versões são selecionadas aleatoriamente porque a regra de destinoreviewsfornece peso igual para ossubsetsou as versões nomeadas do microsserviço. Esses subconjuntos são usados pelas regras de serviço virtual quando o tráfego é roteado para versões específicas do serviço. Para ver as regras de destino que são aplicadas a BookInfo, execute o comando a seguir.
kubectl describe destinationrules
Incluindo apps na malha de serviço do Istio configurando a injeção de sidecar
Pronto para gerenciar seus próprios apps usando o Istio? Antes de implementar seu app, deve-se primeiro decidir como você deseja injetar os sidecars de proxy do Envoy nos pods do app.
Cada pod do app deve estar executando um sidecar de proxy Envoy para que os microsserviços estejam na malha de serviço. É possível certificar-se de que os sidecars sejam injetados em cada pod de app automaticamente ou manualmente. Para obter mais informações sobre a injeção de sidecar, consulte a Documentação do Istio.
Ativando a injeção automática de sidecar
Quando a injeção automática de sidecar está ativada, um namespace atende quaisquer novas implementações e modifica automaticamente a especificação do modelo de pod para que os pods de app sejam criados com contêineres de sidecar do proxy do Envoy. Ative a injeção de sidecar automática para um namespace quando planejar implementar múltiplos apps que você deseja integrar com o Istio nesse namespace. A injeção automática de sidecar não está ativada para nenhum namespace por padrão no complemento gerenciado pelo Istio.
Não ative a injeção de sidecar para os namespaces kube-system, ibm-system, ou ibm-operators.
Para ativar a injeção de sidecar automática para um namespace:
-
Obtenha o nome do namespace no qual você deseja implementar apps gerenciados pelo Istio.
kubectl get namespaces -
Rotule o namespace como
istio-injection=enabled.kubectl label namespace <namespace> istio-injection=enabled -
Implemente apps no namespace rotulado ou reimplemente apps que já estão no namespace.
kubectl apply <myapp>.yaml --namespace <namespace> -
Opcional para reimplementar um aplicativo nesse namespace, exclua o pod do app de modo que ele seja implementado com o sidecar injetado.
kubectl delete pod -l app=<myapp> -
Se você não criou um serviço para expor o seu aplicativo, crie um serviço Kubernetes. Seu app deve ser exposto por um serviço do Kubernetes para ser incluído como um microsserviço na malha de serviço Istio. Assegure-se de seguir os Requisitos do Istio para pods e serviços.
-
Defina um serviço para o app.
apiVersion: v1 kind: Service metadata: name: myappservice spec: selector: <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs. ports: - protocol: TCP port: 8080 # The port that the service listens on -
Crie o serviço em seu cluster. Assegure-se de que o serviço seja implementado no mesmo namespace que o app.
kubectl apply -f myappservice.yaml -n <namespace>
Os pods de app são agora integrados à sua malha de serviço do Istio porque eles têm o contêiner sidecar do Istio que é executado ao lado do contêiner do app.
Injetando os sidecars manualmente
Se você não desejar ativar a injeção sidecar automática para um namespace, poderá injetar manualmente o sidecar em um YAML de implementação. Injete sidecars manualmente quando os apps estiverem em execução em espaços de nomes em outras implementações nas quais você não quer que os sidecars sejam injetados automaticamente.
Não ative a injeção de sidecar para os namespaces kube-system, ibm-system, ou ibm-operators.
- Faça download do cliente
istioctl.curl -L https://istio.io/downloadIstio | sh - - Navegue para o diretório do pacote Istio.
cd istio-1.29.5
Para injetar os sidecars manualmente em uma implementação:
-
Injete o sidecar do Envoy em seu YAML de implementação do app.
istioctl kube-inject -f <myapp>.yaml | kubectl apply -f - -
Implemente seu app.
kubectl apply <myapp>.yaml -
Se você não criou um serviço para expor o seu aplicativo, crie um serviço Kubernetes. Seu app deve ser exposto por um serviço do Kubernetes para ser incluído como um microsserviço na malha de serviço Istio. Assegure-se de seguir os Requisitos do Istio para pods e serviços.
-
Defina um serviço para o app.
apiVersion: v1 kind: Service metadata: name: myappservice spec: selector: <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs. ports: - protocol: TCP port: 8080 # The port that the service listens on. -
Crie o serviço em seu cluster. Assegure-se de que o serviço seja implementado no mesmo namespace que o app.
kubectl apply -f myappservice.yaml -n <namespace>
Os pods de app são agora integrados à sua malha de serviço do Istio porque eles têm o contêiner sidecar do Istio que é executado ao lado do contêiner do app.
Ativação ou desativação de balanceadores de carga públicos Istio em addon-istio 1.23
Por padrão, um balanceador de carga público do Istio, istio-ingressgateway, fica ativado no cluster para balancear a carga de solicitações recebidas da Internet para seus apps gerenciados pelo Istio. É possível obter maior disponibilidade
ativando um balanceador de carga do Istio em cada zona de seu cluster.
-
Edite o recurso de mapa de configuração
managed-istio-custom.kubectl edit cm managed-istio-custom -n ibm-operators -
Verifique se todas as suas zonas de cluster estão nos campos
istio-ingressgateway-zone.Exemplo de um cluster multizona clássico em Dallas:
istio-ingressgateway-zone-1: "dal10" istio-ingressgateway-zone-2: "dal12" istio-ingressgateway-zone-3: "dal13" -
Ative ou desative um balanceador de carga do Istio em cada zona configurando os campos
istio-ingressgateway-public-1|2|3-enabledcomo"true"ou"false".Se você deseja que os aplicativos sejam acessíveis aos clientes, assegure-se de que pelo menos um balanceador de carga esteja ativado ou crie balanceadores de carga de gateway customizados. Se você desativar todos os balanceadores de carga em todas as zonas, o app não será mais exposto e não poderá ser acessado externamente.
Exemplo para ativar um gateway público em cada zona:
istio-ingressgateway-public-1-enabled: "true" istio-ingressgateway-public-2-enabled: "true" istio-ingressgateway-public-3-enabled: "true" -
Salve e feche o arquivo de configuração.
-
Verifique se os novos serviços de balanceador de carga
istio-ingressgatewayforam criados.kubectl get svc -n istio-system
Para expor os apps gerenciados pelo Istio usando os serviços de balanceador de carga istio-ingressgateway, especifique o seletor istio: ingressgateway no recurso Gateway. Para obter mais informações, consulte
Expondo apps gerenciados pelo Istio.
Expondo o gateway de ingresso do Istio com o DNS
Exponha publicamente os apps gerenciados pelo Istio, criando uma entrada DNS para o balanceador de carga istio-ingressgateway e configurando o balanceador de carga para encaminhar o tráfego para o seu app.
Nas etapas a seguir, você configurou um subdomínio por meio do qual seus usuários podem acessar seu app criando os recursos a seguir:
- Um gateway chamado
my-gateway. Esse gateway atua como o ponto de entrada público para seus apps e usa o serviço do balanceador de cargaistio-ingressgatewayexistente para expor seu app. Opcionalmente, o gateway pode ser configurado para a finalização do TLS. - Um serviço virtual chamado
my-virtual-service. Omy-gatewayusa as regras definidas emmy-virtual-servicepara rotear o tráfego para o app. - Um subdomínio para o balanceador de carga
istio-ingressgateway. Todas as solicitações do usuário para o subdomínio são encaminhadas para seu app de acordo com suas regras de roteamentomy-virtual-service.
Expondo o gateway de ingresso do Istio com o DNS sem a finalização TLS
- Instale o complemento gerenciado do
istioem um cluster. - Instale a CLI
istioctl. - Configure a injeção de sidecar para microsserviços de app, implemente os microsserviços de app em um espaço de nomes e crie serviços de Kubernetes para os microsserviços de app para que eles estejam na malha de serviço do Istio.
Para expor apps publicamente:
-
Crie um gateway que use o serviço do balanceador de carga
istio-ingressgatewaypúblico para expor a porta 80 para HTTP. Substitua<namespace>pelo espaço de nomes no qual os microsserviços gerenciados por Istio estão implementados. Para obter mais informações sobre os componentes do YAML do gateway, consulte a Documentação de referência do Istio.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway spec: selector: app: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "*" -
Aplique o gateway no namespace no qual os microsserviços gerenciados pelo Istio são implementados.
kubectl apply -f my-gateway.yaml -n <namespace> -
Crie um serviço virtual que use o gateway
my-gatewaye defina as regras de roteamento para os microsserviços do app. Se os microsserviços atendem em uma porta diferente de80, inclua essa porta. Para obter mais informações sobre os componentes do YAML do serviço virtual, consulte a Documentação de referência do Istio.apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: my-virtual-service namespace: <namespace> # The namespace where your Istio-managed microservices are deployed. spec: gateways: - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer. hosts: - '*' http: - match: - uri: exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`. route: - destination: host: <service_name> # Replace `service_name` with the name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices. port: number: 80 # If your microservice listens on a different port, replace `80` with the port. -
Aplique as regras de serviço virtual no namespace no qual o microsserviço gerenciado pelo Istio está implementado.
kubectl apply -f my-virtual-service.yaml -n <namespace> -
Obtenha o endereço EXTERNAL-IP (clusters clássicos) ou o nome do host (clusters da VPC) para o balanceador de carga público
istio-ingressgateway. Caso você tenha habilitado um balanceador de carga do Istio em cada zona do seu cluster, obtenha o endereço IP ou o nome do host do serviço do balanceador de carga em cada zona.kubectl get svc -n istio-system# Example output for classic clusters istio-ingressgateway LoadBalancer 172.21.XXX.XXX 169.1.1.1 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m# Example output for VPC clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 1234abcd-us-south.lb.appdomain.cloud 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m -
Registre o IP do balanceador de carga ou o nome do host criando um subdomínio de DNS. Para obter mais informações sobre o registro de subdomínios DNS em IBM Cloud Kubernetes Service, consulte Classic: Registro de um subdomínio NLB ou informações sobre o registro de um nome de host de balanceador de carga VPC com um subdomínio DNS para um VPC ALB ou VPC NLB.
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]Exemplo de comando para clusters de VPC.
ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> -
Verifique se o subdomínio foi criado. Na saída, copie o nome do seu segredo de SSL no campo Nome do segredo do certificado de SSL.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>Exemplo de saída para clusters clássicos.
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>Exemplo de saída para clusters de VPC.
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate> -
Verifique se o tráfego é encaminhado para os seus microsserviços gerenciados pelo Istio inserindo a URL do microsserviço do app.
http://<host_name>/<service_path>
Procurando um controle com uma granularidade ainda mais baixa sobre o roteamento? Para criar regras que são aplicadas após o balanceador de carga rotear o tráfego para cada microsserviço, como regras para envio de tráfego para diferentes versões
de um microsserviço, é possível criar e aplicar DestinationRules.
Necessidade de depurar configurações de ingresso ou egresso? Certifique-se de que a opção istio-global-proxy-accessLogFile no configmap managed-istio-custom esteja configurada como "/dev/stdout". Os proxies Envoy imprimem informações de acesso para sua saída padrão, que é possível visualizar executando comandos kubectl logs para os contêineres do Envoy. Se
você notar que o pod ibm-cloud-provider-ip para um gateway está preso em pending, consulte este tópico de resolução de problemas.
Expondo o gateway de ingresso do Istio com o DNS com a finalização TLS
- Instale o complemento gerenciado do
istioem um cluster. - Instale a CLI
istioctl. - Configure a injeção de sidecar para microsserviços de app, implemente os microsserviços de app em um espaço de nomes e crie serviços de Kubernetes para os microsserviços de app para que eles estejam na malha de serviço do Istio.
Para expor apps publicamente:
-
Registre o IP do balanceador de carga ou o nome do host criando um subdomínio de DNS. Para obter mais informações sobre como registrar subdomínios de DNS no IBM Cloud Kubernetes Service, consulte Clássico: registrando um subdomínio do NLB ou Registrando um nome de host do balanceador de carga da VPC com um subdomínio de DNS.
- Clusters clássicos:
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...] ``` * Clusters de VPC: ```sh {: pre} ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> ``` -
Verifique se o subdomínio foi criado. Na saída, copie o nome do seu segredo de SSL no campo Nome do segredo do certificado de SSL.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id># Example output for classic clusters: Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate># Example output for VPC clusters: Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate> -
Crie um gateway que use o serviço do balanceador de carga
istio-ingressgatewaypúblico para expor a porta 80 para HTTP. Substitua<namespace>pelo espaço de nomes no qual os microsserviços gerenciados por Istio estão implementados. Para obter mais informações sobre os componentes do YAML do gateway, consulte a Documentação de referência do Istio.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: my-gateway namespace: <namespace> spec: selector: istio: ingressgateway servers: - port: name: https protocol: HTTPS number: 443 tls: mode: SIMPLE serverCertificate: /etc/istio/ingressgateway-certs/tls.crt privateKey: /etc/istio/ingressgateway-certs/tls.key hosts: - "*" -
Aplique o gateway no namespace no qual os microsserviços gerenciados pelo Istio são implementados.
kubectl apply -f my-gateway.yaml -n <namespace> -
Crie um serviço virtual que use o gateway
my-gatewaye defina as regras de roteamento para os microsserviços do app. Para obter mais informações sobre os componentes do YAML do serviço virtual, consulte a Documentação de referência do Istio.apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: my-virtual-service namespace: <namespace> # The namespace where your Istio-managed microservices are deployed. spec: gateways: - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer. hosts: - '*' http: - match: - uri: exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`. route: - destination: host: <service_name> # The name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices. port: number: 443 # If your microservice listens on a different port, replace 443 with the port. -
Aplique as regras de serviço virtual no namespace no qual o microsserviço gerenciado pelo Istio está implementado.
kubectl apply -f my-virtual-service.yaml -n <namespace> -
Obtenha o endereço EXTERNAL-IP (clusters clássicos) ou o nome do host (clusters da VPC) para o balanceador de carga público
istio-ingressgateway. Caso você tenha habilitado um balanceador de carga do Istio em cada zona do seu cluster, obtenha o endereço IP ou o nome do host do serviço do balanceador de carga em cada zona.kubectl get svc -n istio-system# Example output for classic clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 169.1.1.1 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m# Example output for VPC clusters: istio-ingressgateway LoadBalancer 172.21.XXX.XXX 1234abcd-us-south.lb.appdomain.cloud 80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP 22m -
Verifique se o tráfego é encaminhado para os seus microsserviços gerenciados pelo Istio inserindo a URL do microsserviço do app.
https://<host_name>/<service_path>
Os certificados para o segredo do host DNS do NLB expiram a cada 90 dias. O segredo no namespace padrão é renovado automaticamente pela IBM Cloud Kubernetes Service 37 dias antes de expirar, mas deve-se copiar manualmente o segredo para o
namespace istio-system toda vez que ele for renovado. Use scripts para automatizar esse processo.
Procurando um controle com uma granularidade ainda mais baixa sobre o roteamento? Para criar regras que são aplicadas após o balanceador de carga rotear o tráfego para cada microsserviço, como regras para envio de tráfego para diferentes versões
de um microsserviço, é possível criar e aplicar DestinationRules.
Necessidade de depurar configurações de ingresso ou egresso? Certifique-se de que a opção istio-global-proxy-accessLogFile no configmap managed-istio-custom esteja configurada como "/dev/stdout". Os proxies Envoy imprimem informações de acesso para sua saída padrão, que é possível visualizar executando comandos kubectl logs para os contêineres do Envoy. Se
você notar que o pod ibm-cloud-provider-ip para um gateway está preso em pending, consulte este tópico de resolução de problemas.
Protegendo o tráfego dentro do cluster ativando o mTLS
Ative a criptografia para cargas de trabalho em um namespace para atingir o TLS mútuo (mTLS) dentro do cluster. O tráfego roteado pelo Envoy entre os pods no cluster é criptografado com o TLS. O gerenciamento de certificado para o mTLS é manipulado pelo Istio. Para obter mais informações, consulte a documentação Istio mutual TLS.
- Crie um arquivo de política de autenticação denominado
default.yaml. Essa política tem escopo de namespace definido e configura cargas de trabalho na malha de serviço para aceitar somente solicitações criptografadas com TLS. Observe que nenhuma especificação detargetsé incluída porque a política se aplica a todos os serviços na malha nesse namespace.apiVersion: "security.istio.io/v1beta1" kind: "PeerAuthentication" metadata: name: "default" spec: mtls: mode: STRICT - Aplique a política de autenticação a um namespace.
kubectl apply -f default.yaml -n NAMESPACE - Crie um arquivo de regras de destino denominado
destination-mtls.yaml. Esta política configura cargas de trabalho mistas de serviço em um namespace para enviar tráfego usando o TLS. Observe que o curingahost: *.localaplica essa regra de destino a todos os serviços na malha.apiVersion: "networking.istio.io/v1beta1" kind: "DestinationRule" metadata: name: "destination-mtls" spec: host: "*.local" trafficPolicy: tls: mode: ISTIO_MUTUAL - Aplique a regra de destino.
kubectl apply -f destination-mtls.yaml -n NAMESPACE - Se você quiser ativar o recurso “ mTLS ” para cargas de trabalho de service mesh em outros namespaces, repita essas etapas em cada namespace.
As regras de destino também são usadas para motivos que não são de autenticação, como o roteamento do tráfego para diferentes versões de um serviço. Qualquer regra de destino criada para um serviço também deve conter o mesmo bloco do TLS configurado
como mode: ISTIO_MUTUAL. Esse bloco evita que a regra substitua as configurações abrangentes de mTLS de malha configuradas nessa seção.