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:

  • productpage chama os microsserviços details e reviews para preencher a página.
  • details contém informações sobre o manual.
  • ratings contém informações de classificação de livro que acompanham uma revisão de livro.
  • reviews contém revisões de livro e chama o microsserviço ratings. O microsserviço reviews tem várias versões:
    • v1 não chama o microsserviço ratings.
    • v2 chama o microsserviço ratings e exibe classificações como 1 a 5 estrelas pretas.
    • v3 chama o microsserviço ratings e 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

  1. 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 -
    
  2. Navegue para o diretório do pacote Istio.
    cd istio-1.29.5
    
  3. Rotule o namespace default para injeção de sidecar automática.
    kubectl label namespace default istio-injection=enabled
    
  4. 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
    
  5. Assegure-se de que os microsserviços do BookInfo e seus pods correspondentes sejam implementados.
    kubectl get svc
    kubectl get pods
    
    NAME                      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

  1. 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}')
    
  2. 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}')
    
  3. Crie uma variável de ambiente GATEWAY_URL que use o host e a porta de entrada do Istio.
    export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
    
  4. Execute curl para a variável GATEWAY_URL para verificar se o app BookInfo está em execução. Uma resposta 200 significa que o app BookInfo está sendo executado adequadamente com o Istio.
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
  5. 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

  1. Crie uma variável de ambiente GATEWAY_URL que 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}')
    
  2. Execute curl para a variável GATEWAY_URL para verificar se o app BookInfo está em execução. Uma resposta 200 significa 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.

  1. Registre o endereço IP em clusters clássicos ou o nome do host em clusters VPC para o balanceador de carga istio-ingressgateway criando 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>
        ```
    
  2. 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.

  1. Registre o endereço IP em clusters clássicos ou o nome do host em clusters VPC para o balanceador de carga istio-ingressgateway criando 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>
        ```
    
  2. 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.

  1. Exclua o bookinfo-gateway existente, que não está configurado para manipular conexões TLS.
    kubectl delete gateway bookinfo-gateway
    
  2. Crie um novo arquivo de configuração bookinfo-gateway que usa a finalização TLS. Salve o arquivo YAML a seguir como bookinfo-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:
        - "*"
    
  3. Crie o novo bookinfo-gateway em seu cluster.
    kubectl apply -f bookinfo-gateway.yaml
    
  4. 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
    
  5. Tente atualizar a página várias vezes. As solicitações para https://<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.

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-gateway descreve um balanceador de carga, o serviço istio-ingressgateway no namespace istio-system que 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 bookinfo especifica as regras que controlam como as solicitações são roteadas dentro da malha de serviço definindo microsserviços como destinations. No serviço virtual bookinfo, o URI /productpage de uma solicitação é roteado para o host productpage na porta 9080. Dessa maneira, todas as solicitações para o app BookInfo são roteadas primeiro para o microsserviço productpage, 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, ratings e reviews definem 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ço productpage aleatoriamente chamando versões diferentes, v1, v2 e v3, do microsserviço reviews. As versões são selecionadas aleatoriamente porque a regra de destino reviews fornece peso igual para os subsets ou 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:

  1. Obtenha o nome do namespace no qual você deseja implementar apps gerenciados pelo Istio.

    kubectl get namespaces
    
  2. Rotule o namespace como istio-injection=enabled.

    kubectl label namespace <namespace> istio-injection=enabled
    
  3. Implemente apps no namespace rotulado ou reimplemente apps que já estão no namespace.

    kubectl apply <myapp>.yaml --namespace <namespace>
    
  4. 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>
    
  5. 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.

  6. 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
    
  7. 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.

  1. Faça download do cliente istioctl .
    curl -L https://istio.io/downloadIstio | sh -
    
  2. Navegue para o diretório do pacote Istio.
    cd istio-1.29.5
    

Para injetar os sidecars manualmente em uma implementação:

  1. Injete o sidecar do Envoy em seu YAML de implementação do app.

    istioctl kube-inject -f <myapp>.yaml | kubectl apply -f -
    
  2. Implemente seu app.

    kubectl apply <myapp>.yaml
    
  3. 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.

  4. 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.
    
  5. 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.

  1. Edite o recurso de mapa de configuração managed-istio-custom.

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. 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"
    
  3. Ative ou desative um balanceador de carga do Istio em cada zona configurando os campos istio-ingressgateway-public-1|2|3-enabled como "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"
    
  4. Salve e feche o arquivo de configuração.

  5. Verifique se os novos serviços de balanceador de carga istio-ingressgateway foram 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 carga istio-ingressgateway existente para expor seu app. Opcionalmente, o gateway pode ser configurado para a finalização do TLS.
  • Um serviço virtual chamado my-virtual-service. O my-gateway usa as regras definidas em my-virtual-service para 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 roteamento my-virtual-service.

Expondo o gateway de ingresso do Istio com o DNS sem a finalização TLS

  1. Instale o complemento gerenciado do istio em um cluster.
  2. Instale a CLI istioctl.
  3. 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:

  1. Crie um gateway que use o serviço do balanceador de carga istio-ingressgateway pú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:
        - "*"
    
  2. Aplique o gateway no namespace no qual os microsserviços gerenciados pelo Istio são implementados.

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  3. Crie um serviço virtual que use o gateway my-gateway e defina as regras de roteamento para os microsserviços do app. Se os microsserviços atendem em uma porta diferente de 80, 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.
    
  4. 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>
    
  5. 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
    
  6. 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>
    
  7. 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>
    
  8. 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

  1. Instale o complemento gerenciado do istio em um cluster.
  2. Instale a CLI istioctl.
  3. 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:

  1. 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>
        ```
    
  2. 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>
    
  3. Crie um gateway que use o serviço do balanceador de carga istio-ingressgateway pú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:
        - "*"
    
  4. Aplique o gateway no namespace no qual os microsserviços gerenciados pelo Istio são implementados.

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  5. Crie um serviço virtual que use o gateway my-gateway e 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.
    
  6. 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>
    
  7. 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
    
  8. 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.

  1. 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 de targets é 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
    
  2. Aplique a política de autenticação a um namespace.
    kubectl apply -f default.yaml -n NAMESPACE
    
  3. 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 curinga host: *.local aplica 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
    
  4. Aplique a regra de destino.
    kubectl apply -f destination-mtls.yaml -n NAMESPACE
    
  5. 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.