Configuration du fournisseur DNS de cluster
Un nom DNS (Domain Name System) est affecté à chaque service dans votre cluster IBM Cloud® Kubernetes Service et est enregistré par le fournisseur DNS de cluster pour résoudre les demandes DNS. Pour plus d'informations sur le DNS pour les services et les pods, voir la documentation Kubernetes.
Le fournisseur de DNS de la grappe est CoreDNS, un serveur DNS généraliste faisant autorité qui offre une intégration rétrocompatible, mais extensible, avec Kubernetes. Etant donné
que CoreDNS est un simple fichier exécutable et un processus unique, il a moins de dépendances et de pièces mobiles susceptibles de présenter des problèmes que les précédents fournisseurs DSN de cluster. Le projet est également écrit dans le
même langage que le projet Kubernetes, Go
, ce qui contribue à protéger la mémoire. Enfin, CoreDNS prend en charge des cas d'utilisation plus flexibles que d'autres fournisseurs de DNS en cluster, car vous pouvez créer des entrées
DNS personnalisées, telles que les configurations courantes décrites dans la documentation de CoreDNS.
Mise à l'échelle automatique du fournisseur DNS de cluster
Par défaut, CoreDNS comprend un déploiement pour la mise à l'échelle automatique des pods CoreDNS en réponse au nombre de noeuds worker et de coeurs présents dans le cluster. Vous pouvez affiner les paramètres du programme de mise à l'échelle automatique de CoreDNS en modifiant l'élément configmap correspondant à la mise à l'échelle automatique de CoreDNS. Par exemple, si vos applications utilisent beaucoup le fournisseur DNS de cluster, vous devrez peut-être augmenter le nombre minimal de pods CoreDNS pour prendre en charge ces applications. Pour plus d'informations, voir la documentation de Kubernetes.
Avant de commencer : Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
-
Vérifiez que le déploiement du programme de mise à l'échelle automatique de CoreDNS est disponible. Dans votre sortie CLI, vérifiez que la colonne AVAILABLE contient la valeur 1 (un déploiement est disponible).
kubectl get deployment -n kube-system coredns-autoscaler
Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE coredns-autoscaler 1/1 1 1 69d
-
Editez les paramètres par défaut du programme de mise à l'échelle automatique de CoreDNS. Recherchez la zone
data.linear
, qui correspond par défaut à un pod CoreDNS par 16 noeuds worker ou 256 coeurs, avec un minimum de deux pods CoreDNS, quelle que soit la taille du cluster (preventSinglePointFailure: true
). Pour plus d'informations, voir la documentation Kubernetes.kubectl edit configmap -n kube-system coredns-autoscaler
Exemple de sortie
apiVersion: v1 data: linear: '{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}' kind: ConfigMap metadata: ...
Personnalisation du fournisseur DNS de cluster
Vous pouvez personnaliser CoreDNS en éditant la mappe de configuration de CoreDNS. Par exemple, vous souhaiterez peut-être configurer des domaines de module de remplacement et des serveurs DNS en amont pour résoudre les services qui pointent vers des hôtes externes. En outre, vous pouvez configurer plusieurs Corefiles sur le site CoreDNS ConfigMap. Pour plus d'informations, voir la documentation de Kubernetes.
Le cache DNS NodeLocal
repose sur CoreDNS pour gérer le cache de la résolution DNS. Conservez en l'état les configurations applicables du cache DNS NodeLocal
et de CoreDNS, comme les domaines de module de remplacement,
pour garantir la cohérence de la résolution DNS.
Avant de commencer : Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
-
Vérifiez que le déploiement de CoreDNS est disponible. Dans votre sortie CLI, vérifiez que la colonne AVAILABLE contient la valeur 1 (un déploiement est disponible).
kubectl get deployment -n kube-system coredns
Exemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE coredns 3/3 3 3 69d
-
Editez les paramètres par défaut pour la mappe de configuration de CoreDNS. Utilisez un fichier Corefile dans la section
data
de la mappe de configuration pour personnaliser des domaines de module de remplacement et des serveurs DNS en amont. Pour plus d'informations, voir la documentation de Kubernetes.Le plug-in CoreDNS
proxy
est obsolète et remplacé par le plug-inforward
. Si vous mettez à jour la mappe de configuration (configmap) de CoreDNS, veillez à remplacer toutes les instances deproxy
parforward
.kubectl edit configmap -n kube-system coredns
Exemple de sortie pour CoreDNS
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | import <MyCorefile> .:53 { errors health { lameduck 10s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 { disable success cluster.local disable denial cluster.local } loop reload loadbalance } <MyCorefile>: | abc.com:53 { errors cache 30 loop forward . 1.2.3.4 }
-
Facultatif : ajoutez des fichiers Corefile personnalisés à la mappe de configuration de CoreDNS. Dans l'exemple suivant, incluez le site
import <MyCoreFile>
dans la sectiondata.Corefile
et complétez la sectiondata.<MyCorefile>
avec vos informations Corefile personnalisées. Pour plus d'informations, voir la documentation sur l'importation de Corefile.Le plug-in CoreDNS
proxy
est obsolète et remplacé par le plug-inforward
. Si vous mettez à jour la mappe de configuration (configmap) de CoreDNS, veillez à remplacer toutes les instances deproxy
parforward
.kubectl edit configmap -n kube-system coredns
Exemple de sortie de fichier Corefile personnalisé
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | import <MyCorefile> .:53 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream 172.16.0.1 fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 { disable success cluster.local disable denial cluster.local } loop reload loadbalance } <MyCorefile>: | abc.com:53 { errors cache 30 loop forward . 1.2.3.4 }
-
Au bout de quelques minutes, les pods CoreDNS récupèrent les modifications de mappe de configuration.
Configuration du cache DNS NodeLocal
Configurez l'agent de mise en cache DNS NodeLocal
sur certains noeuds worker afin d'améliorer les performances et la disponibilité DNS de cluster dans votre cluster IBM Cloud Kubernetes Service. Pour plus d'informations, consultez
la documentation de Kubernetes.
Par défaut, les requêtes DNS de cluster pour les pods qui utilisent une politique DNS ClusterFirst
sont envoyées au service DNS de cluster. Si vous activez la mise en cache DNS NodeLocal
sur un noeud worker, les demandes DNS de cluster pour les pods qui se trouvent sur le noeud worker sont envoyées au cache DNS local, qui est
à l'écoute sur l'adresse IP de lien local 169.254.20.10. Le cache DNS écoute également l'adresse IP de cluster du service kube-dns
dans l'espace de noms kube-system
.
N'ajoutez pas le libellé de cache DNS lorsque vous utilisez déjà zone-aware DNS dans votre cluster. De plus, le cache DNS NodeLocal
repose sur CoreDNS pour gérer le cache de la résolution DNS. Conservez
en l'état les configurations applicables du cache DNS NodeLocal
et de CoreDNS, comme les domaines de module de remplacement, pour garantir la cohérence de la résolution DNS.
Le cache DNS NodeLocal
est disponible en version GA dans les clusters qui exécutent Kubernetes version 1.18 ou ultérieure, mais il n'est toujours pas activé par défaut.
Activation du cache DNS NodeLocal
Activez le cache DNS NodeLocal
pour un ou plusieurs des noeuds worker figurant dans votre cluster Kubernetes.
Les étapes suivantes mettent à jour les pods DNS qui s'exécutent sur des noeuds worker particuliers. Vous pouvez également affecter un libellé au pool de noeuds worker pour que de futurs noeuds héritent de ce libellé.
Avant de commencer, mettez à jour toutes les stratégies de réseau de sortie du DNS qui sont affectées par cette fonctionnalité, telles que les stratégies qui reposent sur des sélecteurs de pods ou d'espaces de noms pour la sortie du DNS.
kubectl get networkpolicy --all-namespaces -o yaml
-
Si vous avez personnalisé les domaines de module de remplacement et les serveurs DNS en amont pour CoreDNS, vous devez également personnaliser le cache DNS
NodeLocal
avec ces domaines de module de remplacement et ces serveurs DNS en amont. -
Répertoriez les noeuds présents dans votre cluster. Les pods d'agent de mise en cache DNS
NodeLocal
font partie d'un ensemble de démons qui s'exécutent sur chaque noeud.kubectl get nodes
-
Ajoutez le libellé
ibm-cloud.kubernetes.io/node-local-dns-enabled=true
au noeud worker. Le libellé démarre le pod d'agent de mise en cache DNS sur le noeud worker.-
Ajoutez le libellé à un ou plusieurs noeuds worker.
-
Pour libeller tous les noeuds worker du cluster : Ajoutez le libellé à tous les pools de noeuds worker existants.
-
Pour libeller un noeud worker en particulier :
kubectl label node <node_name> --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled=true"
-
-
Vérifiez que le noeud comporte le libellé en vous assurant que la zone
NODE-LOCAL-DNS-ENABLED
a pour valeurtrue
.kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
Exemple de sortie
NAME STATUS ROLES AGE VERSION NODE-LOCAL-DNS-ENABLED 10.xxx.xx.xxx Ready,SchedulingDisabled <none> 28h v1.32+IKS true
-
Assurez-vous que le pod d'agent de mise en cache DNS s'exécute sur le noeud worker.
kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
Exemple de sortie
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES node-local-dns-pvnjn 1/1 Running 0 1m 10.xxx.xx.xxx 10.xxx.xx.xxx <none> <none>
-
-
Répétez les étapes précédentes pour chaque noeud worker afin d'activer la mise en cache DNS.
Désactivation du cache DNS NodeLocal
Vous pouvez désactiver le cache DNS NodeLocal
pour un ou plusieurs noeuds worker.
-
Retirez le libellé
ibm-cloud.kubernetes.io/node-local-dns-enabled
du noeud worker. Cette action met fin au pod de l'agent de mise en cache DNS sur le noeud worker.Pour retirer le libellé de tous les noeuds worker du cluster, exécutez la commande suivante :
kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
Pour retirer le libellé d'un noeud worker en particulier, exécutez la commande suivante :
kubectl label node <node_name> "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
-
Vérifiez que le libellé est retiré en vous assurant que la zone
NODE-LOCAL-DNS-ENABLED
est vide.kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
Exemple de sortie
NAME STATUS ROLES AGE VERSION NODE-LOCAL-DNS-ENABLED 10.xxx.xx.xxx Ready,SchedulingDisabled <none> 28h v1.32+IKS
-
Vérifiez que le pod ne s'exécute plus sur le noeud sur lequel le cache DNS est désactivé. La sortie ne contient aucun pod.
kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
Exemple de sortie
No resources found.
-
-
Répétez les étapes précédentes pour chaque noeud worker afin de désactiver la mise en cache DNS.
Personnalisation du cache DNS NodeLocal
Vous pouvez personnaliser le cache DNS NodeLocal
en éditant l'une des deux mappes de configuration.
node-local-dns
ConfigMap: Personnaliser la configuration du cache DNS deNodeLocal
.node-local-dns-config
ConfigMap: Étendez la configuration du cache DNSNodeLocal
en personnalisant les domaines secondaires ou les serveurs DNS en amont pour résoudre les services qui pointent vers des hôtes externes.
Le cache DNS NodeLocal
repose sur CoreDNS pour gérer le cache de la résolution DNS. Conservez en l'état les configurations applicables du cache DNS NodeLocal
et de CoreDNS, comme les domaines de module de remplacement,
pour garantir la cohérence de la résolution DNS.
Edition de la mappe de configuration node-local-dns
pour les mises à jour de configuration générales
Editez la mappe de configuration node-local-dns
pour personnaliser la configuration du cache DNS NodeLocal
.
Avant de commencer : Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
-
Vérifiez que le démon du cache DNS
NodeLocal
est disponible.kubectl get ds -n kube-system node-local-dns
Exemple de sortie
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE node-local-dns 4 4 4 4 4 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 82d
-
Editez les paramètres par défaut ou ajouter des fichiers Corefile personnalisés à la mappe de configuration du cache DNS
NodeLocal
. Chaque fichier Corefile que vous importez doit utiliser le chemincoredns
. Pour plus d'informations, voir la documentation de Kubernetes.Seul un ensemble limité de plug-ins est pris en charge pour le cache DNS
NodeLocal
.kubectl edit configmap -n kube-system node-local-dns
Exemple de sortie
apiVersion: v1 kind: ConfigMap metadata: name: node-local-dns namespace: kube-system data: Corefile: | # Add your NodeLocal DNS customizations as import files under ./coredns directory. # Refer to /docs/containers?topic=containers-cluster_dns for details. import ./coredns/<MyCorefile> cluster.local:53 abc.com:53 { errors cache { success 9984 30 denial 9984 5 } reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 health 169.254.20.10:8080 } in-addr.arpa:53 { errors cache 30 reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 } ip6.arpa:53 { errors cache 30 reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 } .:53 { errors cache 30 { disable success cluster.local disable denial cluster.local } reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__UPSTREAM__SERVERS__ { force_tcp } prometheus :9253 } <MyCorefile>: | # Add custom corefile content ...
-
Au bout de quelques minutes, les pods de cache DNS
NodeLocal
récupèrent les modifications de mappe de configuration.
Edition de la mappe de configuration node-local-dns-config
pour une extension à l'aide de domaines de module de remplacement ou de serveurs en amont
Editez la mappe de configuration node-local-dns-config
pour étendre la configuration du cache DNS NodeLocal
, par exemple en personnalisant les domaines de module de remplacement ou les serveurs DNS en amont. Pour
plus d'informations, voir la documentation de Kubernetes.
Avant de commencer : Connectez-vous à votre compte. Le cas échéant, ciblez le groupe de ressources approprié. Définissez le contexte de votre cluster.
-
Vérifiez que le démon du cache DNS
NodeLocal
est disponible.kubectl get ds -n kube-system node-local-dns
Exemple de sortie
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE node-local-dns 4 4 4 4 4 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 82d
-
Confirmez que le cache DNS
NodeLocal
comporte une mappe de configuration.-
Déterminez si la mappe de configuration du cache DNS
NodeLocal
existe.kubectl get cm -n kube-system node-local-dns-config
Exemple de sortie s'il n'existe aucune mappe de configuration
Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
-
Si la mappe de configuration n'existe pas, créez une mappe de configuration de cache DNS
NodeLocal
.kubectl create cm -n kube-system node-local-dns-config
Exemple de sortie
configmap/node-local-dns-config created
-
-
Editez la mappe de configuration du cache DNS
NodeLocal
. La mappe de configuration utilise la syntaxe KubeDNS pour personnaliser les domaines de module de remplacement et les serveurs DNS en amont. Pour plus d'informations, voir la documentation de Kubernetes.kubectl edit cm -n kube-system node-local-dns-config
Exemple de sortie
apiVersion: v1 kind: ConfigMap metadata: name: node-local-dns-config namespace: kube-system data: stubDomains: | {"abc.com" : ["1.2.3.4"]}
-
Au bout de quelques minutes, les pods de cache DNS
NodeLocal
récupèrent les modifications de mappe de configuration.
Configuration du service DNS reconnaissant les zones
Configurez le service DNS reconnaissant les zones pour améliorer les performances et la disponibilité DNS de cluster dans votre cluster IBM Cloud Kubernetes Service multizone.
Cette configuration étend le cache DNS NodeLocal
pour privilégier le passage du trafic DNS de cluster au sein de la même zone.
Par défaut, votre cluster est configuré avec des ressources de service DNS à l'échelle du cluster et non avec des ressources de service DNS reconnaissant les zones. Même après que vous avez configuré le service DNS reconnaissant les zones, les ressources de service DNS à l'échelle du cluster restent en cours d'exécution en tant que service DNS de sauvegarde. Les ressources de service DNS reconnaissant les zones sont distinctes des ressources de service DNS à l'échelle du cluster, et le changement du service DNS reconnaissant les zones n'a aucun impact sur le service DNS à l'échelle du cluster.
N'utilisez pas le libellé de cache DNS lorsque vous utilisez le service DNS reconnaissant les zones dans votre cluster.
Configuration du service DNS reconnaissant les zones
Procédez comme suit pour configurer un serveur de noms de domaine prenant en compte les zones dans votre cluster multizone.
-
Mettez à jour toutes les stratégies de réseau de sortie du DNS qui sont affectées par le DNS sensible aux zones, telles que les stratégies qui reposent sur des sélecteurs de pods ou d'espaces de noms pour la sortie du DNS. Exécutez la commande suivante pour obtenir une liste de vos politiques de réseau.
kubectl get networkpolicy --all-namespaces -o yaml
-
Libellez
coredns
ConfigMap dans l'espace de nomkube-system
avecibm-cloud.kubernetes.io/deploy-zone-aware-dns=true
.kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true"
-
Actualisez le maître cluster pour déployer les ressources DNS sensibles aux zones.
ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
-
Surveillez l'achèvement de l'opération d'actualisation en examinant la zone Santé du maître dans les détails du cluster.
ibmcloud ks cluster get -c <cluster_name_or_ID>
-
Si vous avez personnalisé les domaines de module de remplacement et les serveurs DNS en amont pour CoreDNS, vous devez également personnaliser le cache DNS
NodeLocal
avec ces domaines de module de remplacement et ces serveurs DNS en amont. -
Définissez une variable d'environnement pour les zones du cluster.
ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
-
Démarrez les pods de CoreDNS et du programme de mise à l'échelle automatique de CoreDNS dans toutes les zones.
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1 done
-
Vérifiez que les pods de CoreDNS et du programme de mise à l'échelle automatique de CoreDNS sont en cours d'exécution dans toutes les zones.
for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" -o wide kubectl get pods -n kube-system -l "k8s-app=coredns-${ZONE}" -o wide done
-
Démarrez les pods du cache DNS
NodeLocal
sur tous les noeuds worker.kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
-
Vérifiez que les pods du cache DNS
NodeLocal
sont en cours d'exécution sur tous les noeuds worker.for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide done
-
Libellez vos pools de noeuds worker de sorte que les futurs noeuds worker héritent du libellé
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
.
Désactivation et suppression du service DNS reconnaissant les zones
Pour retirer le service DNS reconnaissant les zones, vous devez d'abord le désactiver dans chaque zone de votre cluster multizone. Ensuite, vous pouvez supprimer les ressources du service DNS reconnaissant les zones.
-
Retirez le
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
étiquette de vos pools de travailleurs. -
Définissez une variable d'environnement pour les zones du cluster.
ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
-
Arrêtez les pods du cache DNS
NodeLocal
sur tous les noeuds worker.kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
-
Arrêtez les pods du programme de mise à l'échelle automatique de CoreDNS dans toutes les zones.
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0 done
-
Vérifiez que les pods du programme de mise à l'échelle automatique de CoreDNS ne sont plus en cours d'exécution dans toutes les zones.
for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" done
-
Arrêtez les pods de CoreDNS dans toutes les zones.
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0 done
-
Retirez le libellé
ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true
de la mappe de configurationcoredns
dans l'espace de nomskube-system
.kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns-"
-
Actualisez le maître cluster sur les ressources de service DNS reconnaissant les zones qui sont supprimées.
ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
-
Surveillez l'achèvement de l'opération d'actualisation en examinant la zone Santé du maître dans les détails du cluster.
ibmcloud ks cluster get -c <cluster_name_or_ID>