Kubernetesクラスタの構築において、kubeadmは公式が推奨するシンプルで再現性の高い手法です。本記事では、3台のCentOS 7マシンを用いて、1つのマスターノードと2つのワーカーノードからなる非HAクラスタを構築するための手順を段階的に解説します。各ステップは実際の運用環境でも適用可能な形で設計されています。
kubeadmとは
kubeadmは、Kubernetesクラスタの初期化とノードの参加を簡易化するコマンドラインツールです。主な機能は以下の2つに集中しています:
- kubeadm init:マスターノードを初期化し、APIサーバー、etcd、コントロールプレーンコンポーネントを起動
- kubeadm join:ワーカーノードを既存クラスタに参加させる
その他のコマンド(upgrade、reset、configなど)は、アップグレードやトラブルシューティングを補助するための補助機能であり、クラスタの本体構築には必須ではありません。kubeadmは「クラスタの起動」に特化しており、ネットワークプラグインのインストールや監視ツールの設定は別途行う必要があります。
kubeletの役割
kubeletは、各ノード上で動作するエージェントで、Kubernetes APIから受信したPodの定義に基づき、実際のコンテナの起動・停止・監視を行います。主な機能は以下の通りです:
- Podのライフサイクル管理(コンテナの作成・削除)
- ヘルスチェック(liveness/readiness探査)
- リソース使用状況の収集と報告
kubeletは、Kubernetesが管理しないコンテナ(例:手動でdocker runしたコンテナ)には一切関与しません。したがって、クラスタ構築前にノード上に不要なコンテナを残さないことが重要です。
クラスタ構成の設計
本構成では、以下の3台の仮想マシンを用います。
| ホスト名 | OS | IPアドレス | リソース | 役割 |
|---|---|---|---|---|
| k8s-master | CentOS 7 x86_64 | 172.16.2.201 | 2CPU / 2GB | マスターノード |
| k8s-worker1 | CentOS 7 x86_64 | 172.16.2.202 | 2CPU / 2GB | ワーカーノード |
| k8s-worker2 | CentOS 7 x86_64 | 172.16.2.203 | 2CPU / 2GB | ワーカーノード |
前提条件:
- 全ノード間でIPレベルの通信が可能(ファイアウォールは後述)
- 各ノードにroot権限またはsudo権限を付与
- メモリは2GB以上、CPUは2コア以上
- すべてのノードでSELinuxを無効化し、swapをオフにする
- クラスタ内PodのCIDR:10.244.0.0/16
- Kubernetesバージョン:v1.15.0
- APIサーバー広告アドレス:172.16.2.201
ノードの基本設定
1. ホスト名とDNS設定
マスターノード(k8s-master)での設定例:
# ホスト名の設定
hostnamectl set-hostname k8s-master
# /etc/hostsにローカルエントリを追加
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 k8s-master
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.2.201 k8s-master
172.16.2.202 k8s-worker1
172.16.2.203 k8s-worker2
EOF
ワーカーノードでも同様にホスト名とhostsファイルを設定します。
2. ネットワーク設定(静的IP)
ネットワークインターフェースの設定ファイルを編集します(eth0を対象):
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
DEVICE=eth0
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
IPADDR=172.16.2.201
NETMASK=255.255.255.0
NETWORK=172.16.2.0
GATEWAY=172.16.2.254
DNS1=172.16.2.254
DNS2=114.114.114.114
EOF
# ホスト名をネットワーク設定にも反映
echo "NETWORKING=yes" > /etc/sysconfig/network
echo "HOSTNAME=k8s-master" >> /etc/sysconfig/network
# DNS設定
echo "nameserver 172.16.2.254" > /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
# サービス再起動
systemctl restart network && systemctl status network
3. システムパラメータの調整
# SELinuxの無効化
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# swapの無効化(一時的)
swapoff -a
# swapの永続的な無効化
sed -i '/swap/s/^/#/' /etc/fstab
# カーネルパラメータの設定
cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
EOF
sysctl --system
Dockerのインストールと設定
KubernetesはDockerをコンテナランタイムとして利用します。公式推奨バージョンを明示的にインストールします。
# 必要パッケージのインストール
yum install -y yum-utils device-mapper-persistent-data lvm2
# Docker CEリポジトリの追加
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 指定バージョンのインストール
yum install -y docker-ce-18.06.2.ce
# Dockerデーモン設定
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
EOF
# サービスの有効化と起動
systemctl daemon-reload
systemctl enable docker
systemctl restart docker
ポート開示とファイアウォール
マスターノードに開けるポート
| 協議 | 方向 | ポート | 機能 |
|---|---|---|---|
| TCP | 入力 | 6443 | Kubernetes APIサーバー |
| TCP | 入力 | 2379–2380 | etcdクライアントAPI |
| TCP | 入力 | 10250 | kubelet API |
| TCP | 入力 | 10251 | kube-scheduler |
| TCP | 入力 | 10252 | kube-controller-manager |
ワーカーノードに開けるポート
| 協議 | 方向 | ポート | 機能 |
|---|---|---|---|
| TCP | 入力 | 10250 | kubelet API |
| TCP | 入力 | 30000–32767 | NodePortサービス |
CentOS 7ではiptablesがデフォルトでインストールされていないため、以下でインストール・有効化を行います:
yum install -y iptables-services
systemctl enable iptables
systemctl start iptables
その後、/etc/sysconfig/iptablesに必要なルールを手動で追加するか、開発環境では以下のように一時的にファイアウォールを無効化できます:
systemctl stop firewalld
systemctl disable firewalld
注意:本設定は実稼働環境では推奨されません。セキュリティポリシーに従い、必要なポートのみを開けてください。