Ci-dessous, je parlerai un peu des changements dans la pile technologique des conteneurs que nous avons rencontrés lors de l'étude de la distribution CentOS 8 et de ce qu'est CRI-O et comment configurer rapidement un environnement exécutable pour Kubernetes avec lui .
Pourquoi Docker est absent de la distribution standard de CentOS 8
Après avoir installé les dernières versions majeures de RHEL 8 ou CentOS 8, on ne peut manquer de remarquer: ces distributions et référentiels officiels n'ont pas l'application Docker , qui remplace idéologiquement et fonctionnellement les packages Podman , Buildah (présents dans la distribution par défaut) et CRI-O . Cela est dû à la mise en œuvre pratique des normes développées, entre autres, par Red Hat dans le cadre de l'Open Container Initiative (OCI).
L'objectif d'OCI, qui fait partie de la Linux Foundation, est de créer des normes industrielles ouvertes pour les formats de conteneurs et les environnements d'exécution qui répondent à de multiples défis. Premièrement, ils ne contredisaient pas la philosophie de Linux (par exemple, dans la partie où chaque programme devrait effectuer une action, et Docker est une sorte de moissonneur tout-en-un). Deuxièmement, nous pourrions éliminer toutes les failles existantes dans le logiciel Docker . Troisièmement, ils seraient entièrement conformes aux exigences commerciales des principales plates-formes commerciales pour le déploiement, la gestion et le service d'applications conteneurisées (par exemple, Red Hat OpenShift).
Inconvénients de Dockeret les avantages du nouveau logiciel ont déjà été décrits en détail dans cet article , et une description détaillée de la façon dont l'ensemble de la pile logicielle offerte dans le projet OCI et de ses caractéristiques architecturales peut être trouvée dans la documentation officielle et les articles de Red Hat lui-même (un bon article dans le blog Red Hat) et dans les revues de tiers .
Il est important de noter les fonctionnalités des composants de la pile proposée:
- Podman - interaction directe avec les conteneurs et le stockage d'images via le processus runC;
- Buildah - création et chargement d'images dans le registre;
- CRI-O est un framework exécutable pour les systèmes d'orchestration de conteneurs (tels que Kubernetes).
Je pense que pour comprendre le schéma général d'interaction entre les composants de la pile, il est conseillé de donner ici le schéma de communication de Kubernetes avec runC et les bibliothèques de bas niveau utilisant CRI-O :
CRI-O et Kubernetes adhèrent au même cycle de version et de support (la matrice de compatibilité est très simple: versions majeures Kubernetes et CRI-O sont les mêmes), et cela, compte tenu de l'accent mis sur les tests complets et complets du travail de cette pile par les développeurs, nous donne le droit d'attendre la stabilité maximale réalisable dans le travail dans tous les cas d'utilisation (ici, la légèreté relative de CRI-O est également bénéfique en comparaison deDocker en raison d'une limitation délibérée des fonctionnalités).
Lors de l'installation de Kubernetes de la «bonne manière» (selon OCI, bien sûr) en utilisant CRI-O sur CentOS 8, nous avons rencontré de petites difficultés, qui, cependant, ont été surmontées avec succès. Je serai heureux de partager avec vous les instructions d'installation et de configuration, qui prendront ensemble au maximum 10 minutes.
Comment déployer Kubernetes sur CentOS 8 à l'aide de CRI-O
Prérequis: au moins un hôte (2 cœurs, 4 Go de RAM, au moins 15 Go de disque) avec CentOS 8 installé (le profil d'installation "Serveur" est recommandé), ainsi qu'une entrée pour celui-ci dans le DNS local (en dernier recours, vous pouvez faire dans / etc / hosts). Et n'oubliez pas de désactiver le swap .
Nous effectuons toutes les opérations sur l'hôte en tant qu'utilisateur root, soyez prudent.
- Dans un premier temps, nous allons configurer le système d'exploitation, installer et configurer les dépendances préliminaires pour CRI-O.
- Mettons à jour le système d'exploitation:
dnf -y update
- SELinux. , . , , , :
firewall-cmd --set-default-zone trusted firewall-cmd --reload
:
systemctl disable --now firewalld
SELinux «permissive»:
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- , «br_netfilter» :
modprobe overlay modprobe br_netfilter echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf dnf -y install iproute-tc
- :
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
:
sysctl --system
- CRI-O ( CRI-O, , Kubernetes), Kubernetes 1.18:
export REQUIRED_VERSION=1.18
:
dnf -y install 'dnf-command(copr)' dnf -y copr enable rhcontainerbot/container-selinux curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_8/devel:kubic:libcontainers:stable.repo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION/CentOS_8/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo
- CRI-O:
dnf -y install cri-o
, : CRI-O , conmon :
sed -i 's/\/usr\/libexec\/crio\/conmon/\/usr\/bin\/conmon/' /etc/crio/crio.conf
CRI-O:
systemctl enable --now crio
:
systemctl status crio
- Mettons à jour le système d'exploitation:
- Kubernetes.
- :
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF
Kubernetes ( 1.18, ):
dnf install -y kubelet-1.18* kubeadm-1.18* kubectl-1.18* --disableexcludes=kubernetes
- : Docker, CRI-O, Kubernetes /var/lib/kubelet/config.yaml, :
mkdir /var/lib/kubelet cat <<EOF > /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF
- , : , cgroup, kubelet ( ), , :
cat /dev/null > /etc/sysconfig/kubelet cat <<EOF > /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS=--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' EOF
- :
- .
- :
kubeadm init --pod-network-cidr=10.244.0.0/16
«kubeadm join ...», , , , .
- (CNI) Pod network. Calico. , Flannel nftables, Calico — CNI, Kubernetes:
kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
- worker 1 2, , «kubeadm init ...», :
kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN \ --discovery-token-ca-cert-hash $TOKEN_HASH
- , :
kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
! K8s . - :
J'espère que les instructions ci-dessus vous ont aidé à gagner du temps et des tracas.
Le résultat des processus en cours dans l'industrie dépend souvent de la manière dont ils sont acceptés par la majorité des utilisateurs finaux et des développeurs d'autres logiciels dans le créneau correspondant. On ne sait pas encore où mèneront les initiatives de l'OCI dans quelques années, mais nous serons heureux de suivre. Vous pouvez partager votre opinion dès maintenant dans les commentaires.
Restez à l'écoute!
Cet article provient des sources suivantes:
- Section sur les environnements d' exécution de conteneurs dans la documentation Kubernetes
- Page du projet CRI-O sur Internet
- Articles de blog Red Hat: celui-ci , celui-ci et plus