CRI-O Kubernetes үшін жұмыс уақыты ортасы ретінде Docker-ті ауыстыру ретінде: CentOS 8 жүйесінде орнату

Сәлеметсіз бе! Менің атым Сергей, мен Surf-тегі DevOpsпын. Surf-тегі DevOps бөлімі мамандар арасында өзара әрекеттестік орнатуға және жұмыс процестерін біріктіруге ғана емес, сонымен қатар өз инфрақұрылымында да, тұтынушының инфрақұрылымында да ағымдағы технологияларды белсенді түрде зерттеуге және енгізуге бағытталған.

Төменде мен дистрибуцияны зерттеу кезінде кездестірген контейнерлерге арналған технологиялық стектегі өзгерістер туралы аздап сөйлесетін боламын. CentOS 8 және бұл не туралы CRI-O және орындалатын ортаны қалай жылдам орнату керек Kubernetes.

CRI-O Kubernetes үшін жұмыс уақыты ортасы ретінде Docker-ті ауыстыру ретінде: CentOS 8 жүйесінде орнату

Неліктен Docker CentOS 8 жүйесіне қосылмаған?

Соңғы негізгі шығарылымдарды орнатқаннан кейін RHEL 8 немесе CentOS 8 Байқамай қалу мүмкін емес: бұл дистрибутивтер мен ресми репозиторийлерде қолданба жоқ Докер, ол пакеттерді идеологиялық және функционалды түрде ауыстырады Подман, Buildah (әдепкі бойынша таратуда көрсетіледі) және CRI-O. Бұл Red Hat компаниясының Open Container Initiative (OCI) жобасының бір бөлігі ретінде әзірлеген стандарттарды практикалық енгізуімен байланысты.

Linux Foundation бөлігі болып табылатын OCI мақсаты - бірден бірнеше мәселені шешетін контейнер пішімдері мен орындалу уақыттары үшін ашық салалық стандарттарды жасау. Біріншіден, олар Linux философиясына қайшы келмеді (мысалы, әрбір бағдарлама бір әрекетті орындауы керек бөлігінде және Докер барлығы бір комбайн түрі). Екіншіден, олар бағдарламалық жасақтамадағы барлық кемшіліктерді жоя алар еді Докер. Үшіншіден, олар контейнерлік қосымшаларды (мысалы, Red Hat OpenShift) орналастыруға, басқаруға және оларға қызмет көрсетуге арналған жетекші коммерциялық платформалардың бизнес талаптарына толық сәйкес келеді.

кемшіліктер Докер және жаңа бағдарламалық жасақтаманың артықшылықтары қазірдің өзінде егжей-тегжейлі сипатталған Бұл мақала, және OCI жобасы аясында ұсынылатын бүкіл бағдарламалық жасақтама стекінің егжей-тегжейлі сипаттамасын және оның архитектуралық ерекшеліктерін ресми құжаттамада және Red Hat мақалаларынан табуға болады (жаман емес) мақала Red Hat блогында) және үшінші тарапта шолулар.

Ұсынылған стектің құрамдас бөліктерінің қандай функционалдығы бар екенін атап өту маңызды:

  • Подман — runC процесі арқылы контейнерлермен және кескіндерді сақтаумен тікелей әрекеттесу;
  • Buildah — кескіндерді құрастыру және тізілімге жүктеу;
  • CRI-O — контейнерлерді басқару жүйелері үшін орындалатын орта (мысалы, Kubernetes).

Стектің құрамдас бөліктерінің өзара әрекеттесуінің жалпы схемасын түсіну үшін осы жерде байланыс диаграммасын берген жөн деп ойлаймын. Kubernetes c жүгіруC және төменгі деңгейлі кітапханаларды пайдаланады CRI-O:

CRI-O Kubernetes үшін жұмыс уақыты ортасы ретінде Docker-ті ауыстыру ретінде: CentOS 8 жүйесінде орнату

CRI-O и Kubernetes бірдей шығарылым мен қолдау циклін ұстаныңыз (үйлесімділік матрицасы өте қарапайым: негізгі нұсқалар Kubernetes и CRI-O сәйкес келеді) және бұл әзірлеушілердің осы стектің жұмысын толық және жан-жақты тестілеуге назар аударуын ескере отырып, кез келген пайдалану сценарийлері бойынша жұмыста максималды қол жеткізуге болатын тұрақтылықты күтуге құқық береді (бұл жерде салыстырмалы жеңілдік те пайдалы. CRI-O салыстырғанда Докер функционалдық мақсатты шектеуге байланысты).

