Aller au contenu
  1. Cilia/

Mon samedi aprèm avec le Cilium d'OVH

·3773 mots·18 mins·
Joseph Ligier
Auteur
Joseph Ligier
CNCF ambassador | Kubestronaut 🐝
Sommaire

Suite au succès de l’article sur le Kubernetes managé de Clever Cloud, une demande, que je garderai totalement anonyme, m’a été faite :

Pourquoi ne pas regarder l’intégration de Cilium dans le Kube managé d’OVH ?

Mais oui quelle bonne idée !

Rébus niveau difficile
Rébus niveau difficile


Installation de MKS
#

Qu’est-ce que la MKS ?
#

MKS est tout simplement l’acronyme de Managed Kubernetes Service. C’est le Kubernetes managé par le cloud provider français OVH cloud.

C’est la seconde fois que je touche à OVH. La première c’était vers 2009. J’avais créé un petit blog hébergé Wordpress qui a disparu. Donc on peut dire que je ne connais pas du tout OVH.

Screenshot de la présentation de MKS
Mètre Kilogramme Seconde

Comment créer un cluster ?
#

Pré-requis pour avoir ce Kubernetes :

Pour être honnête, j’ai voulu installer de la même manière que pour Clever Cloud le MKS : en ligne de commande. J’ai réussi à installer la version “free” de MKS et je suis tombé sur un Kubernetes avec comme CNI Calico… J’ai eu limite un ITT. J’ai ensuite compris que c’est uniquement la version standard (c’est à dire payante) de MKS qui utilise Cilium, il faut ainsi également installer une gateway ce qui complique encore la tâche. J’ai fini par laisser tomber la cli et utiliser l’interface web.

Pour une installation un peu plus sérieuse, il est plutôt conseillé d’utiliser Terraform ou Pulumi.

Création du cluster avec Cilium
#

Pré-requis
#

Pour créer un Kubernetes avec Cilium, il faut déjà :

  • Créer un réseau privé dans une région qui permet d’avoir un Kubernetes avec plan standard (J’ai choisi EU-WEST-PAR, Paris quoi)
  • Créer une gateway qui est attaché à ce réseau (qui est payante)
  • Créer un sous réseau

L’interface web permet de le faire facilement.

ovh vpc
ovh vpc configuration

Installation du cluster Kubernetes
#

Une fois cela fait, on peut enfin créer son cluster Kubernetes

ovh mks
ovh mks configuration
la cliquette, ça voulait dire qu’on ne sait pas utiliser OVH

J’ai également créer un Nodepool de deux nœuds workers qui sont rattachés au control plane. Pas besoin de plus pour les tests.

Récupération du Kubeconfig
#

Configuration de l’ovh cli
#

Pour récupérer le Kubeconfig, on peut le faire via l’interface graphique. Mais vu que j’avais déjà configuré la cli ovh cloud, je l’ai fait en cli.

Comme pour toute cli de cloud provider, Il faut déjà configurer son authentification :

ovhcloud login

On tombe sur :

    EU selected. Please visit https://www.ovh.com/auth/api/createToken?POST=*&GET=*&PUT=*&DELETE=* to create credentials.


 Application key
 aaaaaaaaaaaaaaaa

 Application secret
 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 Consumer key
 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

 Press enter to validate ->

En cliquant sur le lien, on tombe sur la création d’une clé api :

ovh vpc

Cela permet ainsi de récupérer Application key, Application secret et Consumer key.

Maintenant que la ligne de commande ovhcloud est configurée. On va pouvoir récupérer le Kubeconfig.

ovhcloud cloud kube list
┌──────────────────────────────────────┬────────┬─────────────┬──────────┬──────────┬────────┐
│                  id                  │  name  │   region    │   plan   │ version  │ status │
├──────────────────────────────────────┼────────┼─────────────┼──────────┼──────────┼────────┤
│ 019e552e-b548-713d-8eed-0a9df45c9daa │ cilium │ EU-WEST-PAR │ standard │ 1.35.2-3 │ READY  │
└──────────────────────────────────────┴────────┴─────────────┴──────────┴──────────┴────────┘
💡 Use option -o json or -o yaml to get the raw output with all information

Youhou on va pouvoir enfin utiliser Kube !!! C’est l’avant-dernière version de Kubernetes.

Récupérons le kubeconfig :

ovhcloud cloud kube kubeconfig generate 019e552e-b548-713d-8eed-0a9df45c9daa > ~/.kube/config

Testons :

kubectl get node

On voit alors :

NAME                 STATUS     ROLES    AGE   VERSION
cilium-8qxgd-jdbw7   NotReady   <none>   53s   v1.35.2
cilium-8qxgd-ngnmk   NotReady   <none>   51s   v1.35.2

Ah mince le cluster n’est pas encore prêt ! Je paie pour rien là !

Regardons où en est l’installation de cilium :

kubectl get pod -A
No resources found

Ah oui, ça n’a pas commencé…

En attendant, vous pouvez regarder cette vidéo :

Bon après 5 minutes, ça va être forcément installé :

