技術ノート クラウド Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法

Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法

Kubernetes は複雑であることで知られていますが、最新のリリースではセットアップが比較的簡単です。公式クラスター管理ツール Kubeadm は、 コントロール プレーンの起動とワーカー ノードの登録のための自動エクスペリエンスを提供します。

この記事では、デフォルト構成を使用して単純な Kubernetes クラスターをセットアップする手順を説明します。これは、新しくプロビジョニングされたホストで動作する「最初からの」ガイドです。 Debian ベースのシステムを想定していますが、ほとんどのコマンドはオペレーティング システムのパッケージ マネージャーに合わせて調整できます。これらの手順は、Ubuntu 22.04 および Kubernetes v1.25 を使用してテストされています。

コンテナランタイムのインストール

Kubernetes では、コンテナーを起動して実行するには、CRI 互換のコンテナー ランタイムが必要です。標準の Kubernetes ディストリビューションにはランタイムが付属していないため、続行する前にランタイムをインストールする必要があります。最も一般的な選択肢は です。これは、最新の Docker リリースに含まれるランタイムです。

Docker の Apt リポジトリを使用して、containerd をインストールできます。まず、インストール手順中に使用される依存関係をいくつか追加します。

 $ sudo aptアップデート

$ sudo apt install -y \

CA 証明書 \

カール \

gnupg \

LSBリリース

次に、リポジトリの GPG キーを Apt の keyrings ディレクトリに追加します。

 $ sudo mkdir -p /etc/apt/keyrings

$カール -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg –dearmor -o /etc/apt/keyrings/docker.gpg

これで、次のコマンドを実行して、システムに適切なリポジトリを追加できます。

 $ エコー \

