KubernetesのランタイムとしてのDockerの代わりとしてのCRI-O:CentOS8でのセットアップ

こんにちは!私の名前はセルゲイです。サーフのDevOpsです。SurfのDevOps部門は、スペシャリスト間の相互作用を確立してワークフローを統合するだけでなく、自社のインフラストラクチャと顧客のインフラストラクチャの両方で関連テクノロジーを積極的に調査および実装することも目的としています。



以下では、CentOS 8ディストリビューションを研究するときに遭遇したコンテナの技術スタックの変更、CRI-Oとは何か、およびそれを使用してKubernetesの実行可能環境をすばやくセットアップする方法について少し説明します。







Dockerが標準のCentOS8ディストリビューションにない理由



最新メジャーリリースのインストール後RHEL 8またはCentOSの8を、 1は、通知に失敗することはできません。これらの分布と公式リポジトリにはないドッカーのアプリケーションイデオロギー的及び機能的に置き換え、PodmanBuildahパッケージ(デフォルトの配布に存在する)とCRI-Oを。これは、とりわけ、Open Container Initiative(OCI)の一部としてRedHatによって開発された標準の実用的な実装によるものです。



The Linux Foundationの一部であるOCIの目標は、複数の課題に対処するコンテナ形式とランタイムのオープンな業界標準を作成することです。まず、Linuxの哲学と矛盾していませんでした(たとえば、各プログラムが1つのアクションを実行する必要があり、Dockerは一種のオールインワンハーベスターです)。次に、Dockerソフトウェアの既存の欠陥をすべて排除することができます。第3に、コンテナ化されたアプリケーション(Red Hat OpenShiftなど)を展開、管理、および提供するための主要な商用プラットフォームのビジネス要件に完全に準拠します。Dockerの



デメリット新しいソフトウェアの利点については、この記事すでに詳細に説明されています。また、OCIプロジェクト内で提供されるソフトウェアスタック全体とそのアーキテクチャ機能の詳細については、公式ドキュメントとRed Hat自体の記事Red Hatブログの優れた記事)に記載されています。およびサードパーティのレビュー



提案されたスタックのコンポーネントがどのような機能を持っているかに注意することが重要です。



  • Podman -runCプロセスを介したコンテナおよびイメージストレージとの直接対話。
  • Buildah-イメージをビルドしてレジストリにロードします。
  • CRI-Oは、コンテナオーケストレーションシステム(Kubernetesなど)の実行可能なフレームワークです。


スタックのコンポーネント間の相互作用の一般的なスキームを理解するために、CRI-Oを使用したrunCおよび低レベルライブラリとKubernetesの接続図をここに示すことをお勧めしますCRI-OKubernetesは同じリリースとサポートサイクルに準拠しています(互換性マトリックスは非常に単純です:メジャーバージョンKubernetesCRI-Oは同じです)、これは、開発者によるこのスタックの作業の完全かつ包括的なテストに焦点を当てることを考慮に入れると、あらゆるユースケースでの作業で達成可能な最大の安定性を期待する権利を与えます(ここでは、CRI-Oの相対的な軽さも比較して有益ですから







機能の意図的な制限によるDocker)。



インストールするときにKubernetesを使用して(もちろん、OCIによる)「正しい道」道CRI-Oの上でCentOSの8、我々は、しかし、成功し克服された小型の難しさ、に走りました。インストールと構成の手順をお知らせします。これらを合わせて最大10分かかります。



CRI-Oを使用してCentOS8にKubernetesをデプロイする方法



前提条件:CentOS 8がインストールされた少なくとも1つのホスト(2コア、4 GB RAM、少なくとも15 GBドライブ)(「サーバー」インストールプロファイルを推奨)、およびローカルDNSへのエントリ(最後の手段として、次のことができます) / etc / hosts内)。そして、スワップ無効にすることを忘れないでください



ルートユーザーとしてホスト上ですべての操作を実行します。注意してください。



  1. 最初のステップでは、OSを構成し、CRI-Oの予備的な依存関係をインストールして構成します。

    • OSを更新しましょう:



      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