Configura el proxy de DNS

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

  1. Propaga las entradas de DNS de Services en los clústeres de una configuración de varios clústeres.
  2. Se están propagando las entradas de DNS para ServiceEntry.

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

Configuración del proxy de DNS

Para configurar el proxy de DNS, configura la marca ISTIO_META_DNS_CAPTURE de la siguiente manera. Puedes elegir la configuración del clúster o la configuración por proxy.

Configuración en todo el clúster

Para configurar el proxy de DNS en el clúster, agrega metadatos de proxy ISTIO_META_DNS_CAPTURE a ConfigMap para MeshConfig. El nombre de ConfigMap tiene el formato istio-<revision_name>. Para obtener detalles sobre 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 del 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

Para verificar que todo esté configurado correctamente, sigue los pasos.

Resolución de nombres para Service en todos los 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 desde el clúster other hasta Service, debería mostrar 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, intenta 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...

Asignación automática de IP para ServiceEntry

Cuando usas ServiceEntry con el proxy de DNS, puedes habilitar de forma opcional la asignación automática de IP. Cuando se habilita, las direcciones IP internas (del rango 240.240.0.0/16) se asignan automáticamente para los hosts ServiceEntry que no especifican direcciones IP explícitas en spec.addresses.

Cómo habilitar la asignación automática de IP

Para habilitar la asignación automática de IP, sigue las instrucciones para la implementación de tu plano de control:

TRAFFIC_DIRECTOR

Para la implementación del plano de control TRAFFIC_DIRECTOR, configura la asignación automática de IP en asm-options ConfigMap dentro del espacio de nombres istio-system estableciendo ip_auto_allocation: "true".

En el siguiente ejemplo, se muestra un asm-options ConfigMap con la asignación automática de IP habilitada:

apiVersion: v1
kind: ConfigMap
metadata:
  name: asm-options
  namespace: istio-system
data:
  # Enable IP auto-allocation for ServiceEntry (Rapid channel)
  ip_auto_allocation: "true"

También puedes aplicar esta configuración con kubectl patch:

kubectl patch configmap/asm-options -n istio-system --type merge \
  -p '{"data":{"ip_auto_allocation":"true"}}'

ISTIOD

En el caso de los clústeres que usan la implementación del plano de control ISTIOD (ISTIOD administrado o en el clúster), configura la asignación automática de IP agregando ISTIO_META_DNS_AUTO_ALLOCATE: "true" a los metadatos del proxy dentro de MeshConfig:

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

Cómo verificar la asignación automática de IP

Puedes verificar que la asignación automática de IP funcione con los siguientes pasos.

Antes de la verificación, crea un ServiceEntry sin especificar spec.addresses:

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: auto-allocated-service-entry
  namespace: ns1
spec:
  hosts:
  - auto-allocated.internal
  ports:
  - name: http
    number: 80
    protocol: HTTP
  resolution: DNS
EOF

1. Verifica la dirección asignada en status.addresses (solo en TRAFFIC_DIRECTOR)

En la implementación de TRAFFIC_DIRECTOR, el controlador asigna una VIP y completa el campo status.addresses del ServiceEntry:

$ kubectl get serviceentry auto-allocated-service-entry -n ns1 -o yaml

El resultado muestra la dirección asignada en status.addresses:

status:
  addresses:
  - host: auto-allocated.internal
    value: 240.240.0.1

2. Prueba la resolución de DNS desde un Pod (TRAFFIC_DIRECTOR y ISTIOD)

En las implementaciones de TRAFFIC_DIRECTOR y ISTIOD, envía una solicitud desde un Pod en el que el proxy de DNS esté habilitado para verificar que la resolución de nombres se resuelva en la VIP asignada:

$ kubectl exec deploy/curl -n ns1 -- curl -sS -v http://auto-allocated.internal

El intento de conexión debe resolverse en la VIP asignada automáticamente (por ejemplo, 240.240.0.1:80):

*   Trying 240.240.0.1:80...