Installation et configuration avancée de K3s avec Cilium

Texte alternatif

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.