kubectl get pod -A
NAMESPACE     NAME                                    READY   STATUS    RESTARTS   AGE
kube-system   cilium-75frl                            0/1     Running   0          4m48s
kube-system   cilium-envoy-4l8v5                      1/1     Running   0          4m48s
kube-system   cilium-envoy-h5hcq                      1/1     Running   0          4m48s
kube-system   cilium-k5qqm                            0/1     Running   0          4m48s
kube-system   cilium-operator-86bf684c97-sft8f        0/1     Pending   0          4m48s
kube-system   coredns-5979fb97db-2q96m                0/1     Pending   0          4m48s
kube-system   hubble-generate-certs-66jb9             0/1     Pending   0          4m48s
kube-system   hubble-relay-9685586c6-lnt69            0/1     Pending   0          4m48s
kube-system   hubble-ui-b95dbc5fd-46g6z               0/2     Pending   0          4m48s
kube-system   kube-dns-autoscaler-988cb7bd5-pp547     0/1     Pending   0          4m48s
kube-system   metrics-server-7587489986-mhrbd         0/1     Pending   0          4m45s
kube-system   openstack-cinder-csi-nodeplugin-nkt8j   3/3     Running   0          4m48s
kube-system   openstack-cinder-csi-nodeplugin-r2fgl   3/3     Running   0          4m48s
kube-system   ovhcloud-apiserver-proxy-njhct          1/1     Running   0          4m48s
kube-system   ovhcloud-apiserver-proxy-w648j          1/1     Running   0          4m48s

Je commence à faire une attaque de panique : j’ai dû me planter quelque part ! Je suis trop nul !

Comment supprimer le cluster ? La patience est la vertu des forts !

Après plus de 10 minutes, je peux enfin utiliser mon cluster Kube :

kubectl get pod -A
NAMESPACE     NAME                                    READY   STATUS      RESTARTS        AGE
kube-system   cilium-75frl                            1/1     Running     1 (4m52s ago)   10m
kube-system   cilium-envoy-4l8v5                      1/1     Running     0               10m
kube-system   cilium-envoy-h5hcq                      1/1     Running     0               10m
kube-system   cilium-k5qqm                            1/1     Running     1 (4m59s ago)   10m
kube-system   cilium-operator-86bf684c97-sft8f        1/1     Running     0               10m
kube-system   coredns-5979fb97db-2q96m                1/1     Running     0               10m
kube-system   coredns-5979fb97db-zv8dx                1/1     Running     0               2m13s
kube-system   hubble-generate-certs-kthrt             0/1     Completed   0               20s
kube-system   hubble-relay-9685586c6-lnt69            1/1     Running     1 (47s ago)     10m
kube-system   hubble-ui-b95dbc5fd-46g6z               2/2     Running     0               10m
kube-system   konnectivity-agent-8lgbh                1/1     Running     0               2m33s
kube-system   konnectivity-agent-bxcfh                1/1     Running     0               2m33s
kube-system   kube-dns-autoscaler-988cb7bd5-pp547     1/1     Running     0               10m
kube-system   metrics-server-7587489986-mhrbd         1/1     Running     0               10m
kube-system   openstack-cinder-csi-nodeplugin-nkt8j   3/3     Running     0               10m
kube-system   openstack-cinder-csi-nodeplugin-r2fgl   3/3     Running     0               10m
kube-system   ovhcloud-apiserver-proxy-njhct          1/1     Running     0               10m
kube-system   ovhcloud-apiserver-proxy-w648j          1/1     Running     0               10m

On peut voir un soucis au moment de l’installation de Cilium qui est redémarré. Pas sûr que j’ai envie de renouveler l’expérience de créer 511 clusters Kubernetes sur OVH.

Vous avez probablement raté le meilleur talk de la galaxie

Bon… L’essentiel c’est que ça fonctionne mais ça serait sympa de prévenir 😉


Observation du Cilium par OVH Cloud
#

Les Pods
#

Tout comme Clever Cloud, kube-proxy n’est pas installé donc Cilium est en mode kube-proxy replacement.

Par contre les pods cilium envoy sont présents, on peut donc supposer que les cilium network policies de niveau 7 fonctionnent.

Dernière chose : Hubble est installé. Regardons comment accéder à Hubble UI. On va faire un port-forward :

kubectl port-forward -n kube-system svc/hubble-ui 12000:80

On va pouvoir se connecter sur le navigateur à cette adresse : http://localhost:12000

Hubble est installé par défaut
Hubble dans le namespace kube-system

Les CRD
#

Regardons maintenant les CRDs :

kubectl get crd
NAME                                             CREATED AT
ciliumcidrgroups.cilium.io                       2026-05-23T14:29:59Z
ciliumclusterwidenetworkpolicies.cilium.io       2026-05-23T14:29:58Z
ciliumendpoints.cilium.io                        2026-05-23T14:29:55Z
ciliumidentities.cilium.io                       2026-05-23T14:29:53Z
ciliuml2announcementpolicies.cilium.io           2026-05-23T14:30:02Z
ciliumloadbalancerippools.cilium.io              2026-05-23T14:30:01Z
ciliumlocalredirectpolicies.cilium.io            2026-05-23T14:30:00Z
ciliumnetworkpolicies.cilium.io                  2026-05-23T14:29:57Z
ciliumnodeconfigs.cilium.io                      2026-05-23T14:30:03Z
ciliumnodes.cilium.io                            2026-05-23T14:29:52Z
ciliumpodippools.cilium.io                       2026-05-23T14:29:54Z
nodepools.kube.cloud.ovh.com                     2026-05-23T14:21:44Z
volumesnapshotclasses.snapshot.storage.k8s.io    2026-05-23T14:21:44Z
volumesnapshotcontents.snapshot.storage.k8s.io   2026-05-23T14:21:44Z
volumesnapshots.snapshot.storage.k8s.io          2026-05-23T14:21:44Z

Rien à signaler. Il y a bien des cilium network policies et des cilium cluster wide network policies.

La configuration
#

On peut voir la configuration avec la commande suivante :

