Containerd コンテナ ランタイムを使用して Kubernetes クラスターをデプロイする

Containerd コンテナ ランタイムを使用して Kubernetes クラスターをデプロイする

[[421025]]

前回は、containerd の基本的な使い方を紹介し、Docker コンテナ ランタイムの既存の Kubernetes クラスターを containerd に切り替える方法を学びました。次に、kubeadm を使用して、containerd をコンテナ ランタイムとして使用し、Kubernetes クラスターをゼロから構築します。ここでは最新バージョン v1.22.1 をインストールします。

環境の準備

3 つのノード、すべて Centos 7.6 システム、カーネル バージョン: 3.10.0-1062.4.1.el7.x86_64、各ノードにホスト情報を追加します。

  1. ➜ ~ cat /etc/hosts
  2. 192.168.31.30 マスター
  3. 192.168.31.95 ノード1
  4. 192.168.31.215 ノード2
  • ノードのホスト名には標準の DNS 命名規則を使用する必要があります。また、デフォルトの localhost ホスト名は使用しないでください。さまざまなエラーが発生します。 Kubernetes プロジェクトでは、マシン名と Etcd に保存されるすべての API オブジェクトに標準の DNS 命名規則 (RFC 1123) を使用する必要があります。ホスト名を変更するには、コマンド hostnamectl set-hostname node1 を使用できます。

ファイアウォールを無効にします。

  1. ➜ ~ systemctl でファイアウォールを停止します
  2. ➜ ~ systemctl ファイアウォールを無効にする

SELINUXを無効にする:

  1. ➜ ~ 0 を設定する
  2. ➜ ~ cat /etc/selinux/config
  3. SELINUX=無効

カーネル IPv4 転送を有効にするには br_netfilter モジュールをロードする必要があるため、モジュールをロードします。

  1. ➜ ~ modprobe br_netfilter

/etc/sysctl.d/k8s.conf ファイルを作成し、次の内容を追加します。

  1. net.bridge.bridge-nf-call-ip6tables = 1
  2. net.bridge.bridge-nf-call-iptables = 1
  3. ネット.ipv4.ip_forward = 1

bridge-nf は、netfilter が Linux ブリッジ上の IPv4/ARP/IPv6 パケットをフィルタリングできるようにします。たとえば、net.bridge.bridge-nf-call-iptables=1 を設定すると、パケットを転送するときにレイヤー 2 ブリッジも iptables FORWARD ルールによってフィルタリングされます。一般的なオプションは次のとおりです。

  • net.bridge.bridge-nf-call-arptables: arptables の FORWARD でブリッジ ARP パケットをフィルタリングするかどうか
  • net.bridge.bridge-nf-call-ip6tables: ip6tables チェーンで IPv6 パケットをフィルタリングするかどうか
  • net.bridge.bridge-nf-call-iptables: iptables チェーンで IPv4 パケットをフィルタリングするかどうか
  • net.bridge.bridge-nf-filter-vlan-tagged: iptables/arptables で VLAN タグ付きのパケットをフィルタリングするかどうか。

変更を有効にするには、次のコマンドを実行します。

  1. ➜ ~ sysctl -p /etc/sysctl.d/k8s.conf

ipvsをインストールします:

  1. ➜ ~ cat > /etc/sysconfig/modules/ipvs.modules <<EOF
  2. #!/bin/bash
  3. modprobe --ip_vs  
  4. modprobe --ip_vs_rr  
  5. modprobe --ip_vs_wrr  
  6. modprobe --ip_vs_sh  
  7. modprobe --nf_conntrack_ipv4  
  8. 終了
  9. ➜ ~ 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 コマンドを実行して、必要なカーネル モジュールが正しくロードされているかどうかを確認します。

次に、各ノードに ipset パッケージがインストールされていることを確認する必要があります。

  1. ➜ ~ yum インストール ipset

ipvs のプロキシ ルールを表示するには、管理ツール ipvsadm をインストールするのが最適です。

  1. ➜ ~ yum インストール ipvsadm

サーバー時間を同期する

  1. ➜ ~ yum インストール chrony -y
  2. ➜ ~ systemctl chronyd を有効にする
  3. ➜ ~ systemctl chronyd を起動します
  4. ➜ ~ chronyc ソース
  5. 210 ソース= 4
  6. MS/IPアドレス 階層 ポーリング 到達 最終受信最終サンプル
  7. =======================================================================
  8. ^+ sv1.ggsrv.de 2 6 17 32 -823us[-1128us] +/- 98ms
  9. ^- montreal.ca.logiplex.net 2 6 17 32 -17ms[ -17ms] +/- 179ms
  10. ^- ntp6.flashdance.cx 2 6 17 32 -32ms[ -32ms] +/- 161ms
  11. ^* 119.28.183.184 2 6 33 32 +661us[ +357us] +/- 38ms
  12. ➜ ~日付 
  13. 2021年8月31日火曜日 14:36:14 CST

スワップパーティションを無効にします。

  1. ➜ ~ スワップオフ -a

/etc/fstab ファイルを変更し、SWAP の自動マウントをコメント アウトし、free -m を使用してスワップが無効になっていることを確認します。 swappiness パラメータを調整するには、/etc/sysctl.d/k8s.conf を変更し、次の行を追加します。

  1. vm.swappiness=0

変更を有効にするには、sysctl -p /etc/sysctl.d/k8s.conf を実行します。

Containerdをインストールする

コンテナ ランタイム containerd の基本的な使い方を学習したので、各ノードに Containerd をインストールしましょう。

