Kubeadm
1. Informations
1.1. kube-master1.home.lab
| Caratéristiques | |
|---|---|
| RAM | 2 Go |
| CPU | 2 coeurs |
| Disque | 20 Go |
| Hostname | kube-master1.home.lab |
| IP admin | 192.168.50.17 |
1.2. kube-worker1.home.lab
| Caratéristiques | |
|---|---|
| RAM | 2 Go |
| CPU | 2 coeurs |
| Disque | 20 Go |
| Hostname | kube-worker1.home.lab |
| IP admin | 192.168.50.18 |
1.3. kube-worker2
| Caratéristiques | |
|---|---|
| RAM | 2 Go |
| CPU | 2 coeurs |
| Disque | 20 Go |
| Hostname | kube-worker2.home.lab |
| IP admin | 192.168.50.19 |
2. Documentations
3. Ajout du repository epel-release et CRB
$ sudo dnf install -y epel-release
$ sudo /usr/bin/crb enable
$ sudo dnf update
4. Configuration du système d'exploitation
4.1. Désactiver le swap
$ sudo swapoff -a
$ sudo sed -i '/ swap / s/^/#/' /etc/fstab
4.2. Configurer le kernel
- Créer le fichier
/etc/modules-load.d/k8s.conf
overlay
br_netfilter
- Charger les modules kernel
$ sudo modprobe overlay
$ sudo modprobe br_netfilter
5. Configuration du réseau
5.1. Configurer le kernel
- Créer le fichier
/etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
#net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
- Appliquer les changements
$ sudo sysctl -p /etc/sysctl.d/k8s.conf
5.2. Modifier le fichier /etc/hosts
192.168.50.17 kube-master1.home.lab kube-master1
192.168.50.18 kube-worker1.home.lab kube-worker1
192.168.50.19 kube-worker2.home.lab kube-worker2
6. Installation de podman et CRI-O
6.1. Installer podman
sudo dnf install -y podman
6.2. Installer cri-o et crictl
- Ajouter les dépôts
CRI-O
$ OS=CentOS_9_Stream
$ VERSION=1.28
$ sudo curl -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo \
https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo
$ sudo curl -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo \
https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo
- Installer les packages
CRI-Oetcri-tools
$ sudo dnf install cri-o cri-tools
- Démarrer le service
crio
$ sudo systemctl enable --now crio
- Vérifier l'installation de
crio
$ crictl --version
$ sudo crictl info
7. Installation de kubeadm
7.1. Configurer SELinux
- Modifier le mode de SELinux en "permissive"
# Set SELinux in permissive mode (effectively disabling it)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
7.2. Installer kubeadm
- Créer le fichier
/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
- Installer les packages
kubeadmetkubelet
sudo dnf update
sudo dnf install kubeadm kubelet kubectl --disableexcludes=kubernetes
- Démarrer le service
kubelet
sudo systemctl enable --now kubelet
- Vérifier l'installation
kubeadm version
kubectl version
7.3. Initialiser le master du cluster k8s
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
LOAD_BALANCER=192.168.50.17
sudo kubeadm init --cri-socket=unix:///var/run/crio/crio.sock --pod-network-cidr=10.244.0.0/16 --upload-certs --control-plane-endpoint "192.168.50.17:6443" --apiserver-advertise-address 192.168.50.17
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
8. Configuration de firewalld
8.1. Configurer firewalld sur le master
# Kubernetes API server
sudo firewall-cmd --permanent --add-port=6443/tcp
# etcd server client API
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
# Kubelet API
sudo firewall-cmd --permanent --add-port=10250/tcp
# kube-scheduler
sudo firewall-cmd --permanent --add-port=10251/tcp
# kube-controller-manager
sudo firewall-cmd --permanent --add-port=10252/tcp
# flannel
sudo firewall-cmd --permanent --add-port=8285/udp
sudo firewall-cmd --permanent --add-port=8472/udp
# reload firewalla rules
sudo firewall-cmd reload
- Autres ports à ouvrir ?
sudo firewall-cmd --permanent --add-port=10259/tcp
sudo firewall-cmd --permanent --add-port=10257/tcp
sudo firewall-cmd --permanent --add-port=179/tcp
sudo firewall-cmd --permanent --add-port=4789/udp
8.2. Configurer firewalld sur les workers
# Kubelet API
sudo firewall-cmd --permanent --add-port=10250/tcp
# flannel
sudo firewall-cmd --permanent --add-port=8285/udp
sudo firewall-cmd --permanent --add-port=8472/udp
# NodePort services
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
# reload firewall rules
sudo firewall-cmd reload
sudo firewall-cmd --permanent --add-port=179/tcp
sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall reload
9. Création du cluster k8s
9.1. Créer un token pour joindre le cluster k8s
- sur le master
kube-master1, générer un token pour joindre le cluster k8s
kubeadm token create --print-join-command
kubeadm join 192.168.50.17:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>
9.2. Joindre un worker au cluster cluster k8s
- Utiliser le token généré sur le master
kube-master1
sudo kubeadm join 192.168.50.17:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH> --cri-socket=unix:///var/run/crio/crio.sock
10. Vérification de l'état du cluster
10.1. Get nodes
- sur le master
kube-master1
kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-master1 Ready control-plane 16m v1.33.0
kube-worker1 Ready <none> 96s v1.33.0
kube-worker2 Ready <none> 69s v1.33.0
10.2. Get pods
- sur le master
kube-master1
kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-674b8bbfcf-66rgl 1/1 Running 0 17m
kube-system coredns-674b8bbfcf-drh4r 1/1 Running 0 17m
kube-system etcd-kube-master1 1/1 Running 0 17m
kube-system kube-apiserver-kube-master1 1/1 Running 0 17m
kube-system kube-controller-manager-kube-master1 1/1 Running 0 17m
kube-system kube-proxy-c24lw 1/1 Running 0 17m
kube-system kube-proxy-cfpmj 1/1 Running 0 2m25s
kube-system kube-proxy-m847z 1/1 Running 0 118s
kube-system kube-scheduler-kube-master1 1/1 Running 0 17m
11. Installation de plugins réseau
11.1. Installer Flannel
- sur le master
kube-master1
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
11.2. Installer Calico
- #todo à compélter
12. Configuration du DNS au sein du cluster k8s
12.1. Editer le pod coredns
- Modifier la
configmap
kubectl -n kube-system edit configmap coredns
- Ajouter un forward de zone DNS
home.labvers le serveur DNS FreeIPA (192.168.50.11)
home.lab:53 {
errors
cache 30
forward . 192.168.50.11
}
12.2. Redéployer le pod coredns
$ kubectl -n kube-system rollout restart deployment coredns
12.3. Ouvrir le flux DNS ?
$ sudo firewall-cmd --add-port=udp/53 --permanent
$ sudo firewall-cmd --reload
12.4. Tester le DNS depuis un pod
$ kubectl run -i --tty dns-test --image=busybox --restart=Never -- sh
cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local home.lab
nameserver 10.96.0.10
options ndots:5
nslookup gitlab1.home.lab
13. Déployer le certificat de l'AC au sein du cluster k8s
- #todo à compléter