Kubernetesクラスタを構築するには、まずDockerなどのコンテナランタイムをセットアップする必要があります。ファイアウォールとSELinuxを無効化し、Swapを停止します。また、各ノードに一意のホスト名を設定し、クラスタ内のノード間で名前解決ができるように/etc/hostsファイルを編集します。
IPテーブルによるブリッジIPトラフィックの透過を有効にするため、以下の設定を行います。
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
NTPクライアントをインストールし、時刻同期を設定します。
yum install ntpdate -y
ntpdate time.windows.com
Dockerをインストールします。バージョンによっては互換性の問題が発生する可能性があるため、公式にテスト済みのバージョン(例: 18.06)を使用することが推奨されます。必要に応じて、Docker Hubの代わりにアリババクラウドなどのコンテナレジストリミラーを設定します。
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
# アリババクラウドのミラー設定例
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
Kubernetesコンポーネントのインストール
Kubernetesのパッケージリポジトリを追加し、kubelet、kubeadm、kubectlをインストールします。バージョン間の互換性を保つため、特定のバージョンを指定してインストールすることが重要です。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum -y install kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
systemctl enable kubelet
kubeadmは、クラスタの初期化に必要なコンテナイメージを自動的にプルします。しかし、中国国内などのネットワーク環境では、デフォルトのコンテナレジストリ(k8s.gcr.io)へのアクセスが制限されている場合があります。この問題を回避するため、kubeadm initコマンド実行時に--image-repositoryオプションでアリババクラウドなどのアクセス可能なレジストリを指定します。
以下のコマンドで、指定したバージョンのKubernetesに必要なコンテナイメージをアリババクラウドからプルし、k8s.gcr.io配下にリタグします。
# イメージリスト取得とプル
kubeadm config images list --kubernetes-version v1.17.0 | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' | sh
# イメージタグの変更
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's/registry.cn-hangzhou.aliyuncs.com\/google_containers/k8s.gcr.io/2' | sh
# 元のイメージ削除 (任意)
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker rmi """$1""":"""$2}' | sh
クラスタの初期化
kubeadm initコマンドを実行して、Kubernetesマスターノードを初期化します。
kubeadm init \
--apiserver-advertise-address=192.168.1.5 \ # マスターノードのIPアドレス
--image-repository registry.aliyuncs.com/google_containers \ # 使用するコンテナレジストリ
--kubernetes-version v1.17.0 \ # Kubernetesのバージョン
--service-cidr=10.96.0.0/12 \ # ServiceのIPアドレスレンジ
--pod-network-cidr=10.244.0.0/16 \ # PodのIPアドレスレンジ
--ignore-preflight-errors=NumCPU # CPUコア数不足のエラーを無視する場合
初期化が完了すると、クラスタのコンテキスト設定方法と、他のノードをクラスタに参加させるためのコマンドが表示されます。表示された指示に従って、kubectlの設定ファイルを作成します。
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
ネットワークプラグインの導入
クラスタのPod間通信を確立するために、ネットワークプラグイン(CNI)を導入する必要があります。ここではWeave Netの例を示します。
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version --short | base64 | tr -d '\n')"
ノードの参加
他のワーカーノードをクラスタに参加させるには、マスターノードで生成されたkubeadm joinコマンドを使用します。トークンには有効期限があるため、期限切れの場合は新しいトークンを生成します。
# 新しいトークンを生成し、参加コマンドを表示
kubeadm token create --print-join-command
ノード参加時にcgroupfs関連のエラーが発生する場合、コンテナランタイムの設定でsystemd cgroup driverを使用するように変更する必要があります。
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
systemctl daemon-reload
systemctl restart docker</code>
変更後、再度ノード参加コマンドを実行します。