kubectl get cm -n kube-system cilium-config -o yaml
Sortie standard complète
apiVersion: v1
data:
  agent-not-ready-taint-key: node.cilium.io/agent-not-ready
  auto-direct-node-routes: "false"
  bpf-distributed-lru: "false"
  bpf-events-drop-enabled: "true"
  bpf-events-policy-verdict-enabled: "true"
  bpf-events-trace-enabled: "true"
  bpf-lb-acceleration: disabled
  bpf-lb-algorithm-annotation: "false"
  bpf-lb-external-clusterip: "false"
  bpf-lb-map-max: "65536"
  bpf-lb-mode-annotation: "false"
  bpf-lb-sock: "false"
  bpf-lb-source-range-all-types: "false"
  bpf-map-dynamic-size-ratio: "0.0025"
  bpf-policy-map-max: "16384"
  bpf-policy-stats-map-max: "65536"
  bpf-root: /sys/fs/bpf
  cgroup-root: /run/cilium/cgroupv2
  cilium-endpoint-gc-interval: 5m0s
  cluster-id: "0"
  cluster-name: 019e552eb548713d8eed0a9df45c9daa
  clustermesh-enable-endpoint-sync: "false"
  clustermesh-enable-mcs-api: "false"
  cni-exclusive: "true"
  cni-log-file: /var/run/cilium/cilium-cni.log
  controller-group-metrics: write-cni-file sync-host-ips sync-lb-maps-with-k8s-services
  custom-cni-conf: "false"
  datapath-mode: veth
  debug: "false"
  default-lb-service-ipam: lbipam
  direct-routing-skip-unreachable: "false"
  dnsproxy-enable-transparent-mode: "true"
  dnsproxy-socket-linger-timeout: "10"
  egress-gateway-reconciliation-trigger-interval: 1s
  enable-auto-protect-node-port-range: "true"
  enable-bpf-clock-probe: "false"
  enable-endpoint-health-checking: "true"
  enable-endpoint-lockdown-on-policy-overflow: "false"
  enable-health-check-loadbalancer-ip: "false"
  enable-health-check-nodeport: "true"
  enable-health-checking: "true"
  enable-hubble: "true"
  enable-internal-traffic-policy: "true"
  enable-ipv4: "true"
  enable-ipv4-big-tcp: "false"
  enable-ipv4-masquerade: "true"
  enable-ipv6: "false"
  enable-ipv6-big-tcp: "false"
  enable-ipv6-masquerade: "true"
  enable-k8s-networkpolicy: "true"
  enable-l2-neigh-discovery: "false"
  enable-l7-proxy: "true"
  enable-lb-ipam: "true"
  enable-local-redirect-policy: "true"
  enable-masquerade-to-route-source: "false"
  enable-metrics: "true"
  enable-node-selector-labels: "false"
  enable-non-default-deny-policies: "true"
  enable-policy: default
  enable-policy-secrets-sync: "true"
  enable-sctp: "false"
  enable-service-topology: "true"
  enable-source-ip-verification: "true"
  enable-svc-source-range-check: "true"
  enable-tcx: "true"
  enable-vtep: "false"
  enable-well-known-identities: "false"
  enable-xt-socket-fallback: "true"
  envoy-access-log-buffer-size: "4096"
  envoy-base-id: "0"
  envoy-keep-cap-netbindservice: "false"
  external-envoy-proxy: "true"
  health-check-icmp-failure-threshold: "3"
  http-retry-count: "3"
  http-stream-idle-timeout: "300"
  hubble-disable-tls: "false"
  hubble-listen-address: :4244
  hubble-network-policy-correlation-enabled: "true"
  hubble-socket-path: /var/run/cilium/hubble.sock
  hubble-tls-cert-file: /var/lib/cilium/tls/hubble/server.crt
  hubble-tls-client-ca-files: /var/lib/cilium/tls/hubble/client-ca.crt
  hubble-tls-key-file: /var/lib/cilium/tls/hubble/server.key
  identity-allocation-mode: crd
  identity-gc-interval: 15m0s
  identity-heartbeat-timeout: 30m0s
  identity-management-mode: agent
  install-no-conntrack-iptables-rules: "false"
  ipam: kubernetes
  ipam-cilium-node-update-rate: 15s
  iptables-random-fully: "false"
  k8s-require-ipv4-pod-cidr: "false"
  k8s-require-ipv6-pod-cidr: "false"
  kube-proxy-replacement: "true"
  kube-proxy-replacement-healthz-bind-address: ""
  max-connected-clusters: "255"
  mesh-auth-enabled: "true"
  mesh-auth-gc-interval: 5m0s
  mesh-auth-queue-size: "1024"
  mesh-auth-rotated-identities-queue-size: "1024"
  metrics-sampling-interval: 5m
  monitor-aggregation: medium
  monitor-aggregation-flags: all
  monitor-aggregation-interval: 5s
  nat-map-stats-entries: "32"
  nat-map-stats-interval: 30s
  node-port-bind-protection: "true"
  nodes-gc-interval: 5m0s
  operator-api-serve-addr: 127.0.0.1:9234
  operator-prometheus-serve-addr: :9963
  policy-default-local-cluster: "false"
  policy-secrets-namespace: cilium-secrets
  policy-secrets-only-from-secrets-namespace: "true"
  preallocate-bpf-maps: "false"
  procfs: /host/proc
  prometheus-serve-addr: :9962
  proxy-connect-timeout: "2"
  proxy-idle-timeout-seconds: "60"
  proxy-initial-fetch-timeout: "30"
  proxy-max-concurrent-retries: "128"
  proxy-max-connection-duration-seconds: "0"
  proxy-max-requests-per-connection: "0"
  proxy-xff-num-trusted-hops-egress: "0"
  proxy-xff-num-trusted-hops-ingress: "0"
  remove-cilium-node-taints: "true"
  routing-mode: tunnel
  service-no-backend-response: reject
  set-cilium-is-up-condition: "true"
  set-cilium-node-taints: "true"
  synchronize-k8s-nodes: "true"
  tofqdns-dns-reject-response-code: refused
  tofqdns-enable-dns-compression: "true"
  tofqdns-endpoint-max-ip-per-hostname: "1000"
  tofqdns-idle-connection-grace-period: 0s
  tofqdns-max-deferred-connection-deletes: "10000"
  tofqdns-preallocate-identities: "true"
  tofqdns-proxy-response-max-delay: 100ms
  tunnel-protocol: vxlan
  tunnel-source-port-range: 0-0
  unmanaged-pod-watcher-interval: "15"
  vtep-cidr: ""
  vtep-endpoint: ""
  vtep-mac: ""
  vtep-mask: ""
  write-cni-conf-when-ready: /host/etc/cni/net.d/05-cilium.conflist
