CRI-O替代Docker作为Kubernetes的运行时:在CentOS 8上进行设置

你好!我叫Sergey,我是Surf的DevOps。Surf的DevOps部门不仅旨在建立专家之间的互动和整合工作流程,还旨在在其自身的基础架构和客户的基础架构中积极研究和实施相关技术。



在下文中,我将讨论有关在研究CentOS 8发行版时遇到的容器技术堆栈的变化以及CRI-O是什么以及如何使用它快速为Kubernetes设置可执行环境的内容







为什么标准CentOS 8发行版中缺少Docker



在安装了RHEL 8CentOS 8的最新主要版本之后您一定会注意到:这些发行版和官方存储库缺少Docker应用程序,该程序从意识形态和功能上替代了PodmanBuildah软件包(默认发行版中存在)和CRI-O。这是由于实际实施了Red Hat作为开放容器计划(OCI)的一部分而开发的标准。



作为Linux基础的一部分的OCI的目标是为容器格式和运行时创建开放的行业标准,以解决多种挑战。首先,它们与Linux的哲学并不矛盾(例如,在每个部分中,每个程序都应执行一个动作,而Docker是一种多合一的收集器)。其次,我们可以消除Docker软件中所有现有的缺陷。第三,它们将完全符合用于部署,管理和服务容器化应用程序(例如Red Hat OpenShift)的领先商业平台的业务需求。Docker的



缺点本文已经详细描述了新软件的优势,并详细描述了如何在OCI项目中提供的整个软件堆栈及其体系结构功能在Red Hat本身的官方文档和文章中找到(Red Hat博客中的一篇文章)。以及在第三方审核中



重要的是要注意提议的堆栈的组件具有哪些功能:



  • Podman-通过runC流程与容器和图像存储直接交互;
  • Buildah-构建图像并将其加载到注册表中;
  • CRI-O是容器编排系统(例如Kubernetes)的可执行框架。


我认为,为了了解堆栈组件之间交互的一般方案,建议在此处提供带有runC和使用CRI-O的低级库Kubernetes的通信图







CRI-OKubernetes遵循相同的发布和支持周期(兼容性矩阵非常简单:主要版本KubernetesCRI-O是相同的),并且考虑到开发人员对这个堆栈的工作进行了全面和全面的测试,这使我们有权期望在任何用例下都能实现最大的工作稳定性(在此,CRI-O的相对轻度也比较有利)从Docker(由于功能的故意限制)。CentOS 8使用CRI-O“正确的方式”



安装Kubernetes时(当然是根据OCI)我们遇到了一些小难题,但这些难题已被成功克服。我很高兴与您分享安装和配置说明,这些说明最多需要10分钟。



如何使用CRI-O在CentOS 8上部署Kubernetes



先决条件:至少一个主机(2核,4 GB RAM,至少15 GB驱动器)已安装CentOS 8(建议使用“服务器”安装配置文件),以及在本地DNS中的条目(作为最后的选择,您可以做)在/ etc / hosts中)。并且不要忘记禁用swap



请注意,我们以root用户身份在主机上执行所有操作。



  1. 第一步,我们将配置操作系统,安装并配置CRI-O的初步依赖关系。

    • 让我们更新操作系统:



      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 .




希望以上说明可以帮助您节省时间和麻烦。

行业中发生的过程的结果通常取决于大多数最终用户和相应细分市场中其他软件的开发人员如何接受它们。目前尚不清楚OCI的计划将在未来几年中引领什么,但我们很乐意效仿。您可以立即在评论中分享您的意见。



敬请关注!



本文来自以下来源:






All Articles