Ajouter une entrée DNS custom à coredns
Ajouter une entrée DNS custom à coredns

Ci-après un article pense-bête pour modifier la configuration de coredns, le serveur DNS que l'on retrouvera par défaut dans un cluster Kubernetes.
Il m'arrive parfois de devoir ajouter des entrées DNS à la main dans un cluster, pour que les applications de celui-ci puissent joindre un service non encore déclaré, ou bien pour pointer vers un service répliqué hors prod. En gros modifier le /etc/hosts de sa machine linux, mais pour l'ensemble des applis du cluster.
Ici, je souhaite que mes applis puissent joindre myapp.opsrel.io sur l'IP 74.220.17.133, on va voir comment coredns permet cela.
Pour l'exemple, j'utilise un Cluster Civo, qui me permet de provisionner des clusters facilement. Les modifications à faire sur coredns peuvent changer selon l'installation faite par votre cloud provider ou admin préféré.
Création du cluster de test
Il suffit simplement d'utiliser la CLI pour provisionner le cluster. Ici je crée un cluster de 2 nœuds avec des instances xsmall. Je récupère ensuite le fichier de configuration pour pouvoir m'y connecter (via la variable d'environnement KUBECONFIG).
$ civo kubernetes create coredns-demo --size=g4s.kube.xsmall --nodes=2 --wait
$ civo kubernetes config coredns-demo -s -p coredns-demo-kubeconfig
$ export KUBECONFIG=${PWD}/coredns-demo-kubeconfig
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-coredns-demo-4eed-ef4cb7-node-pool-eb1c-fuv8f Ready <none> 5m27s v1.26.4+k3s1
k3s-coredns-demo-4eed-ef4cb7-node-pool-eb1c-o9bkt Ready <none> 5m52s v1.26.4+k3s1Vérification de la configuration
Tout d'abord, analysons la configuration coredns. J'ai un déploiement actif, et en regardant de plus près, je vois 2 volumes utilisés pour sa configuration :
$ kubectl get deployments coredns -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
coredns 1/1 1 1 3h25m
$ kubectl describe deployments coredns -n kube-system
Name: coredns
Namespace: kube-system
[..]
Pod Template:
[...]
Containers:
coredns:
[...]
Mounts:
/etc/coredns from config-volume (ro)
/etc/coredns/custom from custom-config-volume (ro)
Volumes:
config-volume:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: coredns
Optional: false
custom-config-volume:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: coredns-custom
Optional: true
[...]Listons ces ConfigMaps :
$ kubectl get configmap -n kube-system
NAME DATA AGE
[...]
coredns 2 3h28m
[...]Seule la ConfigMap par défaut est là, coredns-custom n'existe pas, il faudra donc la créer pour rajouter les infos. Dans la configuration par défaut, on retrouvera la Corefile ainsi que les NodeHosts dans le cas de Civo.
Création d'une entrée custom statique
Pour rajouter une entrée statique, on ne va surtout pas toucher à la configuration de base, qui pourrait se faire écraser lors d'un redéploiement. Si l'on regarde la ConfigMap coredns, on voit que la Corefile importe les fichiers présents dans /etc/coredns/custom/*.server (qui correspond au point de montage de la ConfigMap custom):
$ kubectl get configmaps coredns -n kube-system -o yaml
apiVersion: v1
data:
Corefile: |
[...]
import /etc/coredns/custom/*.server
[...]Reste à créer la ConfigMap coredns-custom avec les entrées DNS souhaitées :
# Fichier coredns-custom.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns-custom
namespace: kube-system
data:
opsrel.server: |-
# Include specific server zone
opsrel.io. {
errors
forward . /etc/resolv.conf
hosts {
74.220.17.133 myapp.opsrel.io.
fallthrough
}
}$ kubectl apply -f coredns-custom.yaml -n kube-systemOn redémarre coredns pour la prise en compte :
$ kubectl rollout restart deployment coredns -n kube-system
deployment.apps/coredns restartedValidation des modifications
Maintenant, testons sur un pod simple que la résolution fonctionne :
$ kubectl run debug --image=nginx
$ kubectl exec -it debug -- /bin/bash
root@debug:/# apt-get update && apt-get install bind9-dnsutils -y
root@debug:/# nslookup myapp.opsrel.io
Server: 10.43.0.10
Address: 10.43.0.10#53
Name: myapp.opsrel.io
Address: 74.220.17.133Je vérifie que j'ai pas tout cassé :
root@debug:/# nslookup opsrel.io
Server: 10.43.0.10
Address: 10.43.0.10#53
Non-authoritative answer:
Name: opsrel.io
Address: 213.186.33.5
root@debug:/# nslookup metrics-server
Server: 10.43.0.10
Address: 10.43.0.10#53
Name: metrics-server.kube-system.svc.cluster.local
Address: 10.43.123.103
root@debug:/# nslookup www.debian.org
Server: 10.43.0.10
Address: 10.43.0.10#53
Non-authoritative answer:
Name: www.debian.org
Address: 130.89.148.77
Name: www.debian.org
Address: 2001:67c:2564:a119::77Super ! J'ai mon entrée DNS statique qui fonctionne, je vais pouvoir continuer mes tests !