DNS-Proxy einrichten

Kubernetes löst DNS-Namen nativ nur für Services im lokalen Cluster auf. Mit dem DNS-Proxy können Sie Kubernetes-Services über Remote-Cluster in einer Multi-Cluster-Einrichtung auflösen und DNS-Einträge für ServiceEntry-Ressourcen generieren. So können Sie Traffic an interne Hostnamen weiterleiten, ohne zusätzliche interne DNS-Server verwalten zu müssen.

DNS-Proxy konfigurieren

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

Clusterweite Konfiguration

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

Proxy-spezifische Konfiguration

Wenn Sie den DNS-Proxy für einen Proxy konfigurieren möchten, fügen Sie die Proxy-Metadatenannotation ISTIO_META_DNS_CAPTURE so 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

Stellen Sie nach der Multi-Cluster-Einrichtung einen Service nur in einem der Cluster bereit, um die clusterübergreifende Namensauflösung zu prüfen.

Wenn Sie das folgende Beispiel für 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 der ClusterIP so 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. Im folgenden Beispiel wird die explizite Adresse 192.168.123.123 verwendet, um die Namensauflösung zu prüfen.

$ 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 auszuführen, in dem der DNS-Proxy aktiviert ist. Wenn Sie beispielsweise curl im Pod ausführen, sollte die IP-Adresse so 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 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 keine expliziten IP-Adressen in spec.addresses angeben.

Automatische IP-Zuweisung aktivieren

Wenn Sie die automatische IP-Zuweisung aktivieren möchten, folgen Sie der Anleitung für Ihre Implementierung der Steuerungsebene:

TRAFFIC_DIRECTOR

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

Das folgende Beispiel zeigt ein 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, die die Implementierung der Steuerungsebene ISTIOD (clusterintern oder verwaltet ISTIOD) verwenden, die automatische IP-Zuweisung, indem Sie ISTIO_META_DNS_AUTO_ALLOCATE: "true" zu Ihren 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

So können Sie prüfen, ob die automatische IP-Zuweisung funktioniert:

Erstellen Sie vor der Überprüfung ein 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:

$ 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 (TRAFFIC_DIRECTOR und ISTIOD) testen

Senden Sie sowohl in der TRAFFIC_DIRECTOR- als auch in der ISTIOD-Implementierung eine Anfrage von einem Pod, auf 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 aufgelöst werden (z. B. 240.240.0.1:80):

*   Trying 240.240.0.1:80...