Configurare il proxy DNS
Il proxy DNS è una funzionalità che fornisce le seguenti funzionalità:
- Propagazione delle voci DNS di
Servicesnei cluster in una configurazione multi-cluster. - Compilazione delle voci DNS per
ServiceEntry.
Kubernetes fornisce la risoluzione DNS solo per Services nel cluster locale.
Quando devi fornire la risoluzione dei nomi per Services in cluster remoti o utilizzare un nome host solo interno con ServiceEntry senza disporre di un server DNS solo interno aggiuntivo, il proxy DNS fornisce un modo per risolvere i nomi DNS per questi casi.
Configurazione del proxy DNS
Per configurare il proxy DNS, configura il flag ISTIO_META_DNS_CAPTURE nel seguente modo. Puoi scegliere la configurazione a livello di cluster o per proxy.
Configurazione a livello di cluster
Per configurare il proxy DNS nel cluster, aggiungi i metadati del proxy ISTIO_META_DNS_CAPTURE a ConfigMap per MeshConfig. Il nome di ConfigMap
ha il formato istio-<revision_name>. Per i dettagli della revisione, consulta
la panoramica della revisione.
apiVersion: v1
data:
mesh: |-
...
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
...
kind: ConfigMap
metadata:
name: istio-<revision_name>
namespace: istio-system
Configurazione per proxy
Per configurare il proxy DNS per un proxy, aggiungi l'annotazione dei metadati del proxy ISTIO_META_DNS_CAPTURE come segue:
kind: Deployment
metadata:
name: app1
namespace: ns1
spec:
...
template:
metadata:
annotations:
proxy.istio.io/config: |
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
...
In fase di verifica
Per verificare che tutto sia configurato correttamente, esegui i passaggi.
Risoluzione dei nomi per Service tra cluster
Dopo la configurazione multicluster,
esegui il deployment di un Service solo in uno dei cluster per verificare la risoluzione dei nomi tra cluster.
Se hai il seguente esempio Service ns1/svc1,
puoi trovare ClusterIP in Service.
$ kubectl get -n ns1 svc1
kind: Service
metadata:
name: svc1
namespace: ns1
spec:
...
ClusterIP: 210.200.1.1
...
Poi, quando utilizzi curl dal cluster altro a Service, dovrebbe
mostrare ClusterIP come segue.
curl -sS -v svc1.ns1.svc.cluster.local
* Trying 210.200.1.1:80...
Risoluzione del nome per ServiceEntry
Aggiungi un ServiceEntry con un nome host non registrato nel tuo DNS.
Per verificare la risoluzione dei nomi, il seguente esempio ha un indirizzo esplicito
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
Poi, prova la risoluzione DNS in un pod in cui è attivato il proxy DNS. Ad esempio, se esegui un curl nel pod, l'indirizzo IP dovrebbe essere visualizzato nel seguente modo:
curl -sS -v not-existing-hostname.internal
* Trying 192.168.123.123:80...
Allocazione automatica degli IP per ServiceEntry
Quando utilizzi ServiceEntry con il proxy DNS, puoi facoltativamente attivare l'allocazione automatica degli indirizzi IP. Se attivato, gli indirizzi IP interni (dall'intervallo 240.240.0.0/16) vengono allocati automaticamente per gli host ServiceEntry che non specificano indirizzi IP espliciti in spec.addresses.
Attivazione dell'allocazione automatica degli IP
Per attivare l'allocazione automatica degli IP, segui le istruzioni per l'implementazione del control plane:
TRAFFIC_DIRECTOR
Per l'implementazione del control plane TRAFFIC_DIRECTOR, configura l'allocazione automatica degli IP in asm-options ConfigMap all'interno dello spazio dei nomi istio-system impostando ip_auto_allocation: "true".
L'esempio seguente mostra un asm-options ConfigMap con l'allocazione automatica
dell'IP attivata:
apiVersion: v1
kind: ConfigMap
metadata:
name: asm-options
namespace: istio-system
data:
# Enable IP auto-allocation for ServiceEntry (Rapid channel)
ip_auto_allocation: "true"
Puoi anche applicare questa configurazione utilizzando kubectl patch:
kubectl patch configmap/asm-options -n istio-system --type merge \
-p '{"data":{"ip_auto_allocation":"true"}}'
ISTIOD
Per i cluster che utilizzano l'implementazione del piano di controllo ISTIOD (ISTIOD in-cluster o gestito), configura l'allocazione automatica degli IP aggiungendo ISTIO_META_DNS_AUTO_ALLOCATE: "true" ai metadati del proxy all'interno di 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
Verifica dell'allocazione automatica degli IP
Puoi verificare che l'allocazione automatica degli IP funzioni seguendo questi passaggi.
Prima della verifica, crea un ServiceEntry senza specificare
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. Controlla l'indirizzo allocato in status.addresses (solo TRAFFIC_DIRECTOR)
Nell'implementazione di TRAFFIC_DIRECTOR, il controller alloca un VIP e
compila il campo status.addresses di ServiceEntry:
$ kubectl get serviceentry auto-allocated-service-entry -n ns1 -o yaml
L'output mostra l'indirizzo allocato in status.addresses:
status:
addresses:
- host: auto-allocated.internal
value: 240.240.0.1
2. Testa la risoluzione DNS da un pod (TRAFFIC_DIRECTOR e ISTIOD)
In entrambe le implementazioni TRAFFIC_DIRECTOR e ISTIOD, invia una richiesta da un pod in cui è abilitato il proxy DNS per verificare che la risoluzione dei nomi si risolva nel VIP allocato:
$ kubectl exec deploy/curl -n ns1 -- curl -sS -v http://auto-allocated.internal
Il tentativo di connessione deve essere risolto nell'indirizzo VIP allocato automaticamente
(ad esempio, 240.240.0.1:80):
* Trying 240.240.0.1:80...