Installation et configuration avancée de K3s avec Cilium

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 :
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
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
Installation du CLI Cilium
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
cilium install --chart-directory ./install/kubernetes/cilium
Configuration de Cilium comme remplaçant de kube-proxy
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
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 :
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
Activation de l’ingress Cilium
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 :
apiVersion: cilium.io/v2alpha1
kind: CiliumLoadBalancerIPPool
metadata:
name: default-pool
spec:
blocks:
- cidr: 192.168.100.128/25
Appliquez la configuration :
kubectl apply -f pool.yaml
Activez les annonces L2 :
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` :
apiVersion: cilium.io/v2alpha1
kind: CiliumL2AnnouncementPolicy
metadata:
name: default-l2-announcement-policy
namespace: kube-system
spec:
externalIPs: true
loadBalancerIPs: true
Appliquez la configuration :
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 :
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.
