Kubernetesを動かす(1) k8sインストール編
Ubuntu22.04LTS + Kubernetes1.28.3
人も登録できるMisskeyサーバーを立てたいな~という気持ちが湧いてきたのでとりあえずKubernetes(k8s)を仮想環境で試そう!というコーナーです。
構想としては
- マスター1台、ワーカー3台
- rook/cephで分散ストレージクラスを作る
- PosgreSQLはCrunchy PGOでバックアップ周りや自動フェイルオーバーを、pgpool-IIで負荷分散を行う
- pgroonga拡張の導入
- Ingressで証明書周りの設定
あたりを色々試したいです。
PostgreSQLのチューニングなどは本番環境を動かしてから弄ると思うので、とりあえずk8sの構成のyamlファイルを書いたりなどざっくりと勉強したいです。
Windows上のHyper-Vで仮想マシンを作成しました。
- 192.168.87.10 master
- 192.168.87.11 worker1
- 192.168.87.12 worker2
- 192.168.87.13 worker3
の構成です。
最初に
k8sはスワップ領域があるとエラーを起こすので、スワップ領域を使用していれば削除します。
sudo swapoff -a
さらにsudo vi /etc/fstab
コマンドでスワップイメージを作成する行があればコメントアウトします。これで再起動してもスワップ領域が作成されなくなります。
Kubernetesのインストール
Ubuntuのインストールが完了してアップデートが終わったら、各マシンへKubernetesツールとDockerをインストールします。
Kubernetesツール(kubelet, kubeadm, kubectl)のインストール
公式ドキュメントを参考にインストールします。
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl gpg curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | 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
Dockerインストール
公式ドキュメントを参考にインストールします。
sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
containerdの設定
Dockerインストール時にcontainerd.ioも一緒にインストールするため新たにインストールは不要です。
公式ドキュメントを参考に
まずIPv4フォワーディングなどを設定
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo 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 sudo sysctl --system
containerdのデフォルト設定を適用
# defaultファイルをコピー containerd config default | sudo tee /etc/containerd/config.toml sudo vi /etc/containerd/config.toml
上記で開いたファイルの下記部分を修正
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] ... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true
更新したらcontainerdサービスを再起動
sudo systemctl restart containerd
kubeletツールにも適用、下記で開いて
sudo vi /etc/sysconfig/kubelet
下記に修正
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
サービスの再起動
sudo systemctl daemon-reload sudo systemctl restart kubelet
ここまでをすべてマスター、ワーカーのマシン全てにインストールします。
マスターノードの作成
masterマシンにログインし、下記でマスターノードを作成します。
sudo vi kubeadm-config.yaml
で設定ファイルを作成、下記を入力
kubeadm-config.yaml
--- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: "v1.28.3" controlPlaneEndpoint: "192.168.87.10:6443" networking: podSubnet: "10.244.0.0/16" apiServer: extraArgs: "advertise-address": "192.168.87.10" --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: "systemd"
apiserver-advertise-address
を設定していないと複数IPが割り当てられている場合に違うIPの証明書が出てしまう場合があるのでmasterの固定IPをセットしておきます。
作った設定ファイルを使用してkubeadm init
でクラスターを作成
sudo kubeadm init --config=kubeadm-config.yaml
成功すると最後に下記メッセージが出てくるのでメモしておきます。ワーカーノードを接続するときに使います。
Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.50.10:6443 --token yreoya.hnw(略)98w4 \ --discovery-token-ca-cert-hash sha256:a52b8d0fb6863d28e(略)1900faeb66d6a77d0424
公式ドキュメントを参考に初期設定をします
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=$HOME/.kube/config
rootユーザーでないので$HOME
を環境変数に設定しています。
それからPodのネットワークコントロールとして何か色々あるみたいですがよく目にするflannelをデプロイします。
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
kubectl get nodes
、kubectl get pods --all-namespaces
でノードとPodを確認してみます。動いてますね🎉
noct@master:~$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-flannel kube-flannel-ds-v5cdb 1/1 Running 0 9m25s kube-system coredns-5dd5756b68-wlsh6 1/1 Running 0 9m44s kube-system coredns-5dd5756b68-x5r55 1/1 Running 0 9m44s kube-system etcd-master 1/1 Running 0 9m57s kube-system kube-apiserver-master 1/1 Running 0 9m56s kube-system kube-controller-manager-master 1/1 Running 0 9m56s kube-system kube-proxy-p2jlr 1/1 Running 0 9m44s kube-system kube-scheduler-master 1/1 Running 0 9m56s
ワーカーノードの作成
さらに各ワーカーノードで正しい固定IPを使用したいので下記ファイルを作成します。
sudo mkdir -p /etc/systemd/system/kubelet.service.d/ sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
作成した10-kubeadm.conf
へ下記を記入します。--node-ip
は各マシンのIPへ変更します。
[Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml --node-ip=192.168.87.11" ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_EXTRA_ARGS
保存したら下記コマンドでkubeletを再起動します。
sudo systemctl daemon-reload sudo systemctl restart kubelet
worker1, worker2それぞれでマスターノード作成時にメモしたコマンドを実行します。(sudoコマンドをつけてね)
sudo kubeadm join 192.168.50.10:6443 --token yreoya.hnw(略)98w4 \ --discovery-token-ca-cert-hash sha256:a52b8d0fb6863d28e(略)1900faeb66d6a77d0424
成功するとメッセージが出ます。
kubectl get nodes
コマンドでワーカーノードが確認出来れば成功です。
完了🎉
お疲れさまでした!
つまづいたメモ
- 日本語ドキュメントの方だとインストールされるk8sがちょっと古かった
- containerd周りで設定する部分が公式ドキュメント(英語の方も)不足気味かも
- master, worker共に自分のIPをvagrantのNATの10.0.2.15だと認識してしまっていたのでマスターは
kube init
の--apiserver-advertise-address
オプション、ワーカーは/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
でIPを指定してあげないといけなかった
次回はpodを立ててみます。