0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EC2(Amazon Linux 2023)にkubeadmでkubernetesクラスターを構築してみる(master node編)

Posted at

前回はコントロールプレーンが稼働する予定のmaster-nodeと各種アプリケーションが稼働する予定のworker-nodeを作成しました。
今回はmaster-nodeでkubeadmを実行してkubernetesクラスターを立ち上げていきたいと思います。

構築手順

  1. containerdのインストール
  2. runCの設定
  3. CNIの設定
  4. cgroupの設定
  5. カーネルパラメータの設定(br_netfilterの有効化・iptablesの設定変更)
  6. swapの無効化
  7. kubelet/kubeadm/kubectlのインストール
  8. tcコマンドのインストール
  9. kubeadmでのkubernetesクラスターの作成
  10. 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に紐付けてみたいと思います。

前回記事

参考リンク

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?