Installation et configuration avancée de K3s avec Cilium
Dans cet article, nous allons explorer en détail l’installation et la configuration de K3s, une distribution légère de Kubernetes, en utilisant Cilium comme solution de mise en réseau (CNI). Cette configuration avancée nous permettra de remplacer certains composants par défaut de K3s par des alternatives plus performantes.
Pourquoi choisir Cilium ?
Par défaut, K3s est livré avec le CNI Flannel, un ingress basé sur Traefik, un load balancer basé sur Klipper, et le kube-proxy natif. Cependant, nous allons opter pour Cilium comme CNI, car il offre des fonctionnalités avancées, notamment un ingress et un load balancer intégrés, éliminant ainsi le besoin de composants supplémentaires comme MetalLB.
Installation de K3s
Commençons par installer K3s avec une configuration personnalisée :
1 2 3 |
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --disable traefik --disable servicelb --disable-kube-proxy --flannel-backend none --disable-network-policy" sh - |
Cette commande installe K3s en désactivant Traefik, le service load balancer, kube-proxy, et la politique réseau par défaut.
Configuration de Cilium
Exportation du kubeconfig
1 2 3 |
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml |
Installation du CLI Cilium
1 2 3 4 5 6 7 8 9 |
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt) CLI_ARCH=amd64 if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum} sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum} |
Installation de Cilium
1 2 3 |
cilium install --chart-directory ./install/kubernetes/cilium |
Configuration de Cilium comme remplaçant de kube-proxy
1 2 3 4 5 6 7 8 9 |
API_SERVER_IP=<votre_ip_serveur_api> API_SERVER_PORT=6443 helm install cilium ./cilium \ --namespace kube-system \ --set kubeProxyReplacement=true \ --set k8sServiceHost=${API_SERVER_IP} \ --set k8sServicePort=${API_SERVER_PORT} |
Remplacez <votre_ip_serveur_api>
par l’adresse IP physique de votre machine Linux.
Vérification de la configuration
1 2 3 |
kubectl -n kube-system exec ds/cilium -- cilium-dbg status | grep KubeProxyReplacement |
Vous devriez voir : KubeProxyReplacement: True
Si ce n’est pas le cas, rechargez la configuration de Cilium :
1 2 3 4 |
kubectl -n kube-system rollout restart deployment/cilium-operator kubectl -n kube-system rollout restart ds/cilium |
Activation de l’ingress Cilium
1 2 3 4 5 6 7 |
helm upgrade cilium ./cilium \ --namespace kube-system \ --reuse-values \ --set ingressController.enabled=true \ --set ingressController.loadbalancerMode=dedicated |
Configuration du load balancer Cilium
Créez un fichier pool.yaml
avec le contenu suivant :
1 2 3 4 5 6 7 8 9 |
apiVersion: cilium.io/v2alpha1 kind: CiliumLoadBalancerIPPool metadata: name: default-pool spec: blocks: - cidr: 192.168.100.128/25 |
Appliquez la configuration :
1 2 3 |
kubectl apply -f pool.yaml |
Activez les annonces L2 :
1 2 3 4 5 6 7 8 |
helm upgrade cilium ./cilium \ --namespace kube-system \ --reuse-values \ --set kubeProxyReplacement=true \ --set l2announcements.enabled=true \ --set externalIPs.enabled=true |
Créez un fichier L2Annonces.yaml
:
1 2 3 4 5 6 7 8 9 10 |
apiVersion: cilium.io/v2alpha1 kind: CiliumL2AnnouncementPolicy metadata: name: default-l2-announcement-policy namespace: kube-system spec: externalIPs: true loadBalancerIPs: true |
Appliquez la configuration :
1 2 3 |
kubectl apply -f L2Annonces.yaml |
Test avec un déploiement WordPress
Pour tester votre configuration, vous pouvez utiliser le déploiement WordPress suivant. Ce déploiement inclut WordPress, MySQL, des services associés, et des volumes persistants.
Voici le YAML complet pour le déploiement :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
apiVersion: v1 kind: Namespace metadata: name: wp-demo --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wp-pv-claim namespace: wp-demo spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: local-path --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim namespace: wp-demo spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi storageClassName: local-path --- apiVersion: apps/v1 kind: Deployment metadata: name: company-blog namespace: wp-demo labels: app: company-blog spec: replicas: 1 selector: matchLabels: app: company-blog template: metadata: labels: app: company-blog spec: containers: - name: company-blog image: wordpress:latest ports: - containerPort: 80 env: - name: WORDPRESS_DB_HOST value: mysql - name: WORDPRESS_DB_USER valueFrom: secretKeyRef: name: mysql-secrets key: username - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-secrets key: password volumeMounts: - name: wordpress-persistent-storage mountPath: /var/www/html volumes: - name: wordpress-persistent-storage persistentVolumeClaim: claimName: wp-pv-claim --- apiVersion: v1 kind: Service metadata: name: company-blog-service namespace: wp-demo spec: selector: app: company-blog ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: mysql namespace: wp-demo labels: app: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 ports: - containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secrets key: root-password - name: MYSQL_DATABASE value: wordpress - name: MYSQL_USER valueFrom: secretKeyRef: name: mysql-secrets key: username - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-secrets key: password volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv-claim --- apiVersion: v1 kind: Service metadata: name: mysql namespace: wp-demo spec: selector: app: mysql ports: - protocol: TCP port: 3306 targetPort: 3306 --- apiVersion: v1 kind: Secret metadata: name: mysql-secrets namespace: wp-demo type: Opaque stringData: username: votre_utilisateur password: votre_mot_de_passe root-password: votre_mot_de_passe_root |
Pour déployer cette configuration, sauvegardez le YAML ci-dessus dans un fichier (par exemple, wordpress-deployment.yaml
), puis appliquez-le avec la commande suivante :
kubectl apply -f wordpress-deployment.yaml
N’oubliez pas de remplacer votre_utilisateur
, votre_mot_de_passe
, et votre_mot_de_passe_root
dans la section Secret
par vos propres valeurs sécurisées avant de déployer.
Conclusion
Cette configuration avancée de K3s avec Cilium offre une solution Kubernetes légère mais puissante, avec des fonctionnalités de mise en réseau, d’ingress et de load balancing intégrées. Elle est particulièrement adaptée pour les environnements de développement ou les petits clusters de production. Le déploiement WordPress fourni vous permet de tester rapidement votre configuration et de vérifier que tous les composants fonctionnent correctement ensemble.