kubeadm を利用した Kubernetes クラスターの構築手順

Kubernetes コンポーネントと kubeadm の役割

Kubernetes クラスターは制御プレーンとデータプレーン(ワーカーノード)に分離され、各コンポーネントが相互に連携して運用されます。主な構成要素は以下の通りです。

  • マスタノード(制御プレーン): kube-apiserver、分散キーバリューストアである etcd、リソース配置決定を行う kube-scheduler、および Desired State の維持を行う kube-controller-manager で構成されます。
  • ワーカーノード: 個々のホスト上に kubelet と kube-proxy が常駐し、コンテナライフサイクルの管理とクラスター内部のネットワークルーティングを担当します。
  • 拡張モジュール: CoreDNS は内部 DNS レゾルバーとして機能し、CNI(Container Network Interface)対応プラグインが Pod 間のオーバーレイネットワーク基盤を提供します。

kubeadm は、これら多数のコンポーネントを手動でデプロイする煩雑さを解消するために設計された公式オーケストレーションツールです。証明書の自動生成、ボートストラップトークンの発行、必要なダウンスペックイメージの取得までを一括で処理し、再現性のあるクラスター構成を短時間で実現できます。

ホスト環境の事前準備

ここでは Ubuntu ベースの OS を対象に、クラスター要件を満たす環境を整備します。

ホスト名設定とスワップ切替

Kubernetes の kubelet サービスは、スワップ領域が有効なノードに対してエラーを返す仕様です。全ノードで以下の操作を実施してください。

# ホスト名の定義
hostnamectl set-hostname control-plane-01
hostnamectl set-hostname worker-node-01
hostnamectl set-hostname worker-node-02

# 現在アクティブなスワップを無効化し、fstab 内の設定もコメントアウトして再起動後も有効化しないようにする
swapoff -a
sed -i '/ swap / s/^\(.*\)/#\1/g' /etc/fstab

Docker CE ランタイムの導入

各ホストにコンテナ実行環境をインストールします。最新の安全な鍵管理方式を採用しています。

# 依存パッケージとシステムの更新
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# Docker 公式 GPG キーのリポジトリ保管場所への登録
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Docker リポジトリの定義
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# パッケージのインストールとサービス起動
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker

Kubernetes 関連ツールのインストール

クラスター管理に必要な CLI とエージェントをレジストリから取得します。

# Kubernetes 公式パッケージソースの設定
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

# kubelet などの取得と自動起動設定
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

クラスター構築プロセス

コントロールプレーンの初期化

制御担当ノードでクラスターの基盤を作成します。推奨される方法は、デフォルト設定を出力ファイル化した上で必要箇所のみ修正して実行することです。

# 初期化構成ファイルの生成
kubeadm config print init-defaults > init-config.yml

# 設定例: イメージソースを変更し、Pod 用サブネット範囲を明示する
# imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
# networking.podSubnet: 10.244.0.0/16

引数または構成ファイルを使用して初期化コマンドを実行します。

kubeadm init \
  --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address 192.168.1.100 \
  --kubernetes-version=v1.28.0

完了メッセージに従い、管理者権限をクライアントに割り当てます。

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

ワーカーノードのクラスター参加

初期化時に標準出力された kubeadm join コマンドをワーカーノード上で実行します。認証情報は期限付きであるため、失効した場合は再生成が必要です。

# マスタノード側で新しいジョイントコマンドを取得
kubeadm token create --print-join-command

# ワーカーノード側で実行
kubeadm join <control-plane-ip>:6443 --token <token-value> \
  --discovery-token-ca-cert-hash sha256:<cert-hash>

ノード参加後、同じ手順で admin.conf をワーカー側に転送し、遠隔操作環境を統一します。

CNI プラグインの適用

初期状態ではネットワークインターフェースが初期化されていないため、ノードステータスは NotReady です。Pod 間の通信路を確保するため、CNI マニフェストを適用します。

# Flannel ネットワークプラグインの適用
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

すべてのシステム POD が Running 状態に遷移し、ノードが Ready であることを確認します。

ワークロード展開とテスト

環境構築の確認として、標準的な Web サーバーをデプロイし外部からの到達性を検証します。ラベル設計は現行の Kubernetes 標準規格に合わせて調整しています。

# デプロイメント定義 (deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-web-app
  namespace: default
  labels:
    app.kubernetes.io/name: nginx
    app.kubernetes.io/version: latest
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: nginx
    spec:
      containers:
      - name: http-server
        image: docker.io/library/nginx:latest
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
# リソース群の反映
kubectl apply -f deployment.yaml

# NodePort 型サービスによりクラスター外部へポート開放
kubectl expose deployment sample-web-app --name=web-service --port=80 --target-port=80 --type=NodePort

タグ: kubeadm Kubernetes cni Docker kubelet

9月21日 22:49 投稿