containerd は runc を呼び出す必要があるため、最初に runc もインストールする必要があります。ただし、containerd は関連する依存関係を含む圧縮パッケージ cri-containerd-cni-${VERSION}.${OS}-${ARCH}.tar.gz を提供しており、これを直接インストールに使用できます。まず、リリース ページから圧縮パッケージの最新バージョン (現在はバージョン 1.5.5) をダウンロードします。

  1. ➜ ~ wget https://github.com/containerd/containerd/releases/download/v1.5.5/cri-containerd-cni-1.5.5-linux-amd64.tar.gz
  2. # 制限がある場合は、ダウンロードを高速化するために次のURLに置き換えることもできます
  3. # wget https://download.fastgit.org/containerd/containerd/releases/download/v1.5.5/cri-containerd-cni-1.5.5-linux-amd64.tar.gz

圧縮パッケージをシステムのさまざまなディレクトリに直接解凍します。

  1. ➜ ~ tar -C / -xzf cri-containerd-cni-1.5.5-linux-amd64.tar.gz

次に、~/.bashrc ファイルの PATH 環境変数に /usr/local/bin と /usr/local/sbin を追加します。

  1. エクスポート PATH=$PATH:/usr/ローカル/bin:/usr/ローカル/sbin

次に、次のコマンドを実行して、すぐに有効にします。

  1. ➜ ~ ソース ~/.bashrc

containerd のデフォルトの設定ファイルは /etc/containerd/config.toml です。次のコマンドを実行すると、デフォルト構成を生成できます。

  1. ➜ ~ mkdir -p /etc/containerd
  2. ➜ ~ containerd 設定デフォルト> /etc/containerd/config.toml

systemd を init システムとして使用する Linux ディストリビューションの場合、コンテナの cgroup ドライバーとして systemd を使用すると、リソースが不足しているときにノードがより安定するため、containerd の cgroup ドライバーを systemd に設定することをお勧めします。以前に生成された設定ファイル /etc/containerd/config.toml を変更し、plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options 設定ブロックの下で SystemdCgroup を true に設定します。

  1. [プラグイン。 「io.containerd.grpc.v1.cri」 .containerd.runtimes.runc]
  2. ...
  3. [プラグイン。 「io.containerd.grpc.v1.cri」 .containerd.runtimes.runc.options]
  4. SystemdCgroup = true  
  5. ....