kind: ConfigMap
metadata:
  annotations:
    argocd.argoproj.io/tracking-id: mylnvjyk_mks-customer-019e552e-b548-713d-8eed-0a9df45c9daa:/ConfigMap:kube-system/cilium-config
  creationTimestamp: "2026-05-23T14:21:44Z"
  labels:
    argocd.argoproj.io/instance: mylnvjyk_mks-customer-019e552e-b548-713d-8eed-0a9df45c9daa
  name: cilium-config
  namespace: kube-system
  resourceVersion: "818"
  uid: b1e21425-83b2-4293-8e3a-3d41beb6ff53
Sortie standard simplifié
kind: ConfigMap
apiVersion: v1
metadata:
  name: cilium-config
  namespace: kube-system
  labels:
    argocd.argoproj.io/instance: mylnvjyk_mks-customer-019e552e-b548-713d-8eed-0a9df45c9daa
data:
  routing-mode: tunnel
  tunnel-protocol: vxlan
  datapath-mode: veth
  kube-proxy-replacement: "true"

  enable-ipv4: "true"
  enable-ipv4-big-tcp: "false"
  enable-ipv4-masquerade: "true"
  enable-ipv6: "false"
  enable-ipv6-big-tcp: "false"
  enable-ipv6-masquerade: "true"

  ipam: kubernetes
  default-lb-service-ipam: lbipam
  enable-lb-ipam: "true"

  enable-policy: default
  enable-k8s-networkpolicy: "true"
  enable-l7-proxy: "true"
  identity-allocation-mode: crd

  enable-hubble: "true"
  hubble-disable-tls: "false"
  hubble-listen-address: :4244

  cluster-id: "0"
  cluster-name: 019e552eb548713d8eed0a9df45c9daa
  max-connected-clusters: "255"

  enable-metrics: "true"

On retrouve déjà pas mal de chose qu’on a vu précédemment.

On voit également que Cilium a été installé avec ArgoCD (qui est masqué par OVH) :

  labels:
    argocd.argoproj.io/instance: mylnvjyk_mks-customer-019e552e-b548-713d-8eed-0a9df45c9daa

Ça vient probablement de là le restart. On peut aussi supposer que si on modifie cette conf, argoCD remettrait automatiquement l’ancienne configuration.

La configMap est beaucoup plus fourni sur ovh que sur Clever Cloud. Il y a donc plus de tuning par défaut.

Contrairement à Clever, je vois l’option ipam à kubernetes : c’est donc le cluster Kubernetes qui s’occupe de la gestion des IPs pour les pods.

Cette option est “importante” car on ne peut pas la modifier après l’installation de Cilium (voir la documentation).

Pour les experts Cilium qui me lisent, je vous montre la sortie standard de cette commande :

kubectl exec -it ds/cilium -n kube-system -c cilium-agent -- cilium status --verbose
Sortie standard complète
KVStore:                Disabled
Kubernetes:             Ok         1.35 (v1.35.2) [linux/amd64]
Kubernetes APIs:        ["EndpointSliceOrEndpoint", "cilium/v2::CiliumCIDRGroup", "cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Pods", "networking.k8s.io/v1::NetworkPolicy"]
KubeProxyReplacement:   True   [ens3   10.1.2.226 fe80::f816:3eff:fe38:a6d3 (Direct Routing)]
Host firewall:          Disabled
SRv6:                   Disabled
CNI Chaining:           none
CNI Config file:        successfully wrote CNI configuration file to /host/etc/cni/net.d/05-cilium.conflist
Cilium:                 Ok   1.18.4 (v1.18.4-afda2aa9)
NodeMonitor:            Listening for events on 2 CPUs with 64x4096 of shared memory
Cilium health daemon:   Ok
IPAM:                   IPv4: 8/254 allocated from 10.240.0.0/24,
Allocated addresses:
  10.240.0.107 (kube-system/konnectivity-agent-8lgbh)
  10.240.0.140 (health)
  10.240.0.166 (kube-system/hubble-ui-b95dbc5fd-46g6z)
  10.240.0.169 (router)
  10.240.0.198 (kube-system/kube-dns-autoscaler-988cb7bd5-pp547)
  10.240.0.202 (kube-system/hubble-relay-9685586c6-lnt69)
  10.240.0.69 (kube-system/metrics-server-7587489986-mhrbd)
  10.240.0.71 (kube-system/coredns-5979fb97db-2q96m)
