CRI-O 作為 Docker 的替代品作為 Kubernetes 的運行時環境:在 CentOS 8 上進行設置

你好! 我叫 Sergey,是 Surf 的 DevOps 人員。 Surf 的 DevOps 部門不僅旨在建立專家之間的互動和集成工作流程,而且還積極研究並在自己的基礎設施和客戶的基礎設施中實施相關技術。

下面我就講一下我們在研究發行版時遇到的容器技術棧的變化。 CentOS 8的 以及關於什麼是 CRI-O 以及如何快速搭建可執行環境 Kubernetes.

CRI-O 作為 Docker 的替代品作為 Kubernetes 的運行時環境:在 CentOS 8 上進行設置

為什麼 CentOS 8 標準發行版中缺少 Docker

安裝最新的主要版本後 RHEL 8CentOS 8的 不可忽視:這些發行版和官方存儲庫缺少應用程序 碼頭工人,它在思想和功能上取代了軟件包 波德曼, 布達赫 (默認情況下存在於發行版中)和 CRI-O。 這是由於紅帽作為開放容器計劃 (OCI) 項目的一部分制定的標準的實際實施。

OCI 是 Linux 基金會的一部分,其目標是為容器格式和可執行環境創建開放的行業標準,以同時解決多個問題。 首先,它們與 Linux 的哲學並不矛盾(例如,每個程序必須執行某個操作,並且 碼頭工人 是一種一體化的組合)。 其次,我們可以消除軟件中現有的所有缺陷 碼頭工人。 第三,它們將完全兼容領先商業平台針對部署、管理和維護容器化應用程序(例如紅帽OpenShift)提出的業務需求。

限制 碼頭工人 新軟件的優點已經在 這篇文章,以及關於如何作為 OCI 項目的一部分提供的整個軟件堆棧及其架構功能的詳細描述,可以在 Red Hat 本身的官方文檔和文章中找到(很好 文章 在紅帽博客中)和第三方中 評論.

重要的是要注意建議堆棧的組件具有哪些功能:

  • 波德曼 - 通過runC進程直接與容器和鏡像存儲交互;
  • 布達赫 - 組裝並加載到圖像註冊表中;
  • CRI-O - 容器編排系統的運行時環境(例如 Kubernetes)。

我認為為了理解堆棧組件之間交互的一般方案,建議在這裡給出一個連接圖 Kubernetes c 運行C 和低級庫使用 CRI-O:

CRI-O 作為 Docker 的替代品作為 Kubernetes 的運行時環境:在 CentOS 8 上進行設置

CRI-O и Kubernetes 遵循相同的版本和支持週期(兼容性矩陣非常簡單:主要版本 Kubernetes и CRI-O 一致),考慮到開發人員對該堆棧工作的全面和全面測試的重點,使我們有權期望在任何使用場景中都能實現最大的工作穩定性(相對輕便在這裡也是有益的)。 CRI-O 和....相比 碼頭工人 由於有意限制功能)。

安裝時 Kubernetes “正確的方式”方式(當然,根據 OCI)使用 CRI-OCentOS 8的 我們遇到了一些小困難,但我們都成功地克服了。 我很樂意與您分享安裝和配置說明,總共最多需要 10 分鐘。

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

先決條件:至少擁有一台主機(2 核、4 GB RAM、至少 15 GB 存儲空間) CentOS 8的 (推薦安裝配置文件“服務器”),以及本地 DNS 中的條目(在極端情況下,您可以使用 /etc/hosts 中的條目)。 並且不要忘記 禁用交換.

我們代表root用戶在主機上執行所有操作,請小心。

  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)。 我建議使用 印花布。 可能更受歡迎 絨布 有兼容性問題 耐用品是的和 印花布 - 該項目唯一推薦並經過全面測試的 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 計劃在幾年內將走向何方,但我們很樂意跟隨它。 您現在可以在評論中分享您的意見。

敬請關注!

本文的創建歸功於以下來源:



來源: www.habr.com

添加評論