Como ativar todo o acesso à rede de saída do Cloud Run para Anthos no Google Cloud

Por padrão, todo o tráfego de saída é bloqueado para o cluster (incluindo o acesso a APIs do Google). Para ativar todo o acesso à rede de saída, por exemplo, para se conectar a serviços do Google Cloud, como o Cloud Storage ou APIs externas, você precisa definir o escopo correto do intervalo de IP do proxy editando o mapa config-network.

Pré-requisitos

Isso pressupõe que você configurou as ferramentas de linha de comando gcloud e kubectl seguindo as instruções de configuração.

Como ativar todo o acesso de rede de saída

As instruções a seguir aplicam-se apenas a versões de cluster anteriores à versão de cluster 1.12.7-gke.17 (para clusters baseados em 1.12) ou anteriores a 1.11.9-gke.13 (para clusters baseados em 1.11). As versões mais antigas do cluster exigem que você ative o tráfego de saída para todos os endereços IP na Internet. Isso permite que seus aplicativos se conectem a endpoints não confiáveis em potencial.

Como determinar o escopo de IP do seu cluster

Para definir o escopo correto, determine os intervalos de IP atuais do seu cluster. O escopo varia dependendo da configuração do seu cluster.

  1. Chame o comando para determinar o escopo:

    gcloud container clusters describe [CLUSTER_NAME] \
    | grep -e clusterIpv4Cidr -e servicesIpv4Cidr

    Substitua [CLUSTER_NAME] pelo nome do seu cluster. Observe que é preciso fornecer o nome do cluster mesmo se você o tiver definido como o cluster padrão para a gcloud. Observe também que, se você não tiver definido a zona padrão, conforme mostrado na seção de pré-requisitos, também será necessário fornecer o parâmetro zone após o nome do cluster: --zone=[ZONE], substituindo [ZONE] pela zona do cluster.

  2. Observe os intervalos de IP mostrados no comando acima, semelhante a estes:

    ...
    clusterIpv4Cidr: 10.8.0.0/14
    servicesIpv4Cidr: 10.11.240.0/20
    ...
    

    É necessário anexar esses intervalos de IP juntos para ativar todo o acesso de saída, conforme descrito na próxima seção.

Como configurar o escopo do IP

O parâmetro istio.sidecar.includeOutboundIPRanges no ConfigMap config-network especifica os intervalos de IP que o arquivo secundário do Istio intercepta. Para permitir o acesso de saída, substitua o valor do parâmetro padrão pelos intervalos de IP do cluster recebidos nas etapas anteriores:

  1. Execute o seguinte comando para editar o mapa config-network:

    kubectl edit configmap config-network --namespace knative-serving
  2. Use um editor de sua escolha para alterar o valor do parâmetro istio.sidecar.includeOutboundIPRanges de * para o intervalo de IP que você conseguiu nas etapas anteriores. Separe várias entradas de IP com uma vírgula. Exemplo:

  # Please edit the object below. Lines beginning with a '#' will be ignored,
  # and an empty file will abort the edit. If an error occurs while saving this file will be
  # reopened with the relevant failures.
  #
  apiVersion: v1
  data:
    istio.sidecar.includeOutboundIPRanges: '10.16.0.0/14,10.19.240.0/20'
  kind: ConfigMap
  metadata:
  ...

Quando você definir o parâmetro como um conjunto válido de intervalos de endereços IP, o Istio não interceptará mais o tráfego que está indo para os endereços IP fora dos intervalos fornecidos e não será necessário especificar nenhuma regra de saída.

Se você omitir o parâmetro istio.sidecar.includeOutboundIPRanges ou defini-lo como ", o valor do parâmetro global.proxy.includeIPRanges fornecido no momento da implantação do Istio será usado: esse valor é *.

Observe que, se um valor inválido for usado, '' será usado no lugar.

  1. Salve as alterações. Observe que qualquer alteração é selecionada automaticamente e usada para todas as revisões implantadas.

Como solucionar problemas de rede de saída

Se você tiver problemas para fazer chamadas fora do seu cluster, verifique se a política foi aplicada ao pod que executa seu serviço, verificando os metadados nele. Verifique se a anotação traffic.sidecar.istio.io/includeOutboundIPRanges corresponde ao valor esperado de config-map:

  1. Verifique se há um pod em execução, já que os pods podem ser escalonados para zero:

    curl -H "Host: helloworld-go.default.example.com" http://35.203.155. 229

    Substitua o URL do host e o endereço IP por seu próprio URL e pelo endereço IP do cluster. Se você não souber como localizar o endereço IP do cluster, consulte as instruções em Como acessar seu serviço implantado.

  2. Em cinco minutos, chame este comando para conseguir a lista de pods disponíveis:

    kubectl get pods
  3. Na saída do comando get pods, localize o pod associado ao serviço: ele começará com o nome do serviço.

  4. Use esse nome de pod no comando a seguir para recuperar os metadados e ver os rótulos aplicados.

    kubectl get pod [POD_NAME] --output yaml

    Substitua [POD_NAME] pelo nome do seu pod. Consulte a documentação do pod para mais informações sobre pods.

    Você verá um resultado semelhante a este:

  apiVersion: v1
  kind: Pod
  metadata:
    annotations:
      serving.knative.dev/configurationGeneration: "2"
      sidecar.istio.io/inject: "true"
      ...
      traffic.sidecar.istio.io/includeOutboundIPRanges: 10.16.0.0/14,10.19.240.0/20
  ...

A linha que começa com traffic.sidecar.istio.io/includeOutboundIPRanges: 10.16.0.0/14,10.19.240.0/20 tem as informações mais importantes.