IPv4 BIG TCP:           Disabled
IPv6 BIG TCP:           Disabled
BandwidthManager:       Disabled
Routing:                Network: Tunnel [vxlan]   Host: Legacy
Attach Mode:            TCX
Device Mode:            veth
Masquerading:           IPTables [IPv4: Enabled, IPv6: Disabled]
Clock Source for BPF:   ktime
Controller Status:      46/46 healthy
  Name                                                             Last success   Last error   Count   Message
  cilium-health-ep                                                 33s ago        never        0       no error
  ct-map-pressure                                                  34s ago        never        0       no error
  daemon-validate-config                                           26s ago        never        0       no error
  endpoint-2870-regeneration-recovery                              never          never        0       no error
  endpoint-2971-regeneration-recovery                              never          never        0       no error
  endpoint-3115-regeneration-recovery                              never          never        0       no error
  endpoint-3340-regeneration-recovery                              never          never        0       no error
  endpoint-3856-regeneration-recovery                              never          never        0       no error
  endpoint-436-regeneration-recovery                               never          never        0       no error
  endpoint-869-regeneration-recovery                               never          never        0       no error
  endpoint-892-regeneration-recovery                               never          never        0       no error
  endpoint-gc                                                      3m35s ago      never        0       no error
  endpoint-periodic-regeneration                                   35s ago        never        0       no error
  ipcache-inject-labels                                            34s ago        never        0       no error
  k8s-heartbeat                                                    5s ago         never        0       no error
  proxy-ports-checkpoint                                           8m34s ago      never        0       no error
  resolve-identity-2870                                            3m34s ago      never        0       no error
  resolve-identity-2971                                            3m34s ago      never        0       no error
  resolve-identity-3115                                            3m34s ago      never        0       no error
  resolve-identity-3340                                            3m33s ago      never        0       no error
  resolve-identity-3856                                            3m34s ago      never        0       no error
  resolve-identity-436                                             3m34s ago      never        0       no error
  resolve-identity-869                                             3m18s ago      never        0       no error
  resolve-identity-892                                             3m34s ago      never        0       no error
  resolve-labels-kube-system/coredns-5979fb97db-2q96m              8m34s ago      never        0       no error
  resolve-labels-kube-system/hubble-relay-9685586c6-lnt69          8m18s ago      never        0       no error
  resolve-labels-kube-system/hubble-ui-b95dbc5fd-46g6z             8m34s ago      never        0       no error
  resolve-labels-kube-system/konnectivity-agent-8lgbh              8m34s ago      never        0       no error
  resolve-labels-kube-system/kube-dns-autoscaler-988cb7bd5-pp547   8m34s ago      never        0       no error
  resolve-labels-kube-system/metrics-server-7587489986-mhrbd       8m34s ago      never        0       no error
  sync-policymap-2870                                              8m31s ago      never        0       no error
  sync-policymap-2971                                              8m31s ago      never        0       no error
  sync-policymap-3115                                              8m32s ago      never        0       no error
  sync-policymap-3340                                              8m31s ago      never        0       no error
  sync-policymap-3856                                              8m31s ago      never        0       no error
  sync-policymap-436                                               8m31s ago      never        0       no error
  sync-policymap-869                                               8m18s ago      never        0       no error
  sync-policymap-892                                               8m31s ago      never        0       no error
  sync-to-k8s-ciliumendpoint (2870)                                14s ago        never        0       no error
  sync-to-k8s-ciliumendpoint (2971)                                14s ago        never        0       no error
  sync-to-k8s-ciliumendpoint (3856)                                14s ago        never        0       no error
  sync-to-k8s-ciliumendpoint (436)                                 14s ago        never        0       no error
  sync-to-k8s-ciliumendpoint (869)                                 8s ago         never        0       no error
  sync-to-k8s-ciliumendpoint (892)                                 14s ago        never        0       no error
  sync-utime                                                       34s ago        never        0       no error
  write-cni-file
