CoreDNS managé assure la résolution DNS des pods de votre cluster. Par défaut, il résout les services internes du cluster et transfère toutes les autres requêtes vers Alibaba Cloud DNS PrivateZone. Pour router les requêtes de domaines externes vers un serveur DNS amont spécifique ou associer des noms de domaine à des adresses IP statiques, définissez une ressource personnalisée (CR) CustomDNSConfig.
Prérequis
Avant de commencer, vérifiez que vous disposez des éléments suivants :
Le plug-in CoreDNS managé est installé en version 1.9.3.20 ou ultérieure. Pour les instructions d'installation, consultez Gérer les composants.
Un client kubectl connecté à votre cluster. Pour les instructions de connexion, consultez Obtenir le fichier kubeconfig d'un cluster et utiliser kubectl pour se connecter au cluster.
Fonctionnement
CustomDNSConfig est une définition de ressource personnalisée (CRD) Kubernetes qui permet de configurer le comportement DNS par zone sans modifier directement le Corefile de CoreDNS. Lorsque vous appliquez une CR CustomDNSConfig, le contrôleur CoreDNS managé la lit, génère la configuration Corefile correspondante et recharge automatiquement CoreDNS.
Cette CR prend en charge deux options de configuration par zone :
forward: route les requêtes DNS d'une zone vers un ou plusieurs serveurs DNS amont.hosts: associe des noms de domaine à des adresses IP statiques au sein d'une zone.
L'exemple suivant présente la structure complète de la CR :
apiVersion: networking.alibabacloud.com/v1beta1
kind: CustomDNSConfig
metadata:
name: default
namespace: default
spec:
zones:
- name: example.com
forward:
protocolStrategy: ""
transportConfig: {}
upstreams:
- xxx.xxx.xxx.xxx # IP address
- xxx.xxx.xxx.xxx:53 # IP:port
hosts:
- hostName: "a.example.com"
ipAddress: xxx.xxx.xxx.xxx
Contraintes principales
| Champ | Valeur par défaut | Contraintes |
|---|---|---|
spec.zones[].name |
"." (zone par défaut) |
Nom de domaine entièrement qualifié (FQDN) obligatoire |
spec.zones[].forward.protocolStrategy |
"" (UDP) |
Définir sur tcp pour utiliser TCP |
spec.zones[].forward.transportConfig |
{} |
Lecture seule ; non modifiable |
spec.zones[].forward.upstreams |
Bascule vers Alibaba Cloud DNS PrivateZone | Format IP ou IP:port, IPv4 uniquement, jusqu'à 15 adresses par zone |
spec.zones[].hosts[].hostName |
— | Respect des spécifications de nommage DNS obligatoire |
spec.zones[].hosts[].ipAddress |
— | Adresse IPv4 valide obligatoire |
Une seule CR par cluster : CustomDNSConfig n'est pas limitée à un namespace. Une seule CR est prise en charge par cluster et elle doit être nommée default. Il s'agit d'une contrainte de conception du contrôleur CoreDNS managé : les CR portant tout autre nom sont rejetées avec le statut NotSupported. Consultez la section Dépannage pour plus de détails.
Ajouter des zones DNS personnalisées
Cette méthode permet de router les requêtes pour des domaines spécifiques vers des serveurs DNS amont dédiés ou d'ajouter des entrées d'hôtes statiques.
-
Créez un fichier nommé
default.yamlavec le contenu suivant :apiVersion: networking.alibabacloud.com/v1beta1 kind: CustomDNSConfig metadata: name: default spec: zones: - name: example.com forward: upstreams: - 100.100.2.136 # Upstream DNS servers for example.com - 100.100.2.138 - name: foo.com hosts: - hostName: "a.foo.com" # Static IP mappings for foo.com ipAddress: 192.168.0.251 - hostName: "b.foo.com" ipAddress: 192.168.0.252Cette configuration définit deux zones :
-
example.com: les requêtes sont transférées vers100.100.2.136et100.100.2.138.Note:
100.100.2.136et100.100.2.138sont les adresses par défaut du service de résolution DNS interne. Pour plus d'informations, consultez Endpoints . foo.com:a.foo.comest résolu en192.168.0.251etb.foo.comen192.168.0.252.
-
-
Appliquez la CR :
kubectl apply -f default.yaml -
Vérifiez la génération du Corefile :
kubectl get customdnsconfig default -o yaml | grep corefile -A 35 -B 1La sortie devrait ressembler à ceci :
status: corefile: | example.com:53 { prometheus :9153 forward . 100.100.2.136 100.100.2.138 { policy random prefer_udp } ... } foo.com:53 { prometheus :9153 hosts { 192.168.0.251 a.foo.com 192.168.0.252 b.foo.com fallthrough } forward . /etc/resolv.conf { policy random prefer_udp } ... } ... -- corefileHash: 41f7be21cf3022c305091665ed33b1e5 lastTransitionTime: "2024-09-13T09:07:37Z" phase: GenerateSuccessLe statut
phase: GenerateSuccessconfirme le traitement de la CR et la mise à jour du Corefile.
Modifier la zone par défaut
Pour remplacer les serveurs DNS amont utilisés pour toutes les requêtes du cluster (zone "."), configurez une zone nommée ".".
-
Créez un fichier nommé
default.yamlavec le contenu suivant :apiVersion: networking.alibabacloud.com/v1beta1 kind: CustomDNSConfig metadata: name: default spec: zones: - name: . forward: upstreams: - 100.100.2.136 # Custom upstream DNS servers for the default zone - 100.100.2.138 -
Appliquez la CR :
kubectl apply -f default.yaml -
Vérifiez la génération du Corefile :
kubectl get customdnsconfig default -o yaml | grep corefile -A 35 -B 1La sortie devrait ressembler à ceci :
status: corefile: | .:53 { errors health { lameduck 20s } ready kubeapi { kubeconfig /etc/kubernetes/config/managed-coredns.conf } k8s_event { level error warning } ... prometheus :9153 forward . 100.100.2.136 100.100.2.138 { policy random prefer_udp } ... } corefileHash: 847bf69cc4c97cee965945f45d17c661 lastTransitionTime: "2024-09-13T09:54:22Z" phase: GenerateSuccessAprès la création ou la mise à jour d'une CR
CustomDNSConfig, CoreDNS recharge sa configuration. Cette opération prend environ 20 secondes par défaut (durée contrôlée par le paramètrelameduckdans le Corefile).
Associer un domaine à plusieurs adresses IP
Une seule entrée hostName peut être associée à plusieurs adresses IP. CoreDNS retourne alors toutes les adresses et le client en sélectionne une :
hosts:
- hostName: "a.example.com"
ipAddress: 10.0.0.123
- hostName: "a.example.com"
ipAddress: 10.0.0.124
Dépannage
Le statut de la CR indique NotSupported
Une seule CR CustomDNSConfig nommée default est prise en charge par cluster. Si vous créez une CR avec un autre nom, le contrôleur définit son statut sur NotSupported et l'ignore.
Pour reproduire cette erreur, créez une CR nommée test :
apiVersion: networking.alibabacloud.com/v1beta1
kind: CustomDNSConfig
metadata:
name: test
spec:
zones:
- name: example.com
forward:
upstreams:
- 100.100.2.138
- name: foo.com
hosts:
- hostName: "ah.foo.com"
ipAddress: 1.1.xx.251
- hostName: "aha.foo.com"
ipAddress: 1.1.xx.252
Après avoir exécuté kubectl apply -f test.yaml, vérifiez le statut :
kubectl get customdnsconfig
Sortie attendue :
NAME PHASE VERSION AGE
default GenerateSuccess 847bf69cc4c97cee96xxxxxxxxxxx 89m
test NotSupported 9s
Pour résoudre ce problème, supprimez la CR mal nommée et appliquez votre configuration en utilisant une CR nommée default.
Consulter les événements de synchronisation
Le contrôleur CoreDNS managé synchronise les événements dans le namespace default. Pour consulter les événements récents :
kubectl get events
Une synchronisation réussie produit une sortie similaire à celle-ci :
LAST SEEN TYPE REASON OBJECT MESSAGE
45m Normal CustomDNSConfigSyncOk customdnsconfig/default custom dns config sync to coredns configmap success