CRI-O como um substituto para o Docker como o tempo de execução para Kubernetes: configuração no CentOS 8

Olá! Meu nome é Sergey, sou DevOps no Surf. O departamento de DevOps do Surf visa não só estabelecer a interação entre especialistas e integrar processos de trabalho, mas também pesquisar e implementar ativamente tecnologias relevantes tanto na sua própria infraestrutura como na infraestrutura do cliente.



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.



  1. 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
      


  2. 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


    • kubelet:



      sudo systemctl enable --now kubelet
      


      control-plane worker , .



  3. .

    • :



      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:






All Articles