Modules Health:                            agent
                                           ├── controlplane
                                           │   ├── auth
                                           │   │   ├── observer-job-auth-gc-identity-events            [OK] OK (2.73µs) [8] (8m18s, x1)
                                           │   │   ├── observer-job-auth-request-authentication        [OK] Primed (8m34s, x1)
                                           │   │   └── timer-job-auth-gc-cleanup                       [OK] OK (10.04µs) (3m34s, x1)
                                           │   ├── bgp-control-plane
                                           │   │   ├── job-diffstore-events                            [OK] Running (8m35s, x2)
                                           │   │   ├── observer-job-default-gateway-route-change-tracker    [OK] OK (520ns) [71] (8m18s, x1)
                                           │   │   └── observer-job-device-change-device-change-tracker    [OK] OK (900ns) [39] (8m18s, x1)
                                           │   ├── cilium-agent-dynamic-config
                                           │   │   └── job-k8s-reflector-cilium-configs-cm-cilium-config-kube-system    [OK] 144 upserted, 0 deleted, 144 total objects (8m34s, x1)
                                           │   ├── ciliumenvoyconfig
                                           │   │   ├── job-reconcile                                   [OK] OK, 0 object(s) (8m34s, x3)
                                           │   │   ├── job-refresh                                     [OK] Next refresh in 30m0s (8m34s, x1)
                                           │   │   └── observer-job-node-labels                        [OK] Primed (8m34s, x1)
                                           │   ├── config-drift-checker
                                           │   │   └── job-drift-checker                               [OK] Running (8m34s, x1)
                                           │   ├── daemon
                                           │   │   ├──                                                 [OK] daemon-validate-config (26s, x9)
                                           │   │   └── job-sync-hostips                                [OK] Synchronized (34s, x10)
                                           │   ├── dynamic-lifecycle-manager
                                           │   │   ├── job-reconcile                                   [OK] OK, 0 object(s) (8m34s, x3)
                                           │   │   └── job-refresh                                     [OK] Next refresh in 30m0s (8m34s, x1)
                                           │   ├── enabled-features
                                           │   │   └── job-update-config-metric                        [STOPPED] Waiting for agent config (8m34s, x1)
                                           │   ├── endpoint-api
                                           │   │   ├── job-cni-deletion-queue                          [STOPPED] Running (8m35s, x1)
                                           │   │   └── job-unlock-lockfile                             [STOPPED] Running (8m34s, x1)
                                           │   ├── endpoint-manager
                                           │   │   ├── cilium-endpoint-2870 (kube-system/coredns-5979fb97db-2q96m)
                                           │   │   │   ├── cep-k8s-sync                                [OK] sync-to-k8s-ciliumendpoint (2870) (4s, x53)
                                           │   │   │   ├── datapath-regenerate                         [OK] Endpoint regeneration successful (35s, x6)
                                           │   │   │   └── policymap-sync                              [OK] sync-policymap-2870 (8m31s, x1)
                                           │   │   ├── cilium-endpoint-2971 (kube-system/kube-dns-autoscaler-988cb7bd5-pp547)
                                           │   │   │   ├── cep-k8s-sync                                [OK] sync-to-k8s-ciliumendpoint (2971) (4s, x53)
                                           │   │   │   ├── datapath-regenerate                         [OK] Endpoint regeneration successful (35s, x6)
                                           │   │   │   └── policymap-sync                              [OK] sync-policymap-2971 (8m31s, x1)
                                           │   │   ├── cilium-endpoint-3115 (/)
                                           │   │   │   ├── datapath-regenerate                         [OK] Endpoint regeneration successful (35s, x7)
                                           │   │   │   └── policymap-sync                              [OK] sync-policymap-3115 (8m32s, x1)
                                           │   │   ├── cilium-endpoint-3340 (/)
                                           │   │   │   ├── datapath-regenerate                         [OK] Endpoint regeneration successful (35s, x6)
                                           │   │   │   └── policymap-sync                              [OK] sync-policymap-3340 (8m31s, x1)
                                           │   │   ├── cilium-endpoint-3856 (kube-system/konnectivity-agent-8lgbh)
                                           │   │   │   ├── cep-k8s-sync                                [OK] sync-to-k8s-ciliumendpoint (3856) (4s, x53)
                                           │   │   │   ├── datapath-regenerate                         [OK] Endpoint regeneration successful (35s, x6)
                                           │   │   │   └── policymap-sync                              [OK] sync-policymap-3856 (8m31s, x1)
                                           │   │   ├── cilium-endpoint-436 (kube-system/hubble-ui-b95dbc5fd-46g6z)
                                           │   │   │   ├── cep-k8s-sync                                [OK] sync-to-k8s-ciliumendpoint (436) (4s, x53)
                                           │   │   │   ├── datapath-regenerate                         [OK] Endpoint regeneration successful (35s, x6)
                                           │   │   │   └── policymap-sync                              [OK] sync-policymap-436 (8m31s, x1)
                                           │   │   ├── cilium-endpoint-869 (kube-system/hubble-relay-9685586c6-lnt69)
                                           │   │   │   ├── cep-k8s-sync                                [OK] sync-to-k8s-ciliumendpoint (869) (8s, x51)
                                           │   │   │   ├── datapath-regenerate                         [OK] Endpoint regeneration successful (35s, x5)
                                           │   │   │   └── policymap-sync                              [OK] sync-policymap-869 (8m18s, x1)
                                           │   │   ├── cilium-endpoint-892 (kube-system/metrics-server-7587489986-mhrbd)
                                           │   │   │   ├── cep-k8s-sync                                [OK] sync-to-k8s-ciliumendpoint (892) (4s, x53)
                                           │   │   │   ├── datapath-regenerate                         [OK] Endpoint regeneration successful (35s, x7)
                                           │   │   │   └── policymap-sync                              [OK] sync-policymap-892 (8m31s, x1)
                                           │   │   ├── endpoint-gc                                     [OK] endpoint-gc (3m35s, x2)
                                           │   │   └── job-namespace-updater                           [OK] Running (8m34s, x1)
                                           │   ├── envoy-proxy
                                           │   │   ├── observer-job-k8s-secrets-resource-events-cilium-secrets    [OK] Primed (8m34s, x1)
                                           │   │   └── timer-job-version-check                         [OK] OK (1.659904ms) (34s, x1)
                                           │   ├── ep-bpf-prog-watchdog
                                           │   │   └── timer-job-ep-bpf-prog-watchdog                  [OK] OK (787.387µs) (4s, x1)
                                           │   ├── fqdn
                                           │   │   ├── dns-proxy
                                           │   │   │   └── job-proxy-bootstrapper                      [STOPPED] DNS proxy successfully initialized on port 42401 (8m34s, x1)
                                           │   │   └── namemanager
                                           │   │       ├── job-remove-restored-prefixes                [STOPPED] Running (8m35s, x1)
                                           │   │       ├── observer-job-preallocate                    [OK] Primed (8m35s, x1)
                                           │   │       └── timer-job-dns-garbage-collector-job         [OK] OK (20.43µs) (35s, x1)
                                           │   ├── hubble
                                           │   │   ├── job-certloader-server-tls                       [STOPPED] Running (8m34s, x1)
                                           │   │   └── job-hubble                                      [STOPPED] Running (8m34s, x1)
                                           │   ├── k8s-tables
                                           │   │   ├── job-k8s-reflector-k8s-namespaces-daemon-k8s     [OK] 5 upserted, 0 deleted, 5 total objects (8m35s, x1)
                                           │   │   └── job-k8s-reflector-k8s-pods-daemon-k8s           [OK] 1 upserted, 0 deleted, 11 total objects (6m27s, x3)
                                           │   ├── l2-announcer
                                           │   │   └── job-l2-announcer-lease-gc                       [STOPPED] Running (8m34s, x1)
                                           │   ├── loadbalancer-healthserver
                                           │   │   └── job-control-loop                                [OK] 0 health servers running (6m26s, x23)
                                           │   ├── loadbalancer-maps
                                           │   │   └── timer-job-pressure-metrics-reporter             [OK] OK (413.981µs) (3m34s, x1)
                                           │   ├── loadbalancer-reconciler
                                           │   │   ├── job-reconcile                                   [OK] OK, 8 object(s) (6m26s, x21)
                                           │   │   ├── job-refresh                                     [OK] Next refresh in 30m0s (8m34s, x1)
                                           │   │   ├── job-start-reconciler                            [STOPPED] Started (8m34s, x1)
                                           │   │   └── socket-termination
                                           │   │       └── job-socket-termination                      [OK] Running (8m34s, x1)
                                           │   ├── loadbalancer-reflectors
                                           │   │   └── k8s-reflector
                                           │   │       ├── job-reflect-pods                            [OK] Running (8m34s, x1)
                                           │   │       └── job-reflect-services-endpoints              [OK] Running (8m34s, x1)
                                           │   ├── loadbalancer-writer
                                           │   │   ├── job-node-addr-reconciler                        [OK] Running (8m34s, x1)
                                           │   │   └── job-zone-watcher                                [OK] Running (8m34s, x1)
                                           │   ├── local-redirect-policies
                                           │   │   ├── job-controller                                  [OK] Running (8m34s, x1)
                                           │   │   ├── job-k8s-reflector-localredirectpolicies-lrps    [OK] 0 upserted, 0 deleted, 0 total objects (8m34s, x1)
                                           │   │   ├── job-reconcile                                   [OK] OK, 6 object(s) (8m18s, x2)
                                           │   │   └── job-refresh                                     [OK] Next refresh in 30m0s (8m34s, x1)
                                           │   ├── nat-stats
                                           │   │   └── timer-job-nat-stats                             [OK] OK (292.511µs) (4s, x1)
                                           │   ├── node-manager
                                           │   │   ├── job-backgroundSync                              [OK] Node validation successful (59s, x7)
                                           │   │   ├── node-checkpoint-writer                          [OK] node checkpoint written (7m34s, x2)
                                           │   │   └── nodes-add                                       [OK] Node adds successful (8m34s, x2)
                                           │   ├── policy
                                           │   │   ├── observer-job-policy-importer                    [OK] Primed (8m35s, x1)
                                           │   │   └── timer-job-id-alloc-update-policy-maps           [OK] OK (1.470756ms) (8m18s, x1)
                                           │   ├── stale-endpoint-cleanup
                                           │   │   └── job-endpoint-cleanup                            [STOPPED] Running (8m34s, x1)
                                           │   └── status
                                           │       └── job-probes                                      [OK] Running (8m34s, x1)
                                           ├── datapath
                                           │   ├── agent-liveness-updater
                                           │   │   └── timer-job-agent-liveness-updater                [OK] OK (34.449µs) (0s, x1)
                                           │   ├── iptables
                                           │   │   ├── ipset
                                           │   │   │   ├── job-ipset-init-finalizer                    [STOPPED] Running (8m35s, x1)
                                           │   │   │   ├── job-reconcile                               [OK] OK, 0 object(s) (8m35s, x2)
                                           │   │   │   └── job-refresh                                 [OK] Next refresh in 30m0s (8m35s, x1)
                                           │   │   └── job-iptables-reconciliation-loop                [OK] iptables rules full reconciliation completed (8m34s, x1)
                                           │   ├── l2-responder
                                           │   │   └── job-l2-responder-reconciler                     [OK] Running (8m34s, x1)
                                           │   ├── link-cache
                                           │   │   └── timer-job-sync                                  [OK] OK (267.392µs) (4s, x1)
                                           │   ├── maps
                                           │   │   └── bwmap
                                           │   │       └── timer-job-pressure-metric-throttle          [OK] OK (1.85µs) (4s, x1)
                                           │   ├── mtu
                                           │   │   ├── job-endpoint-mtu-updater                        [OK] Endpoint MTU updated (8m34s, x1)
                                           │   │   └── job-mtu-updater                                 [OK] MTU updated (1500) (8m35s, x1)
                                           │   ├── node-address
                                           │   │   └── job-node-address-update                         [OK] 10.240.0.169 (primary), fe80::504a:5cff:feef:b7d (primary) (8m34s, x1)
                                           │   ├── orchestrator
                                           │   │   └── job-reinitialize                                [OK] OK (8m27s, x2)
                                           │   └── sysctl
                                           │       ├── job-reconcile                                   [OK] OK, 20 object(s) (8m31s, x11)
                                           │       └── job-refresh                                     [OK] Next refresh in 2m31.804297164s (67s, x1)
                                           └── infra
                                               ├── agent-healthz
                                               │   └── job-agent-healthz-server-ipv4                   [OK] Running (8m34s, x1)
                                               ├── k8s-synced-crdsync
                                               │   └── job-sync-crds                                   [STOPPED] Running (11m, x1)
                                               ├── metrics
                                               │   ├── job-collect                                     [OK] Sampled 24 metrics in 1.694474ms, next collection at 2026-05-23 14:40:04.840469924 +0000 UTC m=+752.908964505 (3m34s, x1)
                                               │   └── timer-job-cleanup                               [OK] Primed (8m34s, x1)
                                               ├── service-resolver
                                               │   └── job-service-reloader-initializer                [OK] Running (8m35s, x1)
                                               └── shell
                                                   └── job-listener                                    [OK] Listening on /var/run/cilium/shell.sock (8m34s, x1)```
Sortie standard simplifié
KVStore:                Disabled
Kubernetes:             Ok         1.35 (v1.35.2) [linux/amd64]
Kubernetes APIs:        ["EndpointSliceOrEndpoint", "cilium/v2::CiliumCIDRGroup", "cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumNode", "core/v1::Pods", "networking.k8s.io/v1::NetworkPolicy"]
KubeProxyReplacement:   True   [ens3   10.1.2.226 fe80::f816:3eff:fe38:a6d3 (Direct Routing)]
Host firewall:          Disabled
SRv6:                   Disabled
CNI Chaining:           none
CNI Config file:        successfully wrote CNI configuration file to /host/etc/cni/net.d/05-cilium.conflist
Cilium:                 Ok   1.18.4 (v1.18.4-afda2aa9)
NodeMonitor:            Listening for events on 2 CPUs with 64x4096 of shared memory
Cilium health daemon:   Ok
IPAM:                   IPv4: 8/254 allocated from 10.240.0.0/24,
Allocated addresses:
  10.240.0.107 (kube-system/konnectivity-agent-8lgbh)
  10.240.0.140 (health)
  10.240.0.166 (kube-system/hubble-ui-b95dbc5fd-46g6z)
  10.240.0.169 (router)
  10.240.0.198 (kube-system/kube-dns-autoscaler-988cb7bd5-pp547)
  10.240.0.202 (kube-system/hubble-relay-9685586c6-lnt69)
  10.240.0.69 (kube-system/metrics-server-7587489986-mhrbd)
  10.240.0.71 (kube-system/coredns-5979fb97db-2q96m)
IPv4 BIG TCP:           Disabled
IPv6 BIG TCP:           Disabled
BandwidthManager:       Disabled
Routing:                Network: Tunnel [vxlan]   Host: Legacy
Attach Mode:            TCX
Device Mode:            veth
Masquerading:           IPTables [IPv4: Enabled, IPv6: Disabled]
Clock Source for BPF:   ktime
Controller Status:      46/46 healthy
  

On voit par exemple qu’on a la version 1.18.4 de Cilium (la dernière version est la 1.19.4).


Modification de la configuration de Cilium
#

Comme on l’a vu dans la partie précédente, Cilium est géré par ArgoCD, il n’est donc pas possible de changer la configMap cilium-config. Alors comment on fait ?

En overridant les valeurs de la configMap !

CiliumNodeConfig
#

CiliumNodeConfig est une CRD créée par Cilium qui a exactement ce but :

CiliumNodeConfig

Comme son nom l’indique on peut overrider pour certains nœuds en particulier. Mais pour 95% des cas (estimation au doigt mouillé), on sélectionne tous les nœuds.

Activer Wireguard
#

Wireguard est un VPN qui permet de chiffrer les connexions entre les nœuds et les pods. Pour des contraintes de sécurité, il peut être intéressant de configurer cela. Voyons comme faire cela. On peut commencer par lire la documentation. Et particulièrement cette ligne :

WireGuard may also be enabled manually by setting the enable-wireguard: true option in the Cilium ConfigMap and restarting each Cilium agent instance.

Ainsi il suffit de rajouter l’option enable-wireguard: true. Dans CiliumNodeConfig :

apiVersion: cilium.io/v2
kind: CiliumNodeConfig
metadata:
  namespace: kube-system
  name: enable-wireguard
spec:
  nodeSelector: {}
  defaults:
    enable-wireguard: "true"
kubectl apply -f wireguard.yaml

Il faut ensuite redémarrer les agents cilium pour que la configuration puisse être pris en compte :

kubectl -n kube-system rollout restart daemonset cilium

Vérifions que c’est bien installé :

kubectl exec -it ds/cilium -n kube-system -c cilium-agent -- cilium status
 1KVStore:                 Disabled
 2Kubernetes:              Ok         1.35 (v1.35.2) [linux/amd64]
 3Kubernetes APIs:         ["EndpointSliceOrEndpoint", "cilium/v2::CiliumCIDRGroup", "cilium/v2::CiliumClusterwideNetworkPolicy", "cilium/v2::CiliumEndpoint", "cilium/v2::CiliumNetworkPolicy", "cilium/v2::CiliumN
 4ode", "core/v1::Pods", "networking.k8s.io/v1::NetworkPolicy"]
 5KubeProxyReplacement:    True   [ens3   10.1.2.226 fe80::f816:3eff:fe38:a6d3 (Direct Routing)]
 6Host firewall:           Disabled
 7SRv6:                    Disabled
 8CNI Chaining:            none
 9CNI Config file:         successfully wrote CNI configuration file to /host/etc/cni/net.d/05-cilium.conflist
10Cilium:                  Ok   1.18.4 (v1.18.4-afda2aa9)
11NodeMonitor:             Listening for events on 2 CPUs with 64x4096 of shared memory
12Cilium health daemon:    Ok
13IPAM:                    IPv4: 8/254 allocated from 10.240.0.0/24,
14IPv4 BIG TCP:            Disabled
15IPv6 BIG TCP:            Disabled
16BandwidthManager:        Disabled
17Routing:                 Network: Tunnel [vxlan]   Host: Legacy
18Attach Mode:             TCX
19Device Mode:             veth
20Masquerading:            IPTables [IPv4: Enabled, IPv6: Disabled]
21Controller Status:       53/53 healthy
22Proxy Status:            OK, ip 10.240.0.169, 0 redirects active on ports 10000-20000, Envoy: external
23Global Identity Range:   min 256, max 65535
24Hubble:                  Ok              Current/Max Flows: 3601/4095 (87.94%), Flows/s: 32.53   Metrics: Disabled
25Encryption:              Wireguard       [NodeEncryption: Disabled, cilium_wg0 (Pubkey: g18YQcBTUOCgKv4T1NtFxTdgcoTcrYWOA2e9NYiFGxk=, Port: 51871, Peers: 1)]
26Cluster health:          2/2 reachable   (2026-05-23T15:27:19Z)   (Probe interval: 1m36.566274746s)
27Name                     IP              Node                     Endpoints
28Modules Health:          Stopped(12) Degraded(0) OK(87)

Pour en savoir plus, n’hésitez pas à aller voir dans la documentation officielle.


J’espère que ce petit voyage dans le Cilium d’OVH vous a plu !

Est-ce qu’il y a un autre Kubernetes managé dont vous voudriez voir son intégration avec Cilium ?

Vais-je écrire le livre 50 nuances de Cilium managé ? Suspense…

Articles connexes