Ubuntu 22.04におけるKubernetesクラスタのセットアップ手順

Kubernetes環境の準備

本ガイドでは、Ubuntu 22.04 LTSをベースとしたKubernetesクラスタの構築手順を解説します。以下の構成を前提としています。

ホスト名 構成 IPアドレス
jcl12 4C4G 192.168.10.12
jcl13 4C4G 192.168.10.13
jcl14 4C4G 192.168.10.14

システム設定の最適化

すべてのノード(マスターおよびワーカー)で以下の設定を実施します。

1. APTリポジトリの更新とパッケージのインストール

まず、システムのパッケージリポジトリを最新の状態に保ち、必要なツールをインストールします。

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release ntp

2. ホスト名の解決設定

各ノードで `/etc/hosts` ファイルを編集し、クラスタ内の全ノード間の名前解決を可能にします。

# /etc/hosts に以下の行を追加
sudo tee -a /etc/hosts <<EOF
192.168.10.12 jcl12
192.168.10.13 jcl13
192.168.10.14 jcl14
EOF

3. スワップ領域の無効化

Kubernetesはスワップ領域が有効になっていると正常に動作しないため、これを無効にします。

sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

4. IPv4フォワーディングの有効化

Pod間のネットワーク通信に必要なIPv4フォワーディングを有効にします。

sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
sudo sysctl --system

5. カーネルモジュールのロード

コンテナのネットワークとストレージに必要な overlaybr_netfilter モジュールをロードします。

sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
lsmod | grep br_netfilter # ロードされたことを確認

6. 時刻同期の設定

クラスタ内のすべてのノードで時刻同期をNTPサービスを使用して設定します。これにより、証明書の期限切れや通信の問題を防ぎます。

sudo timedatectl set-timezone Asia/Tokyo # または適切なタイムゾーンに設定
sudo systemctl enable --now ntp
sudo systemctl restart ntp

Kubernetesコンポーネントのインストール

ここでは、Container Runtime Interface (CRI) の実装であるcontainerd、ランタイムのrunc、およびネットワークプラグイン(CNI)をインストールします。

1. Containerdのセットアップ

containerdは、Kubernetesがコンテナを管理するために使用する標準的なコンテナランタイムです。

  • バイナリのダウンロードと配置

wget https://github.com/containerd/containerd/releases/download/v1.7.25/containerd-1.7.25-linux-amd64.tar.gz
sudo tar Cxvzf /usr/local containerd-1.7.25-linux-amd64.tar.gz
  • systemdサービスの設定

containerdをsystemdサービスとして登録し、自動起動するように設定します。containerd.serviceファイルをダウンロードし、適切な場所に配置します。

wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
sudo mv containerd.service /etc/systemd/system/containerd.service

# systemdに新しいサービスを認識させる
sudo systemctl daemon-reload
# containerdサービスを有効化し、起動する
sudo systemctl enable --now containerd
# バージョンを確認
ctr version
  • デフォルト設定ファイルの生成と変更

containerdのデフォルト設定ファイルを生成し、Cgroupドライバをsystemdに設定します。また、サンドボックスイメージも国内のミラーに変更します。

sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml

# 設定ファイルの編集 (SystemdCgroupをtrueに、サンドボックスイメージを変更)
sudo sed -i 's/SystemdCgroup\ =\ false/SystemdCgroup\ =\ true/g' /etc/containerd/config.toml
sudo sed -i 's|sandbox_image = "registry.k8s.io/pause:3.8"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"|g' /etc/containerd/config.toml

# 変更を反映するためcontainerdを再起動
sudo systemctl restart containerd
  • イメージレジストリミラーの設定

Docker Hubからのイメージプル速度を向上させるため、Containerdのイメージレジストリミラーを設定します。

sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo sed -i 's/config_path\ =.*/config_path = \"\/etc\/containerd\/certs.d\"/g' /etc/containerd/config.toml

sudo tee /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://docker.io"
[host."https://51bhdfwh.mirror.aliyuncs.com"] # ここを適切なミラーURLに置き換えてください
  capabilities = ["pull", "resolve"]
EOF

sudo systemctl restart containerd

2. runcのインストール

runcは、OCI (Open Container Initiative) ランタイム仕様に準拠した軽量なコンテナランタイムです。

wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64 # 最新安定版を使用
sudo install -m 755 runc.amd64 /usr/local/sbin/runc
runc -v # バージョンを確認

3. CNIプラグインのインストール

Kubernetes Podのネットワーク接続を可能にするCNI (Container Network Interface) プラグインをインストールします。

wget https://github.com/containernetworking/plugins/releases/download/v1.4.0/cni-plugins-linux-amd64-v1.4.0.tgz # 最新安定版を使用
sudo mkdir -p /opt/cni/bin
sudo tar Cxvzf /opt/cni/bin cni-plugins-linux-amd64-v1.4.0.tgz

