Ajouter une entrée DNS custom à coredns

Ajouter une entrée DNS custom à coredns

RV
Rémi Verchère
Platform & Cloud Native
3 min de lecture

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+k3s1

Vé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-system

On redémarre coredns pour la prise en compte :

$ kubectl rollout restart deployment coredns -n kube-system
deployment.apps/coredns restarted

Validation 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.133

Je 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::77

Super ! J'ai mon entrée DNS statique qui fonctionne, je vais pouvoir continuer mes tests !

© Gravitek. Tous droits réservés.

logo

Gravitek est une Société à taille humaine, guidée par la qualité de service et la construction d'une relation durable avec ses clients.