Configurar o proxy DNS

O proxy DNS é um recurso que oferece os seguintes recursos:

  1. Propagação de entradas de DNS de Services em clusters em uma configuração de vários clusters.
  2. Preenchendo entradas de DNS para ServiceEntry.

O Kubernetes fornece resolução de DNS apenas para Services no cluster local. Quando você precisa fornecer a resolução de nome para Services em clusters remotos ou usar um nome de host somente interno com ServiceEntry sem ter um servidor DNS somente interno adicional, o DNS Proxy oferece uma maneira de resolver nomes de DNS para esses casos.

Como configurar o proxy DNS

Configuração em todo o cluster

Para configurar o proxy DNS no cluster, adicione os metadados do proxy ISTIO_META_DNS_CAPTURE ao ConfigMap para MeshConfig. O nome do ConfigMap tem o formato de istio-<revision_name>. Para saber mais sobre a revisão, consulte a visão geral da revisão.

apiVersion: v1
data:
  mesh: |-
    ...
    defaultConfig:
      proxyMetadata:
        ISTIO_META_DNS_CAPTURE: "true"        
    ...
kind: ConfigMap
metadata:
  name: istio-<revision_name>
  namespace: istio-system

Configuração por proxy

Para configurar o proxy DNS para um proxy, adicione a anotação de metadados do proxy ISTIO_META_DNS_CAPTURE da seguinte maneira:

kind: Deployment
metadata:
  name: app1
  namespace: ns1
spec:
...
  template:
    metadata:
      annotations:
        proxy.istio.io/config: |
          proxyMetadata:
            ISTIO_META_DNS_CAPTURE: "true"
...

Verificando

Resolução de nome para Service em clusters

Após a configuração de vários clusters, implante um Service apenas em um dos clusters para verificar a resolução de nome entre clusters.

Quando você tiver o exemplo Service ns1/svc1 abaixo, encontre ClusterIP em Service.

$ kubectl get -n ns1 svc1
kind: Service
metadata:
  name: svc1
  namespace: ns1
spec:
...
  ClusterIP: 210.200.1.1
...

Em seguida, ao usar curl do outro cluster para o Service, ele vai mostrar o ClusterIP da seguinte maneira.

curl -sS -v svc1.ns1.svc.cluster.local
*   Trying 210.200.1.1:80...

Resolução de nome para ServiceEntry

Adicione um ServiceEntry com um nome de host não registrado no DNS. Para verificar a resolução de nome, o exemplo a seguir tem o endereço explícito 192.168.123.123.

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: test-service-entry
spec:
  addresses:
  - "192.168.123.123"
  hosts:
  - not-existing-hostname.internal
  ports:
  - name: http
    number: 80
    protocol: HTTP
EOF

Em seguida, tente a resolução de DNS em um pod em que o proxy de DNS está ativado. Por exemplo, se você executar um curl no pod, ele vai mostrar o endereço IP da seguinte maneira:

curl -sS -v not-existing-hostname.internal
*   Trying 192.168.123.123:80...