Cómo configurar el proxy de DNS

El proxy de DNS es una función que proporciona las siguientes capacidades:

  1. Propagación de entradas de DNS de Services en clústeres en una configuración de varios clústeres
  2. Se propagan las entradas de DNS para ServiceEntry.

Kubernetes proporciona resolución de DNS solo para Services en el clúster local. Cuando necesitas proporcionar una resolución de nombres para Services en un clúster remoto o usar un nombre de host solo interno con ServiceEntry sin tener un servidor DNS solo interno adicional, el proxy de DNS proporciona una forma de resolver nombres de DNS para esos casos.

Configura el proxy de DNS

Configuración de todo el clúster

Para configurar el proxy de DNS en el clúster, agrega los metadatos del proxy ISTIO_META_DNS_CAPTURE al ConfigMap de MeshConfig. El nombre de ConfigMap tiene el formato istio-<revision_name>. Para conocer los detalles de la revisión, consulta la descripción general de la revisión.

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

Configuración por proxy

Para configurar el proxy de DNS para un proxy, agrega la anotación de metadatos de proxy ISTIO_META_DNS_CAPTURE de la siguiente manera:

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

Verificando

Resolución de nombres para Service en varios clústeres

Después de la configuración de varios clústeres, implementa un Service solo en uno de los clústeres para verificar la resolución de nombres entre clústeres.

Cuando tienes el siguiente ejemplo Service ns1/svc1, puedes encontrar ClusterIP en Service.

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

Luego, cuando uses curl del clúster other en Service, debería mostrar el ClusterIP de la siguiente manera.

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

Resolución de nombres para ServiceEntry

Agrega un ServiceEntry con un nombre de host que no esté registrado en tu DNS. Para verificar la resolución de nombres, el siguiente ejemplo tiene la dirección explícita 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

Luego, prueba la resolución de DNS en un Pod en el que el proxy de DNS esté habilitado. Por ejemplo, si ejecutas un curl en el Pod, debería mostrar la dirección IP de la siguiente manera:

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