「deb [arch=$(dpkg –print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \

$(lsb_release -cs) 安定した” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

パッケージ リストを更新して、Docker リポジトリの内容を含めます。

 $ sudo aptアップデート

最後にcontainerdをインストールします。

 $ sudo apt install -ycontainerd.io

Containerd サービスが起動していることを確認します。

 $ sudoサービスcontainerdステータス

containerd.service -containerdコンテナランタイム

ロード済み: ロード済み (/lib/systemd/system/containerd.service; 有効; ベンダー プリセット: 有効)

アクティブ: 2022-09-13 火曜日 16:50:12 BST 以降アクティブ (実行中)。 6秒前

Kubernetes で適切に動作させるには、containerd 構成ファイルにいくつかの調整が必要です。まず、ファイルの内容をcontainerdのデフォルト設定に置き換えます。

 $ sudo containerd config デフォルト > /etc/containerd/config.toml

これにより、使用可能なすべての設定フィールドが設定され、新規インストールで 無効になる CRI サポートなどのいくつかの問題が解決されます。

次に、 /etc/containerd/config.toml /config.toml を開き、次の行を見つけます。

 SystemdCgroup = false

値を true に変更します。

 SystemdCgroup = true

この変更は、 systemd cgroup 管理の完全なサポートを有効にするために必要です。このオプションを使用しない場合、Kubernetes システム コンテナは 定期的に自身を再起動し ます。

変更を適用するには、containerd を再起動します。

 $ sudo サービスコンテナーの再起動

Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法

Kubeadm、Kubectl、および Kubelet のインストール

プロセスの 2 番目のフェーズは、Kubernetes ツールをインストールすることです。これら 3 つのユーティリティは、次の機能を提供します。

  • Kubeadm – クラスター レベルで動作する管理ツール。これを使用してクラスターを作成し、ノードを追加します。
  • Kubectl – Kubectl は、Kubernetes クラスターの実行後に対話するために 。
  • Kubelet – これは、クラスターのワーカー ノードで実行される 。コントロール プレーンとの接続を維持し、要求に応じて新しいコンテナを起動する役割を果たします。

3 つのバイナリは、Google Cloud がホストする Apt リポジトリで利用できます。まず、リポジトリの GPG キーリングを登録します。

 $ sudoカール -fsSLo /etc/apt/keyrings/kubernetes.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

次にリポジトリをソースに追加します…

 $ echo "deb [signed-by=/etc/apt/keyrings/kubernetes.gpg] https://apt.kubernetes.io/kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

…そしてパッケージリストを更新します。

 $ sudo aptアップデート

次に、パッケージをインストールします。

 $ sudo apt install -y kubeadm kubectl kubelet

apt upgrade 実行したときに Apt が自動的に更新しないように、これらのパッケージを「保持」することがベスト プラクティスです。ダウンタイムを防ぎ、望ましくない重大な変更を避けるために、Kubernetes クラスターのアップグレードは 手動で開始する必要があります

 $ sudo apt-markhold kubeadm kubectl kubelet 

Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法

スワップの無効化

スワップが有効になっている場合、Kubernetes は 機能しません 。クラスターを作成する前に、スワップをオフにする必要があります。そうしないと、Kubelet の起動を待機している間にプロビジョニング プロセスがハングすることになります。

次のコマンドを実行してスワップを無効にします。

 $ sudo スワップオフ -a

次に、 /etc/fstab ファイルを編集し、スワップ マウントを無効にします。

 UUID=ec6efe91-5d34-4c80-b59c-cafe89cc6cb2 / ext4 エラー=remount-ro 0 1

/swapfile なし スワップ sw 0 0

このファイルには、最後の行に swap タイプを含むマウントが表示されます。システムの再起動後もスワップが無効のままになるように、削除するかコメントアウトする必要があります。

Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法

br_netfilter モジュールのロード

br_netfilter カーネル モジュールは、 ブリッジされたトラフィックを認識できるようにするために必要です。このモジュールが欠落している場合、Kubeadm ではクラスターを作成できません。

次のコマンドを使用して有効にできます。

 $ sudo modprobe br_netfilter

システムのモジュール リストに含めることで、再起動後も持続するようにします。

 $ echo br_netfilter | sudo tee /etc/modules-load.d/kubernetes.conf 

Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法

クラスターの作成

Kubernetes クラスターを作成する準備ができました。コントロール プレーンをホストするマシン上で kubeadm init を実行します。

 $ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

--pod-network-cidr フラグが含まれているため、後でインストールされる Pod ネットワーク アドオンに 正しい CIDR 割り当て が利用可能になります。ほとんどの場合、デフォルト値の 10.244.0.0/16 で機能しますが、大幅にカスタマイズされたネットワーク環境を使用している場合は、範囲の変更が必要になる場合があります。

クラスターの作成が完了するまでに数分かかる場合があります。進捗情報が端末に表示されます。成功すると、次のメッセージが表示されます。

 Kubernetes コントロール プレーンが正常に初期化されました。

出力には、クラスターの使用を開始する方法に関する情報も含まれます。

Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法

Kubeconfig ファイルの準備

まず、自動生成された Kubeconfig ファイルを独自の .kube/config ディレクトリにコピーします。 Kubectl がファイルの内容を正しく読み取れるように、ファイルの所有権を自分に合わせて調整します。

 $ mkdir -p $HOME/.kube

$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法

ポッド ネットワーク アドオンのインストール

Kubernetes では、ワーカー ノードが正常に動作し始める前に、クラスター内にポッド ネットワーク アドオンが存在する必要があります。インストールを完了するには、 互換性のあるアドオンを 手動でインストールする必要があります。

キャリコ フランネルの 2 つが最も人気のある選択肢です。このガイドでは、インストールが簡単な Flannel を使用します。

Kubectl を使用して Flannel をクラスターに追加します。

 $ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

しばらく待ってから、ターミナルで kubectl get nodes を実行します。ノードが Ready として表示され、クラスターとの対話を開始できるようになります。

 $ kubectl ノードを取得

名前 ステータス 役割 年齢 バージョン

ubuntu22 対応コントロール プレーン 7m19s v1.25.0

kubectl get pods --all-namespaces を実行すると、コントロール プレーン コンポーネント、CoreDNS、および Flannel がすべて稼働していることがわかります。

 $ kubectl get ポッド --all-namespaces

名前空間名の準備完了ステータスが AGE を再開します

kube-flannel kube-flannel-ds-xlrk6 1/1 ランニング 5 (16 秒前) 11 分

kube-system coredns-565d847f94-bzzkf 1/1 実行中 5 (2 分 9 秒前) 14 分

kube-system coredns-565d847f94-njrdc 1/1 実行中 4 (30 秒前) 14 分

kube-system etcd-ubuntu22 1/1 実行中 6 (113 秒前) 13 分

kube-system kube-apiserver-ubuntu22 1/1 実行中 5 (30 秒前) 16 分

kube-system kube-controller-manager-ubuntu22 1/1 実行中 7 (3 分 59 秒前) 13 分

kube-system kube-proxy-r9g9k 1/1 実行中 8 (21 秒前) 14 分

kube-system kube-scheduler-ubuntu22 1/1 実行中 7 (30 秒前) 15 分

クラスターとの対話

これで、Kubectl を使用してクラスターと対話できるようになります。続行する前に、コントロール プレーン ノード上のデフォルトのテイントを削除して、ポッドがそのノードにスケジュールできるようにします。 Kubernetes は、リソースの競合を避けるために、コントロール プレーン ノードでポッドが実行できないようにしますが、この制限はローカルでの使用には不要です。

 $ kubectl taint ノード ubuntu22 node-role.kubernetes.io/control-plane:NoSchedule-

汚染されていないノード/ubuntu22

上記のコマンドの ubuntu22 を、独自のノードに割り当てられた名前に置き換えます。

次に、単純な NGINX ポッドを開始してみます。

 $ kubectl run nginx --image nginx:latest

ポッド/nginxが作成されました

を使用して公開します。

 $ kubectl Expose pod/nginx --port 80 --type NodePort

サービス/nginx が公開される

サービスに割り当てられたホスト ポートを見つけます。

 $ kubectl サービスを取得

名前 タイプ クラスター IP 外部 IP ポート 経過時間

kubernetes ClusterIP 10.96.0.1 <なし> 443/TCP 18m

nginx ノードポート 10.106.44.155 <なし> 80:30647/TCP 27s

ポートは 30647 です。このエンドポイントへの HTTP リクエストは、応答としてデフォルトの NGINX ランディング ページを発行するようになります。

 $カール http://localhost:30647

<!DOCTYPE html>

<html>

<頭>

<title>nginx へようこそ!</title>

Kubernetes クラスターは動作しています。

別のノードの追加

追加のワーカー ノードを構成するには、まず、使用する各マシンで「クラスターの作成」までのセクションのすべての手順を繰り返します。すべてのノードには、containerd、Kubeadm、および Kubelet がインストールされている必要があります。また、ノードがコントロール プレーンを実行しているマシンに完全にネットワーク接続されていることも確認する必要があります。

次に、新しいワーカー ノードで次のコマンドを実行します。

 kubeadm 参加 192.168.122.229:6443 \

–ノード名 ノードb \

–token <トークン> \

–discovery-token-ca-cert-hash sha256:<トークン-ca-cert-hash>

IP アドレスをコントロール プレーン ノードの IP アドレスに置き換えます。 <token> <token-ca-cert-hash> の値は kubeadm init を実行してコントロール プレーンを作成したときに表示されています。次の手順でそれらを取得できます。

トークン

コントロール プレーン ノードで kubeadm token list を実行します。トークン値は TOKEN 列に表示されます。

 $ kubeadmトークンリスト

トークン TTL の有効期限 使用法 説明 追加グループ

lkoz6v.cw1e01ckz2yqvw4u 23h 2022-09-14T19:35:03Z 認証、署名

トークン CA 証明書ハッシュ

次のコマンドを実行し、その出力を値として使用します。

 $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \

openssl dgst -sha256 -hex | sed の/^.* //’

クラスターへの参加

kubeadm join コマンドは、成功すると次の出力を生成するはずです。

 $ kubeadm 参加 192.168.122.229:6443 \

–ノード名 ノードb \

–token <トークン> \

–discovery-token-ca-cert-hash sha256:<トークン-ca-cert-hash>

[kubelet-start] kubelet を開始しています[kubelet-start] kubelet が TLS ブートストラップを実行するのを待機しています…

このノードはクラスターに参加しました:

* 証明書署名リクエストが apiserver に送信され、応答が受信されました。

* Kubelet には、新しい安全な接続の詳細が通知されました。

コントロール プレーンで「kubectl get Nodes」を実行して、このノードがクラスターに参加していることを確認します。

kubectl get nodes コマンドを実行して、ノードがクラスターに参加し、ポッドを受け取る準備ができていることを確認します。

 $ kubectl ノードを取得

名前 ステータス 役割 年齢 バージョン

ノード b 準備完了 <なし> 91s v1.25.0

ubuntu22 対応コントロール プレーン 100m v1.25.0

ノードがリストに表示され、ステータスとして Ready が表示されます。これは、それが動作可能であり、Kubernetes がそれにポッドをスケジュールできることを意味します。

まとめ

Kubernetes のセットアップは困難に思えるかもしれませんが、Kubeadm は難しい部分のほとんどを自動化します。まだいくつかの手順を実行する必要がありますが、開始する前に前提条件が満たされていることを確認しておけば、問題が発生することはありません。

ほとんどの問題は、使用可能なコンテナー ランタイムがない、 br_netfilter カーネル モジュールが見つからない、スワップが有効になっている、または Pod ネットワーク アドオンを提供する必要性が見落とされているために発生します。トラブルシューティングは、これらのよくある間違いを確認することから始める必要があります。

Kubeadm は、プロジェクト自体から Kubernetes の最新バージョンを直接提供します。単一のコマンドで単一ノードのクラスターを起動できる代替ディストリビューションも利用できます。 、 、および 3 つの人気のあるオプションです。これらは通常、セットアップとアップグレードが簡単ですが、アップストリームの Kubernetes と比較すると若干の違いがあります。 Kubeadm を使用すると、Kubernetes の内部動作に近づくことができ、さまざまな環境に適用できます。

「 Kubeadm と Kubectl を使用して Kubernetes クラスターを最初から開始する方法」に関するベスト動画選定!

Kubernetes kubelet kubeadm kubectl Installation and Configuration
初めてKubernetesクラスタを作る人のためのKubeadm入門