x86_64環境でKuberenetesクラスタを構築する


システム構成

ソフトウェア 構成

項目 ソフトウェア バージョン
OS Ubuntu 20.04.4 LTS
Kubernetes kubeadm,kubectl,kubelet 1.24.2
CRI copntainerd 1.6.6
CNI Calico 3.23.2

Kubernetes 構成

今回は Master ノード 1 台、Worker ノード 2 台で構築する。

ホスト名 IP アドレス ロール
k8s-node-01 10.0.0.111 Master
k8s-node-02 10.0.0.112 Worker
k8s-node-03 10.0.0.113 Worker

インストール 手順

OS のインストール

Kubernetes を構築する人にとっては、OS のインストールは簡単にできると思うので、割愛する。

前提条件と事前準備

/etc/hosts にホスト名を登録

cat <<EOF | sudo tee -a /etc/hosts
# K8sホスト
10.0.0.111 k8s-node-01
10.0.0.112 k8s-node-02
10.0.0.113 k8s-node-03

EOF

swap を無効化

/etc/fstabを編集して swap の行をコメントアウトし、無効化する

sudo swapoff -a

swapoffで、swapを無効化出来る。

コンテナランタイムのインストール

公式ドキュメント

今回は、コンテナランタイムにcontainerdを使用する

カーネルモジュール&カーネルパラメータを変更

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Setup required sysctl params, these persist across reboots.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

リポジトリを登録し、containerdをインストール

sudo apt-get update

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.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 containerd.io

kubelet kubeadm kubectlのインストール

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# cgroup-driver を systemd に設定する
cat <<EOF | sudo tee /etc/default/kubelet
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
EOF

containterdのバグでkubeletが起動しない場合は、これを試す

詳細は、この Issueを確認してね

sudo mv /etc/containerd/config.toml /etc/containerd/config.toml.bak
systemctl restart containerd

再起動

sudo reboot

Kubernetes のインストール

ここから Master ノード と Worker ノード で行う作業が異なるので注意すること。

kubeadm init

Master ノード のみ

kubeadm init が成功したら、worker ノードで使用するkubeadm join コマンドが出力されるのでメモしておく必要がある。

sudo kubeadm init --apiserver-advertise-address=10.0.0.111 --control-plane-endpoint 10.0.0.111:6443 --pod-network-cidr=192.168.0.0/16 --cri-socket=/run/containerd/containerd.sock

kubeadm join

Worker ノード のみ

sudo ubeadm join 10.0.0.111:6443 --token xxxxxxxxxxx... \
	--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....

kubectl を使えるように環境変数を読み込む

Master ノード上で行う。


# 一般ユーザはこっち
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# rootユーザはこっち
export KUBECONFIG=/etc/kubernetes/admin.conf

参加できたか確認する

$ kubectl get node

# NAME          STATUS   ROLES           AGE     VERSION
# k8s-node-01   Ready    control-plane   3d20h   v1.24.2
# k8s-node-02   Ready    <none>          3d20h   v1.24.2
# k8s-node-03   Ready    <none>          3d20h   v1.24.2

CNI のインストール

公式ドキュメント

1. calico をダウンロード

curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O

2. Calico の設定

変更する場合は、calico.yamlを編集する

  • Pod-network-cidr を変更する
    • デフォルトは、192.168.0.0/16
# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"
- name: CALICO_IPV4POOL_CIDR
  value: "172.16.0.0/16
  • IPIP トンネリングを無効化する
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
  #value: "Always"
  value: "Never"

3. Calico のデプロイ

$ kubectl apply -f calico.yaml

終わりに

これで、一通り動く Kuberenetes クラスタが完成すると思います。