DNS-Proxy einrichten
DNS-Proxy ist eine Funktion, die die folgenden Möglichkeiten bietet:
- DNS-Einträge von
Servicesüber Cluster hinweg in einer Multi-Cluster-Einrichtung weitergeben. - DNS-Einträge für
ServiceEntrywerden erstellt.
Kubernetes bietet die DNS-Auflösung nur für Services im lokalen Cluster.
Wenn Sie die Namensauflösung für Services in einem Remote-Cluster bereitstellen oder einen internen Hostnamen mit ServiceEntry verwenden müssen, ohne einen zusätzlichen internen DNS-Server zu haben, bietet DNS-Proxy eine Möglichkeit, DNS-Namen für solche Fälle aufzulösen.
DNS-Proxy konfigurieren
So konfigurieren Sie den DNS-Proxy: Sie können entweder die Cluster- oder die Proxy-weite Konfiguration auswählen.
Clusterweite Konfiguration
Wenn Sie den DNS-Proxy im Cluster konfigurieren möchten, fügen Sie der ConfigMap für MeshConfig die ISTIO_META_DNS_CAPTURE-Proxy-Metadaten 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
Konfiguration pro Proxy
Wenn Sie den DNS-Proxy für einen Proxy konfigurieren möchten, fügen Sie die Metadatenanmerkung ISTIO_META_DNS_CAPTURE proxy 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 eine Service nur in einem der Cluster bereit, um die clusterübergreifende Namensauflösung zu prüfen.
Wenn Sie das folgende Beispiel 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 die ClusterIP so aussehen:
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 Namensauflösung mit der expliziten Adresse 192.168.123.123 überprüft.
$ 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 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 dem DNS-Proxy verwenden, können Sie optional die automatische IP-Zuweisung aktivieren. Wenn diese Option aktiviert ist, werden automatisch interne IP-Adressen (aus dem Bereich 240.240.0.0/16) für ServiceEntry-Hosts zugewiesen, für die in spec.addresses keine expliziten IP-Adressen angegeben sind.
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 Implementierung der TRAFFIC_DIRECTOR-Steuerungsebene die automatische IP-Zuweisung im asm-options ConfigMap im Namespace istio-system, 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
Bei Clustern, die die ISTIOD-Steuerungsebene (im Cluster oder verwaltet ISTIOD) verwenden, konfigurieren Sie 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
So können Sie prüfen, ob die automatische IP-Zuweisung funktioniert:
Erstellen Sie vor der Bestätigung 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 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 über einen Pod testen (TRAFFIC_DIRECTOR und ISTIOD)
Senden Sie in beiden Implementierungen (TRAFFIC_DIRECTOR und ISTIOD) eine Anfrage von einem Pod, in dem der DNS-Proxy aktiviert ist, um zu prüfen, ob die Namensauflösung in die zugewiesene VIP aufgelöst wird:
$ kubectl exec deploy/curl -n ns1 -- curl -sS -v http://auto-allocated.internal
Der Verbindungsversuch sollte in der automatisch zugewiesenen VIP aufgelöst werden (z. B. 240.240.0.1:80):
* Trying 240.240.0.1:80...