こんにちは! 私の名前は Sergey、Surf の DevOps です。 Surf の DevOps 部門は、専門家間の対話を確立し、ワークフローを統合するだけでなく、自社のインフラストラクチャと顧客のインフラストラクチャの両方で関連テクノロジーを積極的に研究し実装することも目指しています。
以下では、ディストリビューションの調査中に出会ったコンテナの技術スタックの変化について少しお話します。 CentOS 8 そして何ですか それを作成する そして、それを使用して実行可能環境を迅速にセットアップする方法 Kubernetes.
CentOS 8 の標準ディストリビューションに Docker が含まれていないのはなぜですか
最新のメジャー リリースをインストールした後 RHEL 8 または CentOS 8 見落とさないでください: これらのディストリビューションと公式リポジトリにはアプリケーションがありません デッカー、イデオロギー的および機能的にパッケージを置き換えます。 ポッドマン, ビルダ (デフォルトでディストリビューションに存在します) および それを作成する。 これは、とりわけ、Open Container Initiative (OCI) プロジェクトの一環として Red Hat によって開発された標準の実際的な実装によるものです。
The Linux Foundation の一部である OCI の目標は、複数の問題を一度に解決するコンテナ形式と実行可能環境に関するオープンな業界標準を作成することです。 第一に、それらは Linux の哲学と矛盾しませんでした (たとえば、各プログラムが何らかの XNUMX つのアクションを実行しなければならないという部分では、 デッカー オールインワンの組み合わせのようなものです)。 第二に、ソフトウェアの既存の欠点をすべて取り除くことができました。 デッカー。 第三に、コンテナ化されたアプリケーションのデプロイ、管理、保守のために主要な商用プラットフォーム (Red Hat OpenShift など) によって提示されるビジネス要件と完全に互換性があります。
制限事項 デッカー 新しいソフトウェアの利点については、すでに詳しく説明されています。
提案されたスタックのコンポーネントがどのような機能を備えているかに注意することが重要です。
- ポッドマン - runC プロセスを介したコンテナおよびイメージ ストレージとの直接対話。
- ビルダ - イメージのアセンブリとレジストリへのロード。
- それを作成する - コンテナ オーケストレーション システムのランタイム環境 (Kubernetes など)。
スタックのコンポーネント間の相互作用の一般的なスキームを理解するには、ここに接続図を示すことをお勧めします。 Kubernetes c ランC および低レベルのライブラリを使用する それを作成する:
それを作成する и 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 ユーザーに代わってホスト上ですべての操作を実行します。注意してください。
- 最初のステップでは、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
- OSのアップデート:
- インストールとアクティベーション 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
カスタマイズするには コントロール プレーン または ワーカー 数分でノードを構築できます。
このスクリプト .
- 必要なリポジトリを追加します。
- クラスターを初期化します。
- クラスターを初期化するには、次のコマンドを実行します。
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 の取り組みが数年後にどのような結果をもたらすかは完全には明らかではありませんが、私たちは喜んでそれに従うつもりです。 コメントで今すぐ意見を共有できます。
乞うご期待!
この記事は、次の情報源のおかげで作成されました。
- コンテナランタイムに関するセクション
Kubernetes ドキュメント ページ インターネット上のCRI-Oプロジェクト- Red Hat ブログの記事:
これです ,この 他にもたくさん
出所: habr.com