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...