Configure o proxy DNS

O proxy de DNS é uma funcionalidade que oferece as seguintes capacidades:

  1. Propagar entradas DNS de Services em clusters numa configuração de vários clusters.
  2. Preencher as entradas de DNS para ServiceEntry.

O Kubernetes fornece resolução de DNS apenas para Services no cluster local. Quando precisa de fornecer resolução de nomes para Services em clusters remotos ou usar um nome do anfitrião apenas interno com ServiceEntry sem ter um servidor DNS apenas interno adicional, o proxy DNS oferece uma forma de resolver nomes DNS para esses casos.

Configurar o proxy de DNS

Configuração ao nível do cluster

Para configurar o proxy DNS no cluster, adicione metadados de proxy ISTIO_META_DNS_CAPTURE ao ConfigMap para MeshConfig. O nome do ConfigMap tem o formato istio-<revision_name>. Para ver os detalhes da revisão, consulte a vista 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 forma:

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

A validar

Resolução de nomes para Service em vários clusters

Após a configuração de vários clusters, implemente um Service apenas num dos clusters para validar a resolução do nome entre clusters.

Quando tem o seguinte exemplo de Service ns1/svc1, pode encontrar ClusterIP em Service.

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

Em seguida, quando usar curl do cluster other para Service, deve apresentar ClusterIP da seguinte forma.

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

Resolução de nomes para ServiceEntry

Adicione um ServiceEntry com um nome de anfitrião não registado no seu DNS. Para validar a resolução de nomes, o exemplo seguinte 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, experimente a resolução de DNS num Pod onde o proxy de DNS está ativado. Por exemplo, se executar um curl no Pod, deve apresentar o endereço IP da seguinte forma:

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