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、および 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
スワップの無効化
スワップが有効になっている場合、Kubernetes は 機能しません 。クラスターを作成する前に、スワップをオフにする必要があります。そうしないと、Kubelet の起動を待機している間にプロビジョニング プロセスがハングすることになります。
次のコマンドを実行してスワップを無効にします。
$ sudo スワップオフ -a
次に、
/etc/fstab
ファイルを編集し、スワップ マウントを無効にします。
UUID=ec6efe91-5d34-4c80-b59c-cafe89cc6cb2 / ext4 エラー=remount-ro 0 1
/swapfile なし スワップ sw 0 0
このファイルには、最後の行に
swap
タイプを含むマウントが表示されます。システムの再起動後もスワップが無効のままになるように、削除するかコメントアウトする必要があります。
br_netfilter モジュールのロード
br_netfilter
カーネル モジュールは、
ブリッジされたトラフィックを認識できるようにするために必要です。このモジュールが欠落している場合、Kubeadm ではクラスターを作成できません。
次のコマンドを使用して有効にできます。
$ sudo modprobe br_netfilter
システムのモジュール リストに含めることで、再起動後も持続するようにします。
$ echo br_netfilter | sudo tee /etc/modules-load.d/kubernetes.conf
クラスターの作成
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 コントロール プレーンが正常に初期化されました。
出力には、クラスターの使用を開始する方法に関する情報も含まれます。
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
ポッド ネットワーク アドオンのインストール
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 の内部動作に近づくことができ、さまざまな環境に適用できます。





