Kubernetes の実行環境として Docker に代わる CRI-O: CentOS 8 でのセットアップ

こんにちは! 私の名前は Sergey、Surf の DevOps です。 Surf の DevOps 部門は、専門家間の対話を確立し、ワークフローを統合するだけでなく、自社のインフラストラクチャと顧客のインフラストラクチャの両方で関連テクノロジーを積極的に研究し実装することも目指しています。

以下では、ディストリビューションの調査中に出会ったコンテナの技術スタックの変化について少しお話します。 CentOS 8 そして何ですか それを作成する そして、それを使用して実行可能環境を迅速にセットアップする方法 Kubernetes.

Kubernetes の実行環境として Docker に代わる CRI-O: CentOS 8 でのセットアップ

CentOS 8 の標準ディストリビューションに Docker が含まれていないのはなぜですか

最新のメジャー リリースをインストールした後 RHEL 8 または CentOS 8 見落とさないでください: これらのディストリビューションと公式リポジトリにはアプリケーションがありません デッカー、イデオロギー的および機能的にパッケージを置き換えます。 ポッドマン, ビルダ (デフォルトでディストリビューションに存在します) および それを作成する。 これは、とりわけ、Open Container Initiative (OCI) プロジェクトの一環として Red Hat によって開発された標準の実際的な実装によるものです。

The Linux Foundation の一部である OCI の目標は、複数の問題を一度に解決するコンテナ形式と実行可能環境に関するオープンな業界標準を作成することです。 第一に、それらは Linux の哲学と矛盾しませんでした (たとえば、各プログラムが何らかの XNUMX つのアクションを実行しなければならないという部分では、 デッカー オールインワンの組み合わせのようなものです)。 第二に、ソフトウェアの既存の欠点をすべて取り除くことができました。 デッカー。 第三に、コンテナ化されたアプリケーションのデプロイ、管理、保守のために主要な商用プラットフォーム (Red Hat OpenShift など) によって提示されるビジネス要件と完全に互換性があります。

制限事項 デッカー 新しいソフトウェアの利点については、すでに詳しく説明されています。 この記事OCI プロジェクトの一部として提供されるソフトウェア スタック全体とそのアーキテクチャ機能の詳細な説明は、公式ドキュメントと Red Hat 自体の記事の両方で見つけることができます (良い 記事 Red Hat ブログで)、およびサードパーティで レビュー.

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

  • ポッドマン - runC プロセスを介したコンテナおよびイメージ ストレージとの直接対話。
  • ビルダ - イメージのアセンブリとレジストリへのロード。
  • それを作成する - コンテナ オーケストレーション システムのランタイム環境 (Kubernetes など)。

スタックのコンポーネント間の相互作用の一般的なスキームを理解するには、ここに接続図を示すことをお勧めします。 Kubernetes c ランC および低レベルのライブラリを使用する それを作成する:

Kubernetes の実行環境として Docker に代わる CRI-O: CentOS 8 でのセットアップ

それを作成する и Kubernetes 同じリリースとサポート サイクルに従います (互換性マトリックスは非常に単純です: メジャー リリース) Kubernetes и それを作成する これは、開発者によるこのスタックの動作の完全かつ包括的なテストへの重点を考慮すると、どのような使用シナリオでも動作の最大の達成可能な安定性を期待する権利を与えてくれます (ここでは、相対的な軽量性も有益です)。 それを作成する と比べて デッカー 意図的に機能が制限されているため)。

インストール時 Kubernetes 「正しい方法」で (もちろん OCI に従って) 使用する それを作成する на CentOS 8 いくつかの小さな困難に遭遇しましたが、無事に克服することができました。 インストールと構成の手順を喜んで共有させていただきます。合計で長くても 10 分程度かかります。

CRI-O 環境を使用して CentOS 8 に Kubernetes をデプロイする方法

前提条件: 少なくとも 2 つのホスト (4 コア、15 GB RAM、少なくとも XNUMX GB ストレージ) が必要です。 CentOS 8 (推奨されるインストール プロファイル「Server」)、およびローカル DNS 内のそのエントリ (極端な場合は、/etc/hosts 内のエントリで対処できます)。 そして忘れないでください スワップを無効にする.

root ユーザーに代わってホスト上ですべての操作を実行します。注意してください。

  1. 最初のステップでは、OS をセットアップし、CRI-O の予備的な依存関係をインストールして構成します。
    • OSのアップデート:
      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

    • 必要なバージョンを設定します それを作成する (メジャーバージョン それを作成するすでに述べたように、必要なバージョンと同じです 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

    • インストールできるようになりました それを作成する:
      dnf -y install cri-o
      

      インストール プロセス中に遭遇する最初のニュアンスに注意してください。構成を編集する必要があります。 それを作成する 必要な共通コンポーネントの場所が指定された場所と異なるため、サービスを開始する前に次のようにします。

      sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.conf

      これでデーモンをアクティブ化して起動できるようになりました それを作成する:

      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

    • XNUMX 番目の重要なニュアンス: デーモンを使用しないため デッカーただし、デーモンを使用します それを作成する、起動および初期化前 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

    • インストール中に遭遇する XNUMX 番目の重要な点: 使用するドライバーを指定したにもかかわらず cグループ、および渡された引数によるその構成 キューブレット 古い場合 (これはドキュメントに直接示されています)、ファイルに引数を追加する必要があります。そうしないと、クラスターは初期化されません。
      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) をインストールします。 使用することをお勧めします サラサ。 もしかしたらもっと人気があるかもしれない フランネル との互換性に問題があります nftables、および サラサ - プロジェクトによって推奨され、完全にテストされた唯一の 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 の取り組みが数年後にどのような結果をもたらすかは完全には明らかではありませんが、私たちは喜んでそれに従うつもりです。 コメントで今すぐ意見を共有できます。

乞うご期待!

この記事は、次の情報源のおかげで作成されました。



出所: habr.com

コメントを追加します