次に、イメージ リポジトリのアクセラレータを構成します。 cri 構成ブロックの下の registry 構成ブロックで registry.mirrors を構成する必要があります。

  1. [プラグイン。 [[io.containerd.grpc.v1.cri] ]
  2. ...
  3. # サンドボックスイメージ = "k8s.gcr.io/pause:3.5"  
  4. サンドボックスイメージ = "registry.aliyuncs.com/k8sxio/pause:3.5"  
  5. ...
  6. [プラグイン。 ["io.containerd.grpc.v1.cri" .レジストリ]
  7. [プラグイン。 ["io.containerd.grpc.v1.cri" .registry.mirrors]
  8. [プラグイン。 "io.containerd.grpc.v1.cri" .registry.mirrors. [[docker.io] ]
  9. エンドポイント = [ "https://bqr1dr1n.mirror.aliyuncs.com" ]
  10. [プラグイン。 "io.containerd.grpc.v1.cri" .registry.mirrors. [[ ... [
  11. エンドポイント = [ "https://registry.aliyuncs.com/k8sxio" ]

上記でダウンロードした containerd 圧縮パッケージには etc/systemd/system/containerd.service ファイルが含まれているため、systemd を使用して containerd をデーモン プロセスとして実行するように構成できます。これで、次のコマンドを直接実行して containerd を起動できます。

  1. ➜ ~ systemctlデーモンリロード
  2. ➜ ~ systemctl コンテナを有効にする--now  

起動が完了したら、containerd のローカル CLI ツール ctr や crictl などを使用してバージョンを確認できます。

  1. ➜ ~ ctr バージョン
  2. クライアント:
  3. バージョン: v1.5.5
  4. リビジョン: 72cec4be58a9eb6b2910f5d10f1c01ca47d231c0
  5. Goバージョン: go1.16.6
  6.  
  7. サーバ:
  8. バージョン: v1.5.5
  9. リビジョン: 72cec4be58a9eb6b2910f5d10f1c01ca47d231c0
  10. 識別子: cd2894ad-fd71-4ef7-a09f-5795c7eb4c3b
  11. ➜ ~ crictl バージョン
  12. バージョン: 0.1.0
  13. ランタイム名: containerd
  14. ランタイムバージョン: v1.5.5
  15. ランタイム API バージョン: v1alpha2

kubeadm を使用して Kubernetes をデプロイする

上記の関連環境設定も完了です。これで Kubeadm をインストールできます。 yum ソースを指定してインストールします。

  1. ➜ ~ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [Kubernetes]
  3. 名前= Kubernetes
  4. ベース URL = https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
  5. 有効=1
  6. gpgcheck=1
  7. リポジトリ_gpgcheck=1
  8. gpgkey=https : //packages.cloud.google.com/yum/doc/yum-key.gpg
  9. https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
  10. 終了

もちろん、上記の yum ソースには科学的なインターネット アクセスが必要です。科学的にインターネットにアクセスできない場合は、インストールに Alibaba Cloud ソースを使用できます。

  1. ➜ ~ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [Kubernetes]
  3. 名前= Kubernetes
  4. ベースURL=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. 有効=1
  6. gpgcheck=0
  7. リポジトリ_gpgcheck=0
  8. gpgkey =http : //mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  9. http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. 終了

次に、kubeadm、kubelet、kubectl をインストールします。

  1. # --disableexcludes kubernetes以外のすべてのリポジトリを無効にします 
  2. ➜ ~ yum makecache 高速
  3. ➜ ~ yum インストール -y kubelet-1.22.1 kubeadm-1.22.1 kubectl-1.22.1 --disableexcludes=kubernetes  
  4. ➜ ~ kubeadm バージョン
  5. kubeadm バージョン: &version.Info{メジャー: "1" 、マイナー: "22" 、GitVersion: "v1.22.1" 、GitCommit: "632ed300f2c34f6d6d15ca4cef3d3c7073412212" 、GitTreeState: "clean" 、BuildDate: "2021-08-19T15:44:22Z" 、GoVersion: "go1.16.7" 、コンパイラ: "gc" 、プラットフォーム: "linux/amd64" }

ここではバージョン v1.22.1 がインストールされており、起動時にマスター ノードの kubelet が起動するように設定されていることがわかります。

  1. ➜ ~ systemctl enable --now kubelet  

上記のすべての操作は、すべてのノードで構成する必要があります。

クラスターを初期化する

kubelet --help コマンドを実行すると、ほとんどのコマンドライン パラメータが非推奨であることがわかります。これは、公式の推奨事項では、--config を使用して構成ファイルを指定し、構成ファイルでこれらのパラメータの構成を指定するためです。詳細については、公式ドキュメント「設定ファイルを使用して Kubelet パラメータを設定する」を参照してください。このようにして、Kubernetes は動的な Kubelet 構成 (Dynamic Kubelet Configuration) をサポートできます。「ライブ クラスターでノードの Kubelet を再構成する」を参照してください。

次に、次のコマンドを使用して、マスター ノードでのクラスターの初期化に使用されるデフォルト構成を出力できます。

  1. ➜ ~ kubeadm config print init-defaults --component-configs KubeletConfiguration > kubeadm.yaml  

次に、クラスターの初期化時に Kubernetes が必要とするイメージのアドレスを指定するように imageRepository を変更し、kube-proxy のモードを ipvs にするなど、独自のニーズに応じて構成を変更します。さらに、ここでは flannel ネットワーク プラグインをインストールするので、networking.podSubnet を 10.244.0.0/16 に設定する必要があることに注意してください。

  1. # kubeadm.yaml
  2. APIバージョン: kubeadm.k8s.io/v1beta3
  3. ブートストラップトークン:
  4. - グループ:
  5. - システム:ブートストラップ:kubeadm:デフォルト-node-token
  6. トークン: abcdef.0123456789abcdef
  7. 終了時刻: 24h0m0s
  8. 使用法:
  9. - 署名
  10. - 認証
  11. 種類: InitConfiguration
  12. ローカルAPIエンドポイント:
  13. AdvertiseAddress: 192.168.31.30 #マスターノードのイントラネットIPを指定します
  14. バインドポート: 6443
  15. ノード登録:
  16. criSocket: /run/containerd/containerd.sock # containerd の Unix ソケット アドレスを使用する
  17. イメージプルポリシー: IfNotPresent
  18. 名前: マスター
  19. taints: #マスターノードにtaintsを追加して、マスターノードがアプリケーションをスケジュールできないようにします
  20. - 効果: "NoSchedule"  
  21. キー: "node-role.kubernetes.io/master"  
  22.  
  23. ---  
  24. APIバージョン: kubeproxy.config.k8s.io/v1alpha1
  25. 種類: KubeProxyConfiguration
  26. モード: ipvs # kube-proxy モード
  27.  
  28. ---  
  29. apiサーバー:
  30. コントロールプレーンのタイムアウト: 4分0秒
  31. APIバージョン: kubeadm.k8s.io/v1beta3
  32. 証明書ディレクトリ: /etc/kubernetes/pki
  33. クラスター名: kubernetes
  34. コントローラーマネージャー: {}
  35. ドメイン名: {}
  36. など:
  37. 地元
  38. データディレクトリ: /var/lib/etcd
  39. イメージリポジトリ: registry.aliyuncs.com/k8sxio
  40. 種類: ClusterConfiguration
  41. kubernetesバージョン: 1.22.1
  42. ネットワーキング:
  43. dnsドメイン: cluster.local  
  44. サービスサブネット: 10.96.0.0/12
  45. podSubnet: 10.244.0.0/16 # ポッドサブネットを指定します
  46. スケジューラ: {}
  47.  
  48. ---  
  49. APIバージョン: kubelet.config.k8s.io/v1beta1
  50. 認証:
  51. 匿名:
  52. 有効: false  
  53. ウェブフック:
  54. キャッシュTTL: 0秒
  55. 有効: true  
  56. x509:
  57. クライアントCAファイル: /etc/kubernetes/pki/ca.crt
  58. 承認:
  59. モード: Webhook
  60. ウェブフック:
  61. キャッシュ承認TTL: 0秒
  62. キャッシュ未承認TTL: 0秒
  63. クラスターDNS:
  64. - 10.96.0.10
  65. クラスタードメイン: cluster.local  
  66. cpuManagerReconcilePeriod: 0秒
  67. 立ち退き圧力遷移期間: 0 秒
  68. ファイルチェック頻度: 0 秒
  69. healthzBindアドレス: 127.0.0.1
  70. ヘルスポート: 10248
  71. httpチェック頻度: 0秒
  72. 画像の最小GC年齢: 0秒
  73. 種類: KubeletConfiguration
  74. cgroupDriver: systemd # cgroup ドライバーを設定する
  75. ログ: {}
  76. メモリスワップ: {}
  77. ノードステータスレポート頻度: 0 秒
  78. ノードステータス更新頻度: 0 秒
  79. 証明書を回転: true  
  80. ランタイムリクエストタイムアウト: 0 秒
  81. シャットダウン猶予期間: 0 秒
  82. シャットダウン猶予期間クリティカルポッド: 0 秒
  83. 静的ポッドパス: /etc/kubernetes/manifests
  84. ストリーミング接続アイドルタイムアウト: 0 秒
  85. 同期周波数: 0秒
  86. ボリューム統計アグ期間: 0 秒

上記のリソース リストのドキュメントは非常に複雑です。上記のリソース オブジェクトに対応するプロパティを完全に理解するには、対応する godoc ドキュメント (https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta3) を参照してください。

クラスターの初期化を開始する前に、kubeadm config images pull --config kubeadm.yaml を使用して、各サーバー ノードで k8s に必要なコンテナー イメージを事前にプルすることができます。

設定ファイルが準備できたら、次のコマンドを使用してまず関連するイメージをプルできます。

  1. ➜ ~ kubeadm config イメージ pull --config kubeadm.yaml  
  2. [config/images] registry.aliyuncs.com/k8sxio/kube-apiserver:v1.22.1 をプルしました
  3. [config/images] registry.aliyuncs.com/k8sxio/kube-controller-manager:v1.22.1 をプルしました
  4. [config/images] registry.aliyuncs.com/k8sxio/kube-scheduler:v1.22.1 をプルしました
  5. [config/images] registry.aliyuncs.com/k8sxio/kube-proxy:v1.22.1 をプルしました
  6. [config/images] registry.aliyuncs.com/k8sxio/pause:3.5 をプルしました
  7. [config/images] registry.aliyuncs.com/k8sxio/etcd:3.5.0-0 をプルしました
  8. イメージ「registry.aliyuncs.com/k8sxio/coredns:v1.8.4」のプル失敗しました:出力:時刻= 「2021-08-31T15:09:13+08:00」  レベル= 致命的 メッセージ = "イメージをプルしています: RPC エラー: コード = NotFound 説明 = イメージ \"registry.aliyuncs.com/k8sxio/coredns:v1.8.4\" をプルして解凍できませんでした: 参照 \"registry.aliyuncs.com/k8sxio/coredns:v1.8.4\" を解決できませんでした: registry.aliyuncs.com/k8sxio/coredns:v1.8.4: 見つかりません"  
  9. エラー: 終了ステータス 1
  10. このエラースタックトレースを表示するには以下を実行します。    --v=5以上 

上記の coredns イメージをプルするときにエラーが発生しました。画像が見つかりませんでした。手動でイメージを取得し、イメージ アドレスに再度タグを付けることができます。

  1. ➜ ~ ctr -n k8s.io i をプルします docker.io/coredns/coredns:1.8.4
  2. docker.io/coredns/coredns:1.8.4: 解決済み |++++++++++++++++++++++++++++++++++++++++++++|
  3. インデックス-sha256:6e5a02c21641597998b4be7cb5eb1e7b02c0d8d23cce4dd09f4682d463798890: 完了 |++++++++++++++++++++++++++++++++++++++++++|
  4. manifest-sha256:10683d82b024a58cc248c468c2632f9d1b260500f7cd9bb8e73f751048d7d6d4: 完了 |++++++++++++++++++++++++++++++++++++++++++|
  5. レイヤー-sha256:bc38a22c706b427217bcbd1a7ac7c8873e75efdd0e59d6b9f069b4b243db4b4b: 完了 |++++++++++++++++++++++++++++++++++++++++++|
  6. config-sha256:8d147537fb7d1ac8895da4d55a5e53621949981e2e6460976dae812f83d84a44: 完了 |++++++++++++++++++++++++++++++++++++++++++++|
  7. レイヤー-sha256:c6568d217a0023041ef9f729e8836b19f863bcdb612bb3a329ebc165539f5a80: 存在します |++++++++++++++++++++++++++++++++++++++++++|
  8. 経過時間: 12.4秒 合計: 12.0 M (991.3 KiB/s)
  9. linux/amd64 sha256:6e5a02c21641597998b4be7cb5eb1e7b02c0d8d23cce4dd09f4682d463798890 を解凍しています...
  10. 完了: 410.185888 ミリ秒
  11. ➜ ~ ctr -n k8s.io i タグ docker.io/coredns/coredns:1.8.4 registry.aliyuncs.com/k8sxio/coredns:v1.8.4

次に、上記の構成ファイルを使用してマスター ノードを初期化できます。

  1. ➜ ~ kubeadm init --config kubeadm.yaml  
  2. [init] Kubernetesバージョンの使用: v1.22.1
  3. [プリフライト] プリフライトチェックの実行
  4. [事前準備] Kubernetes クラスターの設定必要なイメージを取得する
  5. [プリフライト] 1分ほどかかる場合があります インターネット接続速度応じて、 1~ 2時間 
  6. [プリフライト] このアクションも実行できます 事前「kubeadm config images pull」を使用して 
  7. [certs] certificateDir フォルダ"/etc/kubernetes/pki"を使用します 
  8. [certs] 「ca」証明書を生成し   
  9. [certs] 「apiserver」証明書を生成し   
  10. [certs] apiserver 提供証明書は DNS 名に対して署名されてます[kubernetes kubernetes.デフォルトのKubernetes。デフォルト.svc kubernetes。デフォルトは.svc.cluster です。ローカルマスター]およびIP [10.96.0.1 192.168.31.30]
  11. [certs] 「apiserver-kubelet-client」証明書を生成し   
  12. [certs] 「front-proxy-ca」証明書を生成し   
  13. [certs] 「front-proxy-client」証明書を生成し   
  14. [certs] 「etcd/ca」証明書を生成し   
  15. [certs] 「etcd/server」証明書を生成し   
  16. [certs] etcd/server 提供証明書はDNS 名 [localhost master]およびIP [192.168.31.30 127.0.0.1 ::1]に対して署名されています
  17. [certs] 「etcd/peer」証明書を生成し   
  18. [certs] etcd/ピアサービング証明書は、DNS名 [localhost master]およびIP [192.168.31.30 127.0.0.1 ::1]に対して署名されています
  19. [certs] 「etcd/healthcheck-client」証明書を生成し   
  20. [certs] 「apiserver-etcd-client」証明書を生成し   
  21. [certs] 「sa」を生成しています  そして 公共  
  22. [kubeconfig] kubeconfig フォルダ「/etc/kubernetes」を使用する 
  23. [kubeconfig] 「admin.conf」 kubeconfigファイルの書き込み
  24. [kubeconfig] 「kubelet.conf」 kubeconfigファイルの書き込み
  25. [kubeconfig] 「controller-manager.conf」 kubeconfigファイルの書き込み
  26. [kubeconfig] 「scheduler.conf」 kubeconfigファイルの書き込み
  27. [kubelet-start]フラグ付きのkubelet 環境ファイルをファイル"/var/lib/kubelet/kubeadm-flags.env"書き込みます 
  28. [kubelet-start] kubelet 設定をファイル"/var/lib/kubelet/config.yaml"書き込みます 
  29. [kubelet-start] kubeletの起動
  30. [コントロールプレーン] マニフェストフォルダ「/etc/kubernetes/manifests」を使用する 
  31. [コントロールプレーン]静的ポッドマニフェストを作成しています  「kube-apiserver」  
  32. [コントロールプレーン]静的ポッドマニフェストを作成しています  「kube-コントローラー-マネージャー」  
  33. [コントロールプレーン]静的ポッドマニフェストを作成しています  「kube-スケジューラ」  
  34. [etcd]静的ポッドマニフェスト作成 ローカルetcd   「/etc/kubernetes/マニフェスト」  
  35. [wait-control-plane] kubeletコントロールプレーンを起動するのを待っています ディレクトリ「/etc/kubernetes/manifests」からの静的ポッド。これには最大4分かかる場合があります
  36. [apiclient] 12.501933秒後にすべてのコントロールプレーンコンポーネントが正常になりました
  37. [upload-config] ConfigMap 「kubeadm-config」使用される構成を保存します  「kube-system」名前空間
  38. [kubelet] ConfigMap 「kubelet-config-1.22」の作成 クラスター内のkubelet設定を含む名前空間kube-system
  39. [upload-certs] フェーズをスキップします。 --upload-certsを参照してください 
  40. [mark-control-plane]ラベルを追加して、ノード マスターをコントロール プレーンとしてマークします: [node-role.kubernetes.io/master(非推奨) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude- from -external- load -balancers ]
  41. [mark-control-plane] taint を追加してノードマスターをコントロール プレーンとしてマークします [node-role.kubernetes.io/master:NoSchedule]
  42. [bootstrap-token] 使用トークン: abcdef.0123456789abcdef
  43. [bootstrap-token] ブートストラップトークン、cluster-info ConfigMap、RBAC ロールの設定
  44. [bootstrap-token] RBACルールを設定して、Node Bootstrapトークンがノードを取得できるようしました。
  45. [bootstrap-token] RBACルールを設定して Node BootstrapトークンがCSRを投稿できるようにしました。  注文 ノードが長期証明書の資格情報を取得するため
  46. [bootstrap-token] csrapprover コントローラがノード ブートストラップ トークンからのCSR を自動的に承認できるようにRBAC ルールを構成しました。
  47. [bootstrap-token] RBACルールを設定して証明書のローテーションを許可しまし クラスター内のすべてのノードクライアント証明書
  48. [bootstrap-token] 「kube-public」名前空間 cluster-info」 ConfigMapを作成する
  49. [kubelet-finalize] 「/etc/kubernetes/kubelet.conf」を更新しています ローテーション可能なkubeletクライアント証明指し示し   
  50. [アドオン] 必須アドオンを適用しました: CoreDNS
  51. [アドオン] 必須アドオンを適用しました: kube-proxy
  52.  
  53. Kubernetes コントロールプレーンが正常に初期化されました。
  54.  
  55. クラスターの使用を開始するには通常のユーザーとして以下を実行する必要があります
  56.  
  57. mkdir -p $HOME/.kube
  58. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  59. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  60.  
  61. あるいは、rootユーザーの場合は、次のコマンドを実行できます。
  62.  
  63. KUBECONFIG=/etc/kubernetes/admin.conf をエクスポートします。
  64.  
  65. ここで、クラスターポッド ネットワークをデプロイする必要があります。
  66. 「kubectl apply -f [podnetwork].yaml」を実行します。  以下にリストされているオプションいずれかを使用します
  67. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  68.  
  69. 参加する 任意のワーカーノードで、各ワーカーノード次のコマンドをrootとして実行します
  70.  
  71. kubeadm join 192.168.31.30:6443 --token abcdef.0123456789abcdef \  
  72. --discovery-token-ca-cert-hash sha256:8c1f43da860b0e7bd9f290fe057f08cf7650b89e650ff316ce4a9cad3834475c  

インストールプロンプトに従って kubeconfig ファイルをコピーします。

  1. ➜ ~ mkdir -p $HOME/.kube
  2. ➜ ~ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. ➜ ~ sudo chown $(id -u):$(id -g) $HOME/.kube/config

次に、kubectl コマンドを使用して、マスター ノードが正常に初期化されたかどうかを確認できます。

  1. ➜ ~ kubectl ノードを取得する
  2. 名前ステータス 役割 年齢 バージョン
  3. マスター コントロール プレーン準備完了、マスター 2m10s v1.22.1

ノードの追加

事前にクラスターの構成と操作を初期化し、マスター ノード上の $HOME/.kube/config ファイルをノードの対応するファイルにコピーし、kubeadm、kubelet、kubectl (オプション) をインストールして、初期化が完了したらプロンプトが表示される join コマンドを実行することを忘れないでください。

  1. ➜ ~ kubeadm join 192.168.31.30:6443 --token abcdef.0123456789abcdef \  
  2. > --discovery-token-ca-cert-hash sha256:8c1f43da860b0e7bd9f290fe057f08cf7650b89e650ff316ce4a9cad3834475c  
  3. [プリフライト] プリフライトチェックの実行
  4. [プリフライト] 警告:コンテナ ランタイムとの通信使用するインターフェイスを作成できませんでした:コンテナ ランタイムにはdocker が必要です: exec : "docker" : 実行可能ファイルが$PATH見つかりません
  5. [プリフライト]クラスターから構成を読み取っています...
  6. [プリフライト] 参考までに:この設定ファイル  'kubectl -n kube-system get cm kubeadm-config -o yaml'  
  7. [kubelet-start] kubelet 設定をファイル"/var/lib/kubelet/config.yaml"書き込みます 
  8. [kubelet-start]フラグ付きのkubelet 環境ファイルをファイル"/var/lib/kubelet/kubeadm-flags.env"書き込みます 
  9. [kubelet-start] kubeletの起動
  10. [kubelet-start] kubeletTLS ブートストラップを実行するのを待機しています...
  11.  
  12. このノードはクラスターに参加しました:
  13. * 証明書署名要求がapiserver送信され応答が受信されました。
  14. * Kubelet に新しい安全な接続の詳細通知されました
  15.  
  16. 「kubectl get nodes」を実行します コントロールプレーンこのノードがクラスターに参加することを確認します。
  • 上記の join コマンドを忘れた場合は、kubeadm token create --print-join-command コマンドを使用して再度取得できます。

実行が成功したら、get nodes コマンドを実行します。

  1. ➜ ~ kubectl ノードを取得する
  2. 名前ステータス 役割 年齢 バージョン
  3. マスター 準備完了コントロールプレーン、マスター 47m v1.22.1
  4. node2 NotReady <なし> 46秒 v1.22.1

NotReady 状態であることがわかります。これは、ネットワーク プラグインがインストールされていないためです。次に、ネットワーク プラグインをインストールします。ドキュメント https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ で独自のネットワーク プラグインを選択できます。ここでフランネルをインストールします:

  1. ➜ ~ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  2. # ノードに複数のネットワークカードがある場合は、リソースリストファイルで内部ネットワークカードを指定する必要があります。
  3. # kube-flannelコンテナの下にあるkube-flannel-dsという名前のDaemonSetを検索します
  4. ➜ ~ vi kube-flannel.yml
  5. ......
  6. コンテナ:
  7. -名前: kube-flannel
  8. イメージ: quay.io/coreos/flannel:v0.14.0
  9. 指示:
  10. - /opt/bin/flanneld
  11. 引数:
  12. - --ip-masq  
  13. - --kube-サブネットマネージャー 
  14. - --iface=eth0 # 複数のネットワークカードがある場合は、内部ネットワークカードの名前を指定します 
  15. ......
  16. ➜ ~ kubectl apply -f kube-flannel.yml # flannelネットワークプラグインをインストールします

しばらくしてから Pod の実行ステータスを確認します。

  1. ➜ ~ kubectl get ポッド -n kube-system
  2. 名前準備完了 ステータス 再起動 年齢
  3. coredns-7568f67dbd-5mg59 1/1 実行中 0 8分32秒
  4. coredns-7568f67dbd-b685t 1/1 実行中 0 8分31秒
  5. etcd-master 1/1 実行中 0 66分
  6. kube-apiserver-master 1/1 実行中 0 66 分
  7. kube-controller-manager-master 1/1 実行中 0 66分
  8. kube-flannel-ds-dsbt6 1/1 ランニング 0 11m
  9. kube-flannel-ds-zwlm6 1/1 ランニング 0 11m
  10. kube-proxy-jq84n 1/1 実行中 0 66分
  11. kube-proxy-x4hbv 1/1 実行中 0 19分
  12. kube-scheduler-master 1/1 実行中 0 66 分
  • ネットワーク プラグインを展開し、ifconfig コマンドを実行すると、通常、新しく追加された 2 つの仮想デバイス cni0 と flannel1 が表示されます。ただし、cni0 デバイスが表示されなくても、あまり心配する必要はありません。 /var/lib/cni ディレクトリが存在するかどうかを確認できます。存在しない場合は、デプロイメントに問題があるのではなく、ノード上でまだアプリケーションが実行されていないことを意味します。ディレクトリが作成され、cni0 デバイスも作成されることを確認するには、ノード上で Pod を実行するだけです。

ネットワーク プラグインは正常に実行され、ノードのステータスは正常です。

  1. ➜ ~ kubectl ノードを取得する
  2. 名前ステータス 役割 年齢 バージョン
  3. マスター 準備完了コントロールプレーン、マスター 111m v1.22.1
  4. node2 準備完了 <なし> 64m v1.22.1

同じ方法を使用して別のノードを追加します。

ダッシュボード

v1.22.1 クラスターには、ダッシュボードの最新バージョン 2.0+ をインストールする必要があります。

  1. # 以下の方法を使用することをお勧めします
  2. ➜ ~ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
  3. ➜ ~ vi 推奨.yaml
  4. # サービスタイプをNodePortに変更する
  5. ......
  6. 種類: サービス
  7. APIバージョン: v1
  8. メタデータ:
  9. ラベル:
  10. k8s-app: kubernetes-ダッシュボード
  11. 名前: kubernetes-dashboard
  12. 名前空間: kubernetes-dashboard
  13. 仕様:
  14. ポート:
  15. - ポート: 443
  16. ターゲットポート: 8443
  17. セレクタ:
  18. k8s-app: kubernetes-ダッシュボード
  19. type: NodePort # type=NodePort を追加して NodePort タイプのサービスにします
  20. ......

直接作成:

  1. ➜ ~ kubectl apply -f 推奨.yaml

新しいバージョンのダッシュボードは、デフォルトで kubernetes-dashboard 名前空間にインストールされます。

  1. ➜ ~ kubectl get pods -n kubernetes-dashboard -o wide
  2. 名前準備完了 ステータス 再起動 年齢 IP ノード 指名ノード 準備完了 ゲート
  3. dashboard-metrics-scraper-856586f554-pllvt 1/1 実行中 0 24分 10.88.0.7 マスター <なし> <なし>
  4. kubernetes-dashboard-76597d7df5-82998 1/1 実行中 0 21m 10.88.0.2 node2 <なし> <なし>

よく見ると、上記の Pod に割り当てられた IP セグメントは、上記で自動的にインストールされた CoreDNS を含めて 10.88.xx.xx であることがわかります。 podSubnet を 10.244.0.0/16 に設定しませんでしたか?まずCNI構成ファイルを確認しましょう。

  1. ➜ ~ ls -la /etc/cni/net.d/
  2. 合計 8
  3. drwxr-xr-x 2 1001 docker 67 8月31日 16:45 .
  4. drwxr-xr-x。 3 1001 docker 19 7月 30 01:13 ..
  5. -rw-r --r-- 1 1001 docker 604 7月30日 01:13 10-containerd-net.conflist  
  6. -rw-r --r-- 1 ルート ルート 292 8月 31 16:45 10-flannel.conflist  

2 つの構成が含まれていることがわかります。1 つは 10-containerd-net.conflist で、もう 1 つは上記で作成した Flannel ネットワーク プラグインによって生成された構成です。ぜひこの構成のフランネルを使いたいですね。 containerd に付属する cni プラグインの設定を確認できます。

  1. ➜ ~ cat /etc/cni/net.d/10-containerd-net.conflist
  2. {
  3. "cniバージョン" : "0.4.0"
  4. 「名前」 : 「containerd-net」
  5. 「プラグイン」 : [
  6. {
  7. 「タイプ」 : 「ブリッジ」
  8. 「ブリッジ」 : 「cni0」
  9. "isGateway" : true
  10. "ipMasq" : true
  11. "promiscMode" : true
  12. 「ipam」 :{
  13. 「タイプ」 : 「ホストローカル」
  14. 「範囲」 : [
  15. [{
  16. 「サブネット」 : 「10.88.0.0/16」  
  17. }],
  18. [{
  19. 「サブネット」 : 「2001:4860:4860::/64」  
  20. }]
  21. ]、
  22. 「ルート」 : [
  23. { "dst" : "0.0.0.0/0" },
  24. { "dst" : "::/0" }
  25. ]
  26. }
  27. },
  28. {
  29. 「タイプ」 : 「ポートマップ」
  30. 「機能」 : { 「ポートマッピング」 : true }
  31. }
  32. ]
  33. }

上記の IP セグメントは正確に 10.88.0.0/16 ですが、cni プラグインのタイプはブリッジ ネットワークであり、ブリッジの名前は cni0 であることがわかります。

  1. ➜ ~ ip a
  2. ...
  3. 6: cni0: <BROADCAST、MULTICAST、PROMISC、UP、LOWER_UP> mtu 1500 qdisc noqueue 状態 UPグループ デフォルトのqlen 1000
  4. リンク/イーサ 9a:e7:eb:40:e8:66 brd ff:ff:ff:ff:ff:ff
  5. inet 10.88.0.1/16 brd 10.88.255.255 スコープグローバルcni0
  6. valid_lft 永久に preferred_lft 永久に
  7. inet6 2001:4860:4860::1/64 スコープグローバル 
  8. valid_lft 永久に preferred_lft 永久に
  9. inet6 fe80::98e7:ebff:fe40:e866/64 スコープ リンク
  10. valid_lft 永久に preferred_lft 永久に
  11. ...

ただし、ブリッジ ネットワークを使用するコンテナーは複数のホスト間で通信できません。ホスト間の通信には、上記でインストールされた Flannel や Calico などの他の cni プラグインを使用する必要があります。ここでは 2 つの cni 構成があるため、10-containerd-net.conflist 構成を削除する必要があります。このディレクトリに複数の cni 設定ファイルがある場合、kubelet はファイル名の辞書順で最初のファイルを設定ファイルとして使用します。したがって、containerd-net プラグインがデフォルトで選択されます。

  1. ➜ ~ mv /etc/cni/net.d/10-containerd-net.conflist /etc/cni/net.d/10-containerd-net.conflist.bak
  2. ➜ ~ ifconfig cni0 ダウン && ip リンク削除cni0
  3. ➜ ~ systemctlデーモンリロード
  4. ➜ ~ systemctl コンテナを再起動します。kubelet

次に、coredns と dashboard Pod を再構築することを忘れないでください。再構築後、ポッドの IP アドレスは正常になります。

  1. ➜ ~ kubectl get pods -n kubernetes-dashboard -o wide
  2. 名前準備完了 ステータス 再起動 年齢 IP ノード 指名ノード 準備完了 ゲート
  3. dashboard-metrics-scraper-856586f554-tp8m5 1/1 実行中 0 42s 10.244.1.6 node2 <なし> <なし>
  4. kubernetes-dashboard-76597d7df5-9rmbx 1/1 実行中 0 66s 10.244.1.5 node2 <なし> <なし>
  5. ➜ ~ kubectl get pods -n kube-system -o Wide -l k8s-app=kube-dns
  6. 名前準備完了 ステータス 再起動 年齢 IP ノード 指名ノード 準備完了 ゲート
  7. coredns-7568f67dbd-n7bfx 1/1 実行中 0 5分40秒 10.244.1.2 node2 <なし> <なし>
  8. coredns-7568f67dbd-plrv8 1/1 実行中 0 3分47秒 10.244.1.4 node2 <なし> <なし>

ダッシュボードの NodePort ポートを表示します。

  1. ➜ ~ kubectl get svc -n kubernetes-dashboard
  2. 名前タイプ クラスター IP 外部 IP ポート 年齢
  3. ダッシュボードメトリックスクレーパー ClusterIP 10.99.37.172 <なし> 8000/TCP 25m
  4. kubernetes-dashboard ノードポート 10.103.102.27 <なし> 443:31050/TCP 25 分

その後、上記のポート 31050 を介してダッシュボードにアクセスできます。https を使用することを忘れないでください。 Chrome が動作しない場合は、Firefox を使用してテストできます。 Firefox なしでページを開くことができない場合は、次のページで信頼証明書をクリックしてください。

信頼証明書

信頼すると、ダッシュボードのログイン ページにアクセスできます。

次に、ダッシュボードにログインするためのすべてのグローバル権限を持つユーザーを作成します: (admin.yaml)

  1. 種類: ClusterRoleBinding
  2. apiバージョン: rbac。認証.k8s.io/v1
  3. メタデータ:
  4. 名前:admin
  5. ロールリファレンス:
  6. 種類: ClusterRole
  7. 名前: クラスター管理者
  8. apiGroup : rbac.authorization.k8s.io
  9. 科目:
  10. - 種類: サービスアカウント
  11. 名前:admin
  12. 名前空間: kubernetes-dashboard
  13. ---  
  14. APIバージョン: v1
  15. 種類: サービスアカウント
  16. メタデータ:
  17. 名前:admin
  18. 名前空間: kubernetes-dashboard

直接作成:

  1. ➜ ~ kubectl apply -f admin.yaml
  2. ➜ ~ kubectl get secret -n kubernetes-dashboard|grep admin-token
  3. admin-token-lwmmx kubernetes.io/service-account-token 3 1d
  4. ➜ ~ kubectl シークレットを取得 admin-token-lwmmx -o jsonpath={.data.token} -n kubernetes-dashboard |base64 -d
  5. # 非常に長いbase64文字列が生成されます

次に、上記の base64 デコードされた文字列をトークンとして使用して、ダッシュボードにログインします。新しいバージョンではダークモードも追加されています。

最後に、kubeadm を使用して、Kubernetes クラスター、coredns、ipvs、flannel、containerd の v1.22.1 バージョンの構築が完了しました。

  1. ➜ ~ kubectl ノードを取得 -o ワイド
  2. 名前ステータス 役割 年齢 バージョン 内部 IP 外部 IP OS イメージ カーネル バージョン コンテナ ランタイム
  3. マスター準備完了コントロールプレーン、マスター 36m v1.22.1 192.168.31.30 <なし> CentOS Linux 7 (Core) 3.10.0-1160.25.1.el7.x86_64 containerd://1.5.5
  4. node2 準備完了 <なし> 27m v1.22.1 192.168.31.215 <なし> CentOS Linux 7 (Core) 3.10.0-1160.25.1.el7.x86_64 containerd://1.5.5

クリーニング

クラスターのインストール中に他の問題が発生した場合は、次のコマンドを使用してリセットできます。

  1. ➜ ~ kubeadm リセット
  2. ➜ ~ ifconfig cni0 ダウン && ip リンク削除cni0
  3. ➜ ~ ifconfig flannel.1 ダウン && ip リンク削除flannel.1
  4. ➜ ~ rm -rf /var/lib/cni/

<<:  クラウド データベース移行の 5 つのステップ

>>:  Docker 初体験: Docker 独自のカスタマイズされたイメージ

推薦する

SEO最適化効果を保つためのサイトマップの使い方について

すべての SEO 担当者はウェブサイト マップに精通している必要があると思います。各サイトには 2 ...

speedykvm - Dallas KVM/SSD/VPS の簡単なレビュー、高性能

昨日、暇だったのでspeedykvmを推奨する記事「推奨:今年のベストKVM/SSD[raid10]...

2022年プライバシーコンピューティングカンファレンス:データの安全な流通を確保するには、信頼できるプライバシーコンピューティングがサポート技術です

プライバシーコンピューティングは、データの循環とデータのセキュリティのバランスをとる重要な技術として...

オンラインストアが見落としがちなタオバオ SEO 検索トラップの簡単な分析

タオバオの中小規模の販売業者にとって、タオバオの列車やダイヤモンドブースを購入するには多額の費用がか...

#大容量ハードドライブ VPS# budgetnode - 年間 24 ドルの支払い / KVM / 512 MB メモリ / 250 g ハードドライブ / 1 T トラフィック

budgetnode は、サイバーマンデーに関する非常に役立つ情報をお届けします。英国の高構成 KV...

クラウドネイティブ導入におけるセキュリティ責任

企業での導入が増加するにつれて、開発者と IT 意思決定者がセキュリティとコンプライアンスの懸念に対...

ginernet: 年間 9.99 ユーロ、スペイン語 VPS、著作権なし、コンテンツ無制限

スペイン(Interxion Madrid)のデータセンターで主にVPSを運営しているginerne...

ウェブサイトのランキング最適化と競合他社の簡単な分析

ウェブサイトのランキング最適化を行うSEO担当者にとって、競合他社を分析できなければなりません。競合...

5月にクラウドファンディングの新ルールが導入される可能性:野蛮な成長を終わらせる

先日、5月に株式型クラウドファンディングのガイドラインが発行される可能性があるというニュースがありま...

クラウドネイティブの高性能分散ファイルシステムであるJuiceFSは本当に興味深い

JuiceFS は、Apache 2.0 オープン ソース プロトコルに基づいてリリースされた、クラ...

中国のスマートヘルスケア産業に関する洞察

政策の推進、情報構築の改善、革新技術の強化により、医療はインテリジェント化の段階に入りました。市場規...

SEO とは何ですか? また、SEO をどのように理解すればよいですか?

SEOとは何ですか? SEO の正式名称は Search Engine Optimization で...

SEOの企業採用要件とSEOアイデア

現在、多くの企業がSEOの必要性を認識し、電子商取引の甘さを味わっています。Baidu入札とGoog...

ショップと百度を利用して企業ウェブサイトのロングテールワードを抑制する - A5 Webmaster Network

多くの企業製品のホームページ上のロングテールワードやキーワードランキングは、すべて分類情報プラットフ...

SEO会社が外部リンクスペシャリストの仕事への熱意を高める方法

SEO 専門職の中で最も一般的な職種として、外部リンク スペシャリストは SEO 会社の求人情報でよ...