DNS-Proxy einrichten

Der DNS-Proxy bietet folgende Funktionen:

  1. DNS-Einträge von Services in einer Multi-Cluster-Einrichtung über Cluster hinweg weitergeben.
  2. DNS-Einträge für ServiceEntry erstellen.

Kubernetes bietet die DNS-Auflösung nur für Services im lokalen Cluster. Wenn Sie die Namensauflösung für Services in einem Remotecluster bereitstellen oder einen Hostnamen verwenden möchten, der nur intern mit ServiceEntry verwendet werden kann, ohne einen zusätzlichen DNS-Server zu haben, der nur intern verwendet werden kann, bietet der DNS-Proxy eine Möglichkeit, DNS-Namen für solche Fälle aufzulösen.

DNS-Proxy konfigurieren

Konfigurieren Sie das Flag `ISTIO_META_DNS_CAPTURE` wie folgt, um den DNS-Proxy zu konfigurieren. Sie können entweder die clusterweite Konfiguration oder die Konfiguration pro Proxy auswählen.

Clusterweite Konfiguration

Wenn Sie den DNS-Proxy im Cluster konfigurieren möchten, fügen Sie die Proxy-Metadaten ISTIO_META_DNS_CAPTURE der ConfigMap für MeshConfig hinzu. Der Name der ConfigMap hat das Format istio-<revision_name>. Weitere Informationen zur Überarbeitung finden Sie unter Übersicht über die Überarbeitung

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

Konfiguration pro Proxy

Wenn Sie den DNS-Proxy für einen Proxy konfigurieren möchten, fügen Sie die Proxy-Metadatenannotation ISTIO_META_DNS_CAPTURE wie folgt hinzu:

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

Wird überprüft

Führen Sie die Schritte aus, um zu prüfen, ob alles richtig konfiguriert ist.

Namensauflösung für Service über Cluster hinweg

Nach der Multi-Cluster-Einrichtung, stellen Sie einen Service nur in einem der Cluster bereit, um die clusterübergreifende Namens auflösung zu prüfen.

Wenn Sie den folgenden Service ns1/svc1 haben, finden Sie ClusterIP in Service.

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

Wenn Sie dann curl vom anderen Cluster zum Service verwenden, sollte ClusterIP wie folgt angezeigt werden.

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

Namensauflösung für ServiceEntry

Fügen Sie einen ServiceEntry mit einem Hostnamen hinzu, der nicht in Ihrem DNS registriert ist. Zur Überprüfung der Namensauflösung hat das folgende Beispiel die explizite Adresse 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

Versuchen Sie dann die DNS-Auflösung in einem Pod, in dem der DNS-Proxy aktiviert ist. Wenn Sie beispielsweise Sie ein curl im Pod ausführen, sollte die IP-Adresse wie folgt angezeigt werden:

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

Automatische IP-Zuweisung für ServiceEntry

Wenn Sie ServiceEntry mit dem DNS-Proxy verwenden, können Sie optional die automatische IP-Zuweisung aktivieren. Wenn diese Option aktiviert ist, werden interne IP-Adressen (aus dem Bereich 240.240.0.0/16) automatisch für ServiceEntry-Hosts zugewiesen, die in spec.addresses keine expliziten IP-Adressen angeben.

Automatische IP-Zuweisung aktivieren

Folgen Sie der Anleitung für Ihre Steuerungsebene, um die automatische IP-Zuweisung zu aktivieren:

TRAFFIC_DIRECTOR

Konfigurieren Sie für die TRAFFIC_DIRECTOR-Steuerungsebene die automatische IP -Zuweisung in der asm-options ConfigMap im istio-system -Namespace, indem Sie ip_auto_allocation: "true" festlegen.

Das folgende Beispiel zeigt eine asm-options ConfigMap mit aktivierter automatischer IP-Zuweisung:

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

Sie können diese Konfiguration auch mit kubectl patch anwenden:

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

ISTIOD

Konfigurieren Sie für Cluster mit der ISTIOD-Steuerungsebene (In-Cluster oder verwaltetes ISTIOD) die automatische IP-Zuweisung, indem Sie ISTIO_META_DNS_AUTO_ALLOCATE: "true" zu den Proxy-Metadaten in MeshConfig hinzufügen:

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

Automatische IP-Zuweisung prüfen

Sie können die automatische IP-Zuweisung mit den folgenden Schritten prüfen.

Erstellen Sie vor der Überprüfung einen ServiceEntry, ohne spec.addresses anzugeben:

$ 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. Zugewiesene Adresse in status.addresses prüfen (nur TRAFFIC_DIRECTOR)

In der TRAFFIC_DIRECTOR-Implementierung weist der Controller eine VIP zu und füllt das Feld status.addresses des ServiceEntry aus:

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

In der Ausgabe wird die zugewiesene Adresse unter status.addresses angezeigt:

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

2. DNS-Auflösung von einem Pod aus testen (TRAFFIC_DIRECTOR und ISTIOD)

Senden Sie in den Implementierungen TRAFFIC_DIRECTOR und ISTIOD eine Anfrage von einem Pod aus, in dem der DNS-Proxy aktiviert ist, um zu prüfen, ob die Namensauflösung zur zugewiesenen VIP führt:

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

Der Verbindungsversuch sollte zur automatisch zugewiesenen VIP führen (z. B. 240.240.0.1:80):

*   Trying 240.240.0.1:80...