|
[[389249]] 序文昨年12月、KubernetesコミュニティがDockershimをバージョン1.20以降段階的に廃止すると発表した際、多くのセルフメディアもKubernetesがDockerを放棄するだろうという説を宣伝しました。しかし、これは誤解を招く表現であり、人気の波に乗ろうとしただけのものかもしれません。 DockershimはKubernetesのコンポーネントであり、Dockerコンテナを操作するために設計されています。Dockerは2013年にリリースされましたが、Kubernetesは2016年にリリースされました。そのため、Dockerは当初オーケストレーションを想定しておらず、Kubernetesのような巨大な存在の出現も予見していませんでした(もし予見していたら、これほど早く衰退することはなかったでしょう…)。しかし、KubernetesはDockerをコンテナランタイムとして構築され、その運用ロジックの多くはDocker指向でした。コミュニティが成長するにつれて、そしてより多くのコンテナランタイムとの互換性を確保するために、Docker関連ロジックは分離され、Dockershimとして統合されました。 そのため、Kubernetes や Docker に変更を加える際には、適切なサポートを確保するために dockershim のメンテナンスが必要になります。しかし、dockershim を介して Docker を操作するには、本質的に Docker の基盤となるランタイムである Containerd を操作する必要があります。Containerd 自体は CRI (Container Runtime Interface) をサポートしているので、なぜ Docker の別のレイヤーを経由する必要があるのでしょうか?CRI を介して Containerd と直接やり取りすることはできないのでしょうか?これが、コミュニティが dockershim を立ち上げようとした理由の一つです。 では、コンテナ化とは何でしょうか? ContainerdはDockerから派生したプロジェクトで、Kubernetes用のコンテナランタイムを提供することを目的として設計されており、イメージとコンテナのライフサイクル管理を担います。しかし、ContainerdはDockerとは独立して動作することも可能です。その機能は以下のとおりです。 - OCI イメージ仕様 (runc とも呼ばれる) をサポートします。
- OCIランタイム仕様をサポート
- ミラープルをサポート
- コンテナネットワーク管理をサポート
- ストレージはマルチテナントをサポート
- コンテナランタイムとコンテナライフサイクル管理をサポート
- ネットワーク名前空間の管理をサポート
コマンドの使用法に関して、Containerd と Docker の主な違いは次のとおりです。 ご覧のとおり、使用方法はほぼ同じです。 以下では、kubeadm を使用して K8S クラスターをインストールし、コンテナ ランタイムとして containerd を使用する具体的なインストール手順について説明します。 環境の説明ホストノード ソフトウェアの説明ソフトウェアバージョン 環境整備(1)各ノードにホスト情報を追加します。 /etc/hosts を cat する - 192.168.0.5 k8s-マスター
- 192.168.0.125 k8s-node01
(2)ファイアウォールを無効にする: - $ systemctl 停止 ファイアウォール
- $ systemctl ファイアウォールを無効にする
(3)SELINUXを無効にする: - $ setenforce 0
- /etc/selinux/config を cat する
- SELINUX=無効
(4)/etc/sysctl.d/k8s.confファイルを作成し、以下の内容を追加します。 - net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1
- net.ipv4.ip_forward = 1
(5)変更を有効にするには、次のコマンドを実行します。 - $ modprobe br_netfilter
- $ sysctl -p /etc/sysctl.d/k8s.conf
(6)IPVSをインストールする - $ cat > /etc/sysconfig/modules/ipvs.modules <<EOF
- #!/bin/bash
- modprobe
- modprobe
- modprobe
- modprobe
- modprobe
- 終了
- $ chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
上記のスクリプトは `/etc/sysconfig/modules/ipvs.modules` ファイルを作成し、ノードの再起動後に必要なモジュールが自動的にロードされるようにします。`lsmod | grep -e ip_vs -e nf_conntrack_ipv4` コマンドを使用して、必要なカーネルモジュールが正しくロードされているかどうかを確認してください。 (7)ipsetパッケージがインストールされます。 - $ yum インストール ipset -y
IPVS のプロキシ ルールを簡単に表示するには、管理ツール ipvsadm をインストールするのが最適です。 - $ yum インストール ipvsadm -y
(8)サーバーの時間を同期する - $ yum インストール chrony -y
- $ systemctl chronyd を有効にする
- $ systemctl chronyd を起動します
- $ chronyc ソース
(9)スワップパーティションを無効にする: - $ スワップオフ -a
(10) /etc/fstab ファイルを編集し、SWAP の自動マウントをコメントアウトし、free -m コマンドでスワップが無効になっていることを確認します。/etc/sysctl.d/k8s.conf を編集し、以下の行を追加して swappiness パラメータを調整します。 - vm.swappiness=0
変更を適用するには、`sysctl -p /etc/sysctl.d/k8s.conf` を実行します。 (11)次にContainerdをインストールします。 - $ yum インストール -y yum-utils \
- デバイスマッパーの永続データ \
- lvm2
- $ yum-config-manager \
-
- https://download.docker.com/linux/centos/docker-ce.repo
- `$ yum list | grep containerd`
バージョンをインストールすることを選択できます。たとえば、ここでは最新バージョンをインストールします。 - $ yum インストール containerd.io-1.4.4 -y
(12)containerd設定ファイルを作成する。 - mkdir -p /etc/containerd
- containerd 設定のデフォルト> /etc/containerd/config.toml
- # 設定ファイルを置き換える
- sed -i "s#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g" /etc/containerd/config.toml
- sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
- sed -i "s#https://registry-1.docker.io#https://registry.cn-hangzhou.aliyuncs.com#g" /etc/containerd/config.toml
(13) Containerdを起動します。 - systemctlデーモンリロード
- systemctl コンテナを有効にする
- systemctl コンテナを再起動します
Containerdがインストールされ、上記の環境設定が完了したら、Kubeadmをインストールできます。ここでは、Alibaba Cloudのリポジトリを使用して、yumリポジトリを指定してインストールします。
- cat <<EOF > /etc/yum.repos.d/kubernetes.repo
- [Kubernetes]
- 名前=Kubernetes
- ベースURL=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
- 有効=1
- gpgcheck=0
- リポジトリgpgcheck=0
- gpgkey =http: //mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
- http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- 終了
次に、kubeadm、kubelet、kubectl をインストールします (最新バージョンをインストールしましたが、バージョン要件がある場合は、自分でバージョンを設定する必要があります)。 - $ yum install -y kubelet-1.20.5 kubeadm-1.20.5 kubectl-1.20.5
ランタイム設定: - $ crictl config ランタイムエンドポイント /run/containerd/containerd.sock
ご覧のとおり、ここではバージョン v1.20.5 をインストールし、起動時に kubelet が自動的に起動するように設定しています。 - $ systemctl デーモンリロード
- $ systemctl kubelet を有効にする && systemctl kubelet を開始する
上記のすべての操作は、すべてのノードで構成する必要があります。 クラスタを初期化するマスターを初期化する次に、マスターノードでkubeadm初期化ファイルを設定します。デフォルトの初期化設定は、以下のコマンドでエクスポートできます。 - $ kubeadm config 印刷 init-defaults > kubeadm.yaml
次に、imageRepositoryの値を変更し、kube-proxyモードをipvsに設定するなど、必要に応じて設定を変更します。なお、ランタイムとしてcontainerdを使用しているため、ノードの初期化時にcgroupDriverをsystemdに指定する必要があることに注意してください[1]。 - APIバージョン: kubeadm.k8s.io/v1beta2
- ブートストラップトークン:
- - グループ:
- - システム:ブートストラップ:kubeadm:デフォルトの-node-token
- トークン: abcdef.0123456789abcdef
- ttl: 24h0m0s
- 使用法:
- - 署名
- - 認証
- 種類: InitConfiguration
- ローカルAPIエンドポイント:
- 広告アドレス: 192.168.0.5
- バインドポート: 6443
- ノード登録:
- criSocket: /run/containerd/containerd.sock
- 名前: k8s-master
- 汚染:
- - 効果: NoSchedule
- キー: node-role.kubernetes.io/master
-
- apiサーバー:
- 制御プレーンのタイムアウト: 4分0秒
- APIバージョン: kubeadm.k8s.io/v1beta2
- 証明書ディレクトリ: /etc/kubernetes/pki
- クラスター名: kubernetes
- コントローラーマネージャー: {}
- DNS:
- タイプ: CoreDNS
- など:
- 地元:
- データディレクトリ: /var/lib/etcd
- 画像リポジトリ: registry.cn-hangzhou.aliyuncs.com/google_containers
- 種類: ClusterConfiguration
- kubernetesバージョン: v1.20.5
- ネットワーキング:
- dnsドメイン: cluster.local
- ポッドサブネット: 172.16.0.0/16
- サービスサブネット: 10.96.0.0/12
- スケジューラ: {}
-
- apiバージョン: kubeproxy.config.k8s.io/v1alpha1
- 種類: KubeProxyConfiguration
- モード: ipvs
-
- apiバージョン: kubelet.config.k8s.io/v1beta1
- 種類: KubeletConfiguration
- cgroupドライバー: systemd
次に、上記の設定ファイルを使用して初期化します。 - $ kubeadm init
-
- [init] Kubernetesバージョンv1.20.5を使用
- [プリフライト] プリフライトチェックの実行
- [事前準備] Kubernetes クラスターのセットアップに必要なイメージのプル
- [プリフライト] 1分ほどかかる場合があります インターネット接続の速度に応じて、 1~ 2分
- [プリフライト] この操作も実行できます 事前に「kubeadm config images pull」を使用して
- [certs] certificateDir フォルダ"/etc/kubernetes/pki"を使用します
- [certs] 「ca」証明書を生成し、 鍵
- [certs] 「apiserver」証明書を生成し、 鍵
- [certs] apiserver サービング証明書はDNS 名 [k8s-master kubernetes kubernetes. default kubernetes. default .svc kubernetes. default .svc.cluster. local ]およびIP [10.96.0.1 192.168.0.5]に対して署名されています
- [certs] 「apiserver-kubelet-client」証明書を生成し、 鍵
- [certs] 「front-proxy-ca」証明書を生成し、 鍵
- [certs] 「front-proxy-client」証明書を生成し、 鍵
- [certs] 「etcd/ca」証明書を生成し、 鍵
- [certs] 「etcd/server」証明書を生成し、 鍵
- [certs] etcd/server serving certはDNS 名 [k8s-master localhost]とIP アドレス [192.168.0.5 127.0.0.1 ::1]に対して署名されています
- [certs] 「etcd/peer」証明書を生成し、 鍵
- [certs] etcd/peer serving 証明書は、 DNS 名 [k8s-master localhost]とIP アドレス [192.168.0.5 127.0.0.1 ::1]に対して署名されています
- [certs] 「etcd/healthcheck-client」証明書を生成し、 鍵
- [certs] 「apiserver-etcd-client」証明書を生成し、 鍵
- [certs] 「sa」を生成しています 鍵 そして 公共 鍵
- [kubeconfig] kubeconfigフォルダ「/etc/kubernetes」を使用する
- [kubeconfig] 「admin.conf」 kubeconfigファイルを書き込んでいます
- [kubeconfig] 「kubelet.conf」 kubeconfigファイルの書き込み
- [kubeconfig] 「controller-manager.conf」 kubeconfigファイルの書き込み
- [kubeconfig] 「scheduler.conf」 kubeconfigファイルの書き込み
- [kubelet-start]フラグ付きのkubelet 環境ファイルをファイル"/var/lib/kubelet/kubeadm-flags.env"に書き込みます
- [kubelet-start] kubelet設定をファイル「/var/lib/kubelet/config.yaml」に書き込みます
- [kubelet-start] kubeletの起動
- [コントロールプレーン] マニフェストフォルダ「/etc/kubernetes/manifests」を使用しています
- [コントロールプレーン]静的ポッドマニフェストを作成しています 「kube-apiserver」
- [コントロールプレーン]静的ポッドマニフェストを作成しています 「kube-コントローラー-マネージャー」
- [コントロールプレーン]静的ポッドマニフェストを作成しています 「kube-scheduler」
- [etcd]静的Podマニフェストの作成 ローカルetcd /etc/kubernetes/マニフェスト
- [wait-control-plane] kubeletがコントロールプレーンを起動するのを待っています ディレクトリ「/etc/kubernetes/manifests」からの静的Pod 。これには最大4分かかる場合があります。
- [kubelet- check ] 初期タイムアウトの40 秒が経過しました。
- [apiclient] 70.001862秒後、すべてのコントロールプレーンコンポーネントは正常です
- [upload-config] ConfigMap 「kubeadm-config」で使用される設定を保存します 「kube-system」名前空間内
- [kubelet] ConfigMap 「kubelet-config-1.20」の作成 クラスター内のkubeletの設定を含む名前空間kube-system
- [upload-certs] フェーズをスキップします。-- を参照してください。
- [mark-control-plane]ラベル「node-role.kubernetes.io/master=''」を追加して、ノード k8s-master をコントロール プレーンとしてマークします。 そして 「node-role.kubernetes.io/control-plane='' (非推奨)」
- [mark-control-plane] taint を追加してノード k8s-master をコントロールプレーンとしてマークします [node-role.kubernetes.io/master:NoSchedule]
- [bootstrap-token] 使用トークン: abcdef.0123456789abcdef
- [bootstrap-token] ブートストラップトークン、cluster-info ConfigMap、RBAC ロールの設定
- [bootstrap-token] RBACルールを設定して、 Node Bootstrapトークンがノードを取得できるようにしました。
- [bootstrap-token] RBACルールを設定して、 Node BootstrapトークンがCSRを投稿できるようにしました。 注文 ノードが長期証明書の資格情報を取得するため
- [bootstrap-token] は、csrapprover コントローラがノード ブートストラップ トークンからのCSR を自動的に承認できるようにRBAC ルールを構成しました。
- [bootstrap-token] RBACルールを設定して証明書のローテーションを許可しました クラスター内のすべてのノードクライアント証明書
- [bootstrap-token] 「kube-public」名前空間に「 cluster-info」 ConfigMapを作成する
- [kubelet-finalize] 「/etc/kubernetes/kubelet.conf」を更新しています ローテーション可能なkubeletクライアント証明書を指し示し、 鍵
- [アドオン] 必須アドオンを適用: CoreDNS
- [アドオン] 必須アドオンを適用しました: kube-proxy
-
- Kubernetes コントロールプレーンが正常に初期化されました。
-
- クラスターの使用を開始するには、通常のユーザーとして次のコマンドを実行する必要があります。
-
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
- あるいは、 rootユーザーの場合は、次のコマンドを実行できます。
-
- KUBECONFIG=/etc/kubernetes/admin.conf をエクスポートします。
-
- ここで、クラスターにポッド ネットワークをデプロイする必要があります。
- 「kubectl apply -f [podnetwork].yaml」を実行します。 以下にリストされているオプションのいずれかを使用します。
- https://kubernetes.io/docs/concepts/cluster-administration/addons/
-
- 参加できます 任意の数のワーカーノードで、各ワーカーノードで次のコマンドをrootとして実行します。
-
- kubeadm参加192.168.0.5:6443
-
kubeconfigファイルをコピーする - $ mkdir -p $HOME/.kube
- $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
ノードを追加事前にクラスタの初期化設定と操作を完了しておいてください。マスターノードの `$HOME/.kube/config` ファイルを、ノードの対応するファイルにコピーします。kubeadm、kubelet、kubectl をインストールします。初期化が完了したら、プロンプトが表示されるので `join` コマンドを実行します。 - # kubeadm join 192.168.0.5:6443
- >
- [プリフライト] プリフライトチェックの実行
- [プリフライト]クラスターから構成を読み取っています...
- [プリフライト] 参考までに:この設定ファイルは次のように確認できます。 'kubectl -n kube-system get cm kubeadm-config -o yaml'
- [kubelet-start] kubelet設定をファイル「/var/lib/kubelet/config.yaml」に書き込みます
- [kubelet-start]フラグ付きのkubelet 環境ファイルをファイル"/var/lib/kubelet/kubeadm-flags.env"に書き込みます
- [kubelet-start] kubeletの起動
- [kubelet-start] kubelet がTLS ブートストラップを実行するのを待機しています...
-
- このノードはクラスターに参加しました:
- * 証明書署名要求がapiserverに送信され、応答が受信されました。
- * Kubelet に新しい安全な接続の詳細が通知されました。
-
- 「kubectl get nodes」を実行します コントロールプレーンでこのノードがクラスターに参加することを確認します。
上記の join コマンドを忘れた場合は、コマンド `kubeadm token create --print-join-command` を使用して再度取得できます。 実行が成功したら、`get nodes` コマンドを実行します。
- $ kubectl 取得番号
- 名前ステータス 役割 年齢 バージョン
- k8s-master NotReady コントロールプレーン、マスター 29m v1.20.5
- k8s-node01 準備完了なし <なし> 28分 v1.20.5
ご覧の通り、ネットワークプラグインがまだインストールされていないため、NotReady状態になっています。次に、ネットワークプラグインをインストールします。ドキュメント(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)で、ご自身のネットワークプラグインを選択できます。ここでは、Calioをインストールします。 - $ wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
# 一部のノードには複数のネットワーク インターフェイスがあるため、リソース マニフェスト ファイルで内部ネットワーク インターフェイスを指定する必要があります。 $ vi calico.yaml - ……
- 仕様:
- コンテナ:
- - 環境:
- -名前: DATASTORE_TYPE
- 値: Kubernetes
- - name : IP_AUTODETECTION_METHOD # この環境変数をDaemonSetに追加します
- 値: interface=eth0 # 内部ネットワークインターフェースカードを指定します
- -名前: WAIT_FOR_DATASTORE
- 値: "true"
- - name : CALICO_IPV4POOL_CIDR # 172 ネットワーク セグメントは init 中に設定されたため、これを変更する必要があります。
- 値: "172.16.0.0/16"
-
- ……
calico ネットワーク プラグインをインストールします。 - $ kubectl apply -f calico.yaml
時々、Pod の実行ステータスを確認します。 - # kubectl get ポッド -n kube-system
- 名前準備完了 ステータス 再起動 年齢
- calico-kube-controllers-bcc6f659f-zmw8n 0/1 コンテナ作成 0 7分58秒
- calico-node-c4vv7 1/1 実行中 0 7分58秒
- calico-node-dtw7g 0/1 ポッド初期化中 0 7分58秒
- coredns-54d67798b7-mrj2b 1/1 実行中 0 46分
- coredns-54d67798b7-p667d 1/1 実行中 0 46分
- etcd-k8s-master 1/1 実行中 0 46分
- kube-apiserver-k8s-master 1/1 実行中 0 46分
- kube-controller-manager-k8s-master 1/1 実行中 0 46分
- kube-proxy-clf4s 1/1 実行中 0 45分
- kube-proxy-mt7tt 1/1 実行中 0 46分
- kube-scheduler-k8s-master 1/1 実行中 0 46分
ネットワーク プラグインは正常に実行されており、ノードのステータスは正常です。
- # kubectl ノードを取得する
- 名前ステータス 役割 年齢 バージョン
- k8s-master コントロールプレーン、マスター 47m v1.20.5 が準備完了
- k8s-node01 準備完了 <なし> 46m v1.20.5
同じ方法を使用して別のノードを追加することもできます。 コマンドの自動補完を設定する - yum install -y bash補完
- ソース /usr/share/bash-completion/bash_completion
- ソース <(kubectl 補完 bash)
- echo "source <(kubectl 補完 bash)" >> ~/.bashrc
参考資料 【1】:https://github.com/containerd/containerd/issues/4857 【2】:https://github.com/containerd/containerd |