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 クラスタが完成すると思います。