4. crictlのインストール

crictlは、CRI互換ランタイム(containerdなど)と対話するためのコマンドラインツールです。

wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.28.0/crictl-v1.28.0-linux-amd64.tar.gz # 最新安定版を使用
sudo tar Cxvzf /usr/local/bin/ crictl-v1.28.0-linux-amd64.tar.gz

sudo tee /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
EOF
sudo systemctl restart containerd

Kubernetesコアコンポーネントのインストール

kubeadmkubeletkubectlをインストールします。

1. Kubernetes APTリポジトリの追加

KubernetesパッケージをダウンロードするためのAPTリポジトリを追加します。apt-key advは非推奨のため、新しい方法を使用します。

# Kubernetes GPGキーのダウンロードと追加
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.25/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# Kubernetes APTリポジトリの追加
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.25/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
sudo apt update

2. kubeadm, kubelet, kubectlのインストール

指定されたバージョン(ここでは1.25.3)のKubernetesツールをインストールします。

sudo apt install -y kubelet=1.25.3-00 kubeadm=1.25.3-00 kubectl=1.25.3-00
sudo apt-mark hold kubelet kubeadm kubectl

Kubernetesクラスタのデプロイ

ここからの手順は、マスターノード(jcl12)で実行します。

1. kubeadm設定ファイルの作成

kubeadmの初期化に使用する設定ファイルを生成し、クラスタの要件に合わせて編集します。

kubeadm config print init-defaults > kubeadm.yaml

kubeadm.yamlファイルを以下の内容に編集します。

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef  # 任意のユニークなトークンに変更することを推奨
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.10.12  # マスターノードのIPアドレス
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: jcl12  # マスターノードのホスト名
  taints: null
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers  # コンテナイメージのミラーレジストリ
kubernetesVersion: 1.25.3  # インストールするKubernetesのバージョンと一致させる
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16  # Flannelネットワークプラグインに適したPodネットワーク範囲
scheduler: {}
apiServer:
  timeoutForControlPlane: 4m0s
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd  # Containerdのcgroupドライバ設定と一致させる

2. コンテナイメージの事前ダウンロード

kubeadm initを実行する前に、必要なコンテナイメージをダウンロードしておきます。

sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.25.3

3. クラスタの初期化

作成した設定ファイルを使用してKubernetesクラスタを初期化します。

sudo kubeadm init --config kubeadm.yaml

初期化が成功すると、kubectlを使用するための設定と、ワーカーノードをクラスタに参加させるためのkubeadm joinコマンドが表示されます。これらの情報を必ず控えておいてください。

例えば、以下のような出力が得られます。

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

    kubeadm join 192.168.10.12:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:0fded521853e34ab9e11ea7b47d9c5ce5a363aeab91ec878b9ec1dfb90fd9026

4. kubectlのセットアップ

上記の出力に従い、通常のユーザーでkubectlコマンドが実行できるように設定します。

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

5. マスターノードの確認

kubectl get nodesコマンドで、マスターノードが正常にクラスタに参加していることを確認します。

kubectl get node

この時点では、マスターノードの状態がNotReadyと表示されることがあります。これはPodネットワークがまだデプロイされていないためです。

6. ワーカーノードをクラスタに参加させる

各ワーカーノード(jcl13, jcl14)で、マスターノードの初期化時に表示されたkubeadm joinコマンドを実行します。

sudo kubeadm join 192.168.10.12:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:0fded521853e34ab9e11ea7b47d9c5ce5a363aeab91ec878b9ec1dfb90fd9026

このコマンドの--token--discovery-token-ca-cert-hashは、お使いの環境で出力された値に置き換えてください。

7. クラスタの状態確認(マスターノードから)

すべてのワーカーノードがクラスタに参加した後、マスターノードから再度kubectl get nodesを実行して、全ノードが表示されることを確認します。

kubectl get node

Kubernetesネットワークのデプロイ

クラスタ内のPod間の通信を可能にするため、FlannelなどのPodネットワークプラグインをデプロイします。これはマスターノードから実行します。

1. Flannelの設定ファイルのダウンロードと適用

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

2. クラスタの状態確認

Flannelが正常にデプロイされると、各ノードの状態がReadyになり、Flannel Podも起動します。

# ノードの状態を確認
kubectl get node

# すべてのPodの状態を確認(特にkube-systemネームスペース)
kubectl get pod -A

# クラスタコンポーネントの状態を確認(このコマンドはK8sの新しいバージョンでは非推奨になる可能性があります)
kubectl get cs

コマンド補完機能の有効化

kubectlコマンドの利便性を高めるため、Bashのコマンド補完機能を設定します。

sudo apt install -y bash-completion
source /usr/share/bash-completion/bash_completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

タグ: Kubernetes Ubuntu 22.04 containerd kubeadm flannel

8月5日 13:47 投稿