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 nodeskubectl 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を立ててみます。

>> Kubernetesを動かす(2) pod作成編

Linux,Ubuntu,Kubernetes