Abaixo, falarei um pouco sobre as mudanças na pilha tecnológica de contêineres que conhecemos ao estudar a distribuição do CentOS 8 e o que é CRI-O e como configurar rapidamente um ambiente executável para Kubernetes com ele .
Por que o Docker está faltando na distribuição padrão do CentOS 8
Depois de instalar as últimas versões maiores do RHEL 8 ou CentOS 8, não se pode deixar de notar: essas distribuições e repositórios oficiais não têm a Docker aplicação , que ideologicamente e funcionalmente substitui o Podman , pacotes Buildah (presente na distribuição padrão) e CRI-O . Isso se deve à implementação prática de padrões desenvolvidos, entre outras coisas, pela Red Hat como parte da Open Container Initiative (OCI).
O objetivo da OCI, que faz parte da The Linux Foundation, é criar padrões abertos da indústria para formatos de contêineres e tempos de execução que atendam a vários desafios. Em primeiro lugar, eles não contradiziam a filosofia do Linux (por exemplo, na parte em que cada programa deve realizar alguma ação, e o Docker é uma espécie de harvester tudo-em-um). Em segundo lugar, poderíamos eliminar todas as falhas existentes no software Docker . Terceiro, eles seriam totalmente compatíveis com os requisitos de negócios das principais plataformas comerciais para implantação, gerenciamento e atendimento de aplicativos em contêineres (por exemplo, Red Hat OpenShift).
Desvantagens do Dockere as vantagens do novo software já foram descritas com alguns detalhes neste artigo , e uma descrição detalhada de como toda a pilha de software oferecida no projeto OCI e seus recursos arquitetônicos podem ser encontrados na documentação oficial e nos artigos da própria Red Hat (um bom artigo no blog da Red Hat) e em revisões de terceiros .
É importante observar qual funcionalidade os componentes da pilha proposta têm:
- Podman - interação direta com containers e armazenamento de imagens através do processo runC;
- Buildah - construir e carregar imagens no registro;
- CRI-O é uma estrutura executável para sistemas de orquestração de contêineres (como Kubernetes).
Acho que, para entender o esquema geral de interação entre os componentes da pilha, é aconselhável fornecer aqui o diagrama de comunicação do Kubernetes com runC e bibliotecas de baixo nível usando CRI-O :
CRI-O e Kubernetes aderem ao mesmo ciclo de lançamento e suporte (a matriz de compatibilidade é muito simples: versões principais Kubernetes e CRI-O são iguais), e isso, levando em consideração o foco no teste completo e abrangente do trabalho desta pilha por desenvolvedores, nos dá o direito de esperar a estabilidade máxima alcançável no trabalho em qualquer caso de uso (aqui, a leveza relativa do CRI-O também é benéfica em comparação a partir deDocker devido à limitação proposital de funcionalidade).
Ao instalar o Kubernetes da maneira "certa" (de acordo com a OCI, é claro) usando o CRI-O no CentOS 8, encontramos pequenas dificuldades, que, no entanto, foram superadas com sucesso. Terei o maior prazer em compartilhar com vocês as instruções de instalação e configuração, que juntas levarão no máximo 10 minutos.
Como implantar Kubernetes no CentOS 8 usando CRI-O
Pré-requisitos: pelo menos um host (2 núcleos, 4 GB de RAM, pelo menos 15 GB de drive) com CentOS 8 instalado (o perfil de instalação "Servidor" é recomendado), bem como uma entrada para ele no DNS local (como último recurso, você pode fazer em / etc / hosts). E não se esqueça de desativar a troca .
Realizamos todas as operações no host como usuário root, tome cuidado.
- Na primeira etapa, vamos configurar o SO, instalar e configurar as dependências preliminares para CRI-O.
- Vamos atualizar o sistema operacional:
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
- Vamos atualizar o sistema operacional:
- 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 . - :
Espero que as instruções acima tenham ajudado a economizar tempo e aborrecimento.
O resultado dos processos que ocorrem na indústria geralmente depende de como eles são aceitos pela maioria dos usuários finais e desenvolvedores de outro software no nicho correspondente. Ainda não está claro para onde as iniciativas da OCI irão nos levar em alguns anos, mas teremos o maior prazer em acompanhar. Você pode compartilhar sua opinião agora mesmo nos comentários.
Fique ligado!
Este artigo vem das seguintes fontes:
- Seção sobre tempos de execução do contêiner na documentação do Kubernetes
- Página do projeto CRI-O na Internet
- Postagens do blog da Red Hat: esta , esta e mais