前回はコントロールプレーンが稼働する予定のmaster-nodeと各種アプリケーションが稼働する予定のworker-nodeを作成しました。
今回はmaster-nodeでkubeadmを実行してkubernetesクラスターを立ち上げていきたいと思います。
構築手順
- containerdのインストール
- runCの設定
- CNIの設定
- cgroupの設定
- カーネルパラメータの設定(br_netfilterの有効化・iptablesの設定変更)
- swapの無効化
- kubelet/kubeadm/kubectlのインストール
- tcコマンドのインストール
- kubeadmでのkubernetesクラスターの作成
- Flannelを使用したCNIのセットアップ
Kubernetes環境構築(master node)
以下の作業はrootユーザーで作業するのでsudo su -
でrootユーザになって下さい。
sudo
をコマンドの先頭に付けての各ユーザでの実行でも問題ないです。
1. containerdのインストール
containerdとはコンテナイメージ管理などを行う高レベルランタイムでkubernetesからの指令をrunCなどの低レベルランタイムに指示する為に必要になります。
$ CONTAINERD_VERSION=1.7.11
$ wget -P /usr/local/src https://github.com/containerd/containerd/releases/download/v${CONTAINERD_VERSION}/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
$ tar -C /usr/local -xf /usr/local/src/containerd-${CONTAINERD_VERSION}-linux-amd64.tar.gz
$ wget -P /etc/systemd/system https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
$ systemctl daemon-reload
$ systemctl enable --now containerd
2. runCの設定
runCとはコンテナを実行する低レベルランタイムでcontainerdからの指令を受けコンテナの起動と動作を管理する為に必要となります。
$ RUNC_VERSION=1.1.10
$ wget -O /usr/local/sbin/runc https://github.com/opencontainers/runc/releases/download/v${RUNC_VERSION}/runc.amd64
$ chmod +x /usr/local/sbin/runc
3. CNI(Container Network Interface)の設定
CNIとは、コンテナランタイムがネットワークプラグイン(Flannelなど)と通信するためのインターフェースを提供します。
$ CNI_VERSION=1.4.0
$ wget -P /usr/local/src https://github.com/containernetworking/plugins/releases/download/v${CNI_VERSION}/cni-plugins-linux-amd64-v${CNI_VERSION}.tgz
$ mkdir -p /opt/cni/bin
$ tar -C /opt/cni/bin -xf /usr/local/src/cni-plugins-linux-amd64-v${CNI_VERSION}.tgz
4. cgroupの設定
cgroupとはプロセスをグループ化し、それぞれのグループに対してリソース使用量を制限することができるものです。
たとえば、あるコンテナプロセスがホストのリソースを食い潰し「サーバーダウン」みたいなことが起きないように管理してくれます。
$ mkdir /etc/containerd
$ containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
$ cp -p /etc/containerd/config.toml /etc/containerd/config.toml_`date +%Y%m%d`
$ sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
$ diff /etc/containerd/config.toml /etc/containerd/config.toml_`date +%Y%m%d`
$ systemctl restart containerd
5. カーネルパラメータの設定(br_netfilterの有効化・iptablesの設定変更)
各種カーネルモジュールの追加で、ファイルシステムの設定とネットワークブリッジ経由のトラフィックにiptablesの設定を適用されるようにします。
またiptablesにもネットワークブリッジを通過するトラフィックを処理するように設定します。
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
6. swapの無効化
公式ドキュメントに以下のように記載されている為OFFにします
kubeletが正常に動作するためにはswapは必ずオフでなければなりません。
# スワップの使用状況をデバイスごとに表示する
$ swapon -s
# スワップを無効にする
$ swapoff -a
7. kubelet/kubeadm/kubectlのインストール
$ cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.27/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
$ dnf upgrade -y
$ dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
$ systemctl enable --now kubelet
8. tcコマンドのインストール
dnf provides tc
dnf install iproute-tc
9. kubeadmでのkubernetesクラスターの作成
$ kubeadm init --pod-network-cidr=10.244.0.0/16
処理が正常終了すると以下のような情報が表示され、worker-nodeをクラスターに参加させる場合に必要なので必ずメモしておいて下さい。
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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 10.0.0.68:6443 --token fs17bk.dvd2qzb2ojz72z3d \
--discovery-token-ca-cert-hash sha256:05540afa85c20157edcf334471312a17f315e4eae860b3102252ba27735c5e4c
kube configの作成
クラスター操作をroot以外で実行したいのec2-userに切り替えて実施します。
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
10. Flannelを使用したCNのセットアップ
Flannelとは、CNIプラグインの一つでオーバレイネットワークアプローチが特徴的で、kubernetesクラスターの論理ネットワークを構成するのに必要。
※ ここからkubernetesとのやり取りになるのでec2-userで実行していきます。
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
構築後の確認
正常にクラスターが作成され動作しているかを確認します。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-node Ready control-plane 67s v1.27.8
$ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-p5hdv 1/1 Running 0 17m
kube-system coredns-5d78c9869d-ld2s8 1/1 Running 0 17m
kube-system coredns-5d78c9869d-lpvkb 1/1 Running 0 17m
kube-system etcd-master-node 1/1 Running 0 18m
kube-system kube-apiserver-master-node 1/1 Running 0 17m
kube-system kube-controller-manager-master-node 1/1 Running 0 18m
kube-system kube-proxy-j75p9 1/1 Running 0 17m
kube-system kube-scheduler-master-node 1/1 Running 0 17m
まとめ
今回はec2(Amazon Linux 2023)にkubernetesクラスターをkubeadmで構築してみました。
各種ミドルウエアの用途を調べながらで大変でしたが、kubernetesの仕組みへの理解が深まり良い勉強になりました。
次回はworker-node用として作成したEC2を設定し今回作成したmaster-nodeに紐付けてみたいと思います。
前回記事
参考リンク