Kubernetes - Installation - Divers
Mis à jour le 16/08/2024

cgroup

Il y a 2 versions.
Depuis RHEL 9 (qui a un noyau 5, est-ce lié?), seul cgroup v2 est accepté.
Alors la procédure d’installation suivante mène à une infra où tous les pods plantent sans cesse car ils sont dans la hiérarchie v2.
Pour travailler en mode hybride (v1 & v2):

sudo dnf install -y grubby
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"

Ainsi la procédure d’installation précédente fonctionne

Pour connaître les versions de cgroup disponibles sur le système:

mount|grep cgroup
...
# pas terrible -> car retourne toujours les 2
grep cgroup /proc/filesystems
nodev   cgroup
nodev   cgroup2

Ici, les 2 versions sont présentes

Je pense qu’il faut configurer containerd pour utiliser SystemdCgroup afin de rester en cgroup v2 unifié. Mais je n’ai pas réussi à le faire
-> J’ai trouvé:
Après l’installation de containerd (plus loin), et renommer config.toml faire:

sudo containerd config default | sudo tee /etc/containerd/config.toml

Puis:

  • éditer /etc/containerd/config.toml
  • chercher: [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] section and change SystemdCgroup to true
  • redémarrer containerd
  • vérifier avec: crictl info|python -c 'import sys, yaml, json; print(yaml.dump(json.loads(sys.stdin.read())))'|less
    • crictl sera installé avec k8s et il faut rechercher SystemdCgroup

Pré install

setenforce 0
emacs /etc/selinux/config
swapoff /dev/dm-1
emacs /etc/fstab
systemctl disable firewalld.service
systemctl stop firewalld.service

SELINUX

Depuis RHEL 9 (et peut être 8), il faut complètement le désactiver !?
EN FAIT: NON mais voilà la méthode recommandée de désactivation de RHEL 9 (peu importe ce qu’il y a dans le fichier de config)

# -> mettre "selinux=0" dans GRUB_CMDLINE_LINUX
emacs /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg

Réseau de l’hôte

modprobe br_netfilter
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

Moteur de containers

yum remove -y \
  docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-engine \
  runc

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum install -y containerd.io 

mv /etc/containerd/config.toml /etc/containerd/config.toml.old

systemctl start containerd
systemctl enable containerd

Installation de K8S

Dépôt, packages et service kubelet

REMARQUE
La version est référencée 2 fois en dur dans le fichier .repo, on trouve les versions disponibles dans les release du projet: https://github.com/kubernetes/kubernetes/releases ou https://github.com/kubernetes/kubernetes/releases/latest
Il suffit alors de ne référencer que les numéros major et minor

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes


sudo systemctl enable --now kubelet

Initialisation du master avec calico

Initialisation sans CNI

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

L’espace d’adresses IP spécifié ici: 10.244.0.0/16 doit être indiqué dans le fichier https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/custom-resources.yaml utilisé dans la section 2 de l’installation de calico ci-dessous

A l’issue de cette commande, la fin de la sortie ressemble à:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.22.22.101:6443 --token qmroai.y8y12apxj95gbhmz \
	--discovery-token-ca-cert-hash sha256:1132326b303b2b1a126f4ca365e48989ca9c003fda3f913ee5d775cfe80aba65 

Le CNI: calico

calico permet de faire fonctionner les network policy.
source: https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart (à vérifier pour les n° de version)

  1. Install the Tigera Calico operator and custom resource definitions.
    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/tigera-operator.yaml
  2. Install Calico by creating the necessary custom resource.
    wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/custom-resources.yaml
    Modifier le fichier téléchargé pour indiquer cidr: 10.244.0.0/16
    kubectl create -f custom-resources.yaml
  3. Confirm that all of the pods are running with the following command.
    watch kubectl get pods -n calico-system
    Wait until each pod has the STATUS of Running.

Complétion automatique dans bash et alias “k

sudo kubectl completion bash|sudo tee /etc/bash_completion.d/kubectl

Éditer .bashrc

alias k='kubectl'
source /usr/share/bash-completion/bash_completion
complete -F __start_kubectl k

Service de métriques

  • Consulter https://github.com/kubernetes-sigs/metrics-server
  • Télécharger le fichier proposé pour apply -> wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  • Modifier afin d’avoir l’arg “insecure”:

    containers:
      - name: metrics-server
        image: registry.k8s.io/metrics-server/metrics-server:v0.6.4
        args:
        - --kubelet-insecure-tls
    

restart d’un déploiement

Il faut passer par rollout. Tous les pods du déploiement redémarreront en fonction de la strategy.

kubectl rollout restart deployment <deploymentName>

Spécification dans Kubernetes

La référence de tout ce qu’on peut mettre dans un manifest yaml est définie ici: https://kubernetes.io/docs/reference/kubernetes-api/

root dans un pod

kubectl exec ne prend pas de paramètre -u comme docker exec.
J’ai trouvé cet utilitaire: https://github.com/ssup2/kpexec qui marche avec docker/containerd comme infrastructure de containers sous-jacente à k8s (il y a une explication de son mode de fonctionnement).

job sur chaque noeud

On prend l’exemple d’un calcul de pi où le nombre de décimales est en argument (16 par défaut).
Code: pi_css5 -> https://github.com/xjtuecho/pi_css5

Dockerfile

Après avoir récupérer les 2 fichiers .c de github et créer docker-script.sh

docker-script.sh

#!/bin/sh
n=$1

if [ -z "$n" ]
  then
    n=16
fi

pi_file=$(basename $(./pi_css5 $n | grep 'writing' | awk '{print $2}') ...)
cat $pi_file

Dockerfile

FROM alpine as build

WORKDIR /pi

COPY *.c /pi/

RUN \
apk update && \
apk add gcc libc-dev && \
gcc -O -funroll-loops -fomit-frame-pointer pi_fftcs.c fftsg_h.c -lm -o pi_css5 -static && \
strip pi_css5


FROM busybox
COPY --from=build /pi/pi_css5 .
COPY docker-script.sh /pi.sh
RUN chmod +x /pi.sh


ENTRYPOINT [ "/pi.sh" ]
CMD [ "" ]

manifest k8s

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  parallelism: 2
  template:
    metadata:
      labels:
        app: pi
    spec:
      containers:
      - name: pi-container
        image: quay.io/bruno_dubois1012/pi_css5
        imagePullPolicy: IfNotPresent
        args:
        - "10000000"

      # les jobs sont forcément sur des noeuds différents
      # on peut faire ça aussi sur un déploiement sur ses pods répliqués
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - pi
            topologyKey: "kubernetes.io/hostname"

      # restartPolicy obligatoire avec l'une des valeurs: Never ou  OnFailure
      restartPolicy: OnFailure

Pour comparer 2 logs:

diff <(k logs pi-7s88c) <(k logs pi-szw9s)

Accès à la gestion des containers en bas niveau

Maintenant que ce n’est plus docker qui gère les containers mais containerd, l’outil équivalent à docker est crictl

pour fonctionner, il vaut mieux faire le fichier /etc/crictl.yaml contenant:

runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false

Autres

results matching ""

    No results matching ""