Орнату кезінде Kubernetes «дұрыс жол» әдісі (әрине OCI бойынша) пайдалану CRI-O туралы CentOS 8 Біз аздаған қиындықтарға тап болдық, бірақ оларды сәтті еңсердік. Орнату және конфигурациялау нұсқауларын сіздермен бөлісуге қуаныштымын, барлығы шамамен 10 минутты алады.

CRI-O құрылымын пайдаланып, CentOS 8 жүйесінде Kubernetes қалай орналастыруға болады

Алғышарттар: орнатылған кемінде бір хосттың болуы (2 ядро, 4 ГБ жедел жады, кемінде 15 ГБ сақтау орны) CentOS 8 («Сервер» орнату профилі ұсынылады), сонымен қатар жергілікті DNS жүйесіндегі жазбалар (соңғы шара ретінде сіз /etc/hosts ішіндегі жазба арқылы қол жеткізе аласыз). Және ұмытпа свопты өшіру.

Біз хосттағы барлық операцияларды түбірлік пайдаланушы ретінде орындаймыз, абай болыңыз.

  1. Бірінші қадамда біз ОЖ конфигурациялаймыз, CRI-O үшін алдын ала тәуелділіктерді орнатамыз және конфигурациялаймыз.
    • Операциялық жүйені жаңартайық:
      dnf -y update
      

    • Әрі қарай брандмауэр мен SELinux конфигурациялау керек. Мұнда бәрі біздің хост немесе хосттар жұмыс істейтін ортаға байланысты. Брандмауэрді мына ұсыныстарға сәйкес орнатуға болады құжаттама, немесе сенімді желіде болсаңыз немесе үшінші тарап брандмауэрін пайдалансаңыз, әдепкі аймақты сенімді деп өзгертіңіз немесе желіаралық қалқанды өшіріңіз:
      firewall-cmd --set-default-zone trusted
      
      firewall-cmd --reload

      Брандмауэрді өшіру үшін келесі пәрменді пайдалануға болады:

      systemctl disable --now firewalld
      

      SELinux өшірілуі немесе «рұқсат беретін» режимге ауысуы қажет:

      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 қызметті бастамас бұрын, өйткені қажетті ортақ құрамдас көрсетілгеннен басқа орынға ие:

      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

    • Екінші маңызды нюанс: өйткені біз демонды қолданбаймыз Докер, бірақ біз демонды қолданамыз 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

    • Орнату кезінде біз кездесетін үшінші маңызды мәселе: біз пайдаланған драйверді көрсеткенімізге қарамастан топ, және оның конфигурациясы берілген аргументтер арқылы кубелет ескірген (құжаттамада нақты көрсетілген), біз файлға аргументтер қосуымыз керек, әйтпесе біздің кластер инициализацияланбайды:
      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

    • Енді біз демонды іске қоса аламыз кубелет:
      sudo systemctl enable --now kubelet
      

      Баптау үшін басқару жазықтығы немесе жұмысшы түйіндерді минут ішінде пайдалануға болады осы сценариймен.

  3. Біздің кластерді инициализациялау уақыты келді.
    • Кластерді инициализациялау үшін пәрменді іске қосыңыз:
      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Шығару соңында пайдалану сұралатын «kubeadm join …» кластеріне қосылу пәрменін немесе кем дегенде көрсетілген таңбалауыштарды жазып алуды ұмытпаңыз.

    • Pod желісіне плагинді (CNI) орнатайық. Мен пайдалануды ұсынамын Calico. Мүмкін көбірек танымал Фланель үйлесімділік мәселелері бар nftables, және Calico - жоба ұсынған және толығымен сыналған жалғыз CNI енгізу Kubernetes:
      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 

    • Жұмысшы түйінді кластерге қосу үшін оны 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 кластерінде пайдалы жүктемелерді орналастыруға болады.

Алда бізді не күтіп тұр

Жоғарыдағы нұсқаулар сізге біраз уақыт пен жүйкеңізді үнемдеуге көмектесті деп үміттенемін.
Өнеркәсіпте болып жатқан процестердің нәтижесі көбінесе соңғы пайдаланушылар мен сәйкес тауашалардағы басқа бағдарламалық жасақтаманы әзірлеушілермен оларды қалай қабылдағанына байланысты. OCI бастамаларының бірнеше жылдан кейін не әкелетіні әлі толық белгісіз, бірақ біз қуана қарайтын боламыз. Сіз өз пікіріңізді дәл қазір түсініктемелерде бөлісе аласыз.

Бізбен бірге қалыңыз!

Бұл мақала келесі дереккөздердің арқасында пайда болды:

  • Контейнердің орындалу уақыты туралы бөлім Kubernetes құжаттамасы
  • Бет Интернеттегі CRI-O жобасы
  • Red Hat блогындағы мақалалар: Бұл, бұл және көптеген басқалар



Ақпарат көзі: www.habr.com

пікір қалдыру