セルフホストでKubernetesを構築する #

実装について #

  • ハイパバイザ:ESXi
  • ホストOS:Ubuntu 22.04

実装の流れ #

  1. 仮想マシンの設定
  2. 全ノードで共通の設定をする
  3. 各ノードの設定をする
    1. Masterノードにて設定する
    2. Workerノードにて設定する

構成 #

  • Masterノード
    • ホスト名:lab-k8s-master-node
    • 構成:
      • vCPU:2
      • RAM:4GB
      • Disk:30GB
  • Workerノード
    • ホスト名:lab-k8s-worker-node01
    • 構成:
      • vCPU:2
      • RAM:4GB
      • Disk:30GB

1. 仮想マシンの設定

以下のように設定 20230606-BasicWebappTemplate_on_aws

2. 全ノードで共通の設定をする

  • 各ノードのホストを/etc/hostsに記載
root@lab-k8s-master-node:~# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 lab-k8s-master-node
192.168.100.81 lab-k8s-master-node # Masterノード
192.168.100.82 lab-k8s-worker-node01 # Workerノード
192.168.100.83 lab-k8s-worker-node02  # 今後追加予定のWorkerノード

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
  • swapを無効化
root@lab-k8s-master-node:~# swapoff -a
root@lab-k8s-master-node:~# sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
  • カーネルモジュールをロード
root@lab-k8s-master-node:~# tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
root@lab-k8s-master-node:~# modprobe overlay
root@lab-k8s-master-node:~# modprobe overlay
root@lab-k8s-master-node:~# tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
  • containerdをインストール、起動・永続化
root@lab-k8s-master-node:~# apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates
root@lab-k8s-master-node:~# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
root@lab-k8s-master-node:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
root@lab-k8s-master-node:~# apt update
root@lab-k8s-master-node:~# apt install -y containerd.io
root@lab-k8s-master-node:~# containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
root@lab-k8s-master-node:~# sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
root@lab-k8s-master-node:~# systemctl restart containerd
root@lab-k8s-master-node:~# systemctl enable containerd
  • Kubernetes関連のパッケージをインストイール
root@lab-k8s-master-node:~# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
root@lab-k8s-master-node:~# apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
root@lab-k8s-master-node:~# apt update
root@lab-k8s-master-node:~# apt install -y kubelet kubeadm kubectl
root@lab-k8s-master-node:~# apt-mark hold kubelet kubeadm kubectl

3. 各ノードの設定をする

3-1. Masterノードにて設定する

  • 以下k8sを初期化
    • ※ここで出力されるトークンを記録しましょう
root@lab-k8s-master-node:~# kubeadm init --control-plane-endpoint=lab-k8s-master-node
root@lab-k8s-master-node:~# mkdir -p $HOME/.kube
root@lab-k8s-master-node:~# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@lab-k8s-master-node:~# sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 以下のyamlファイルを実行してCalicoをローカルk8sにデプロイ
root@k8s-master:~# kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

3-2. Workerノードにて設定する

  • kubeadm join を実行(クラスタに参加)
kubeadm join k8s-master:6443 --token pg46jl.pvynngmtqsrukf6l --discovery-token-ca-cert-hash sha256:${"kubeadm init"実行時に出力されたトークン情報}

実装後 #

root@lab-k8s-master-node:~# kubectl get pod -A
NAMESPACE              NAME                                          READY   STATUS    RESTARTS   AGE
kube-system            calico-kube-controllers-6c99c8747f-4mvpd      1/1     Running   0          42h
kube-system            calico-node-d28wl                             1/1     Running   0          42h
kube-system            calico-node-d4gnf                             1/1     Running   0          42h
kube-system            coredns-5d78c9869d-ctnc5                      1/1     Running   0          43h
kube-system            coredns-5d78c9869d-fbsdf                      1/1     Running   0          43h
kube-system            etcd-lab-k8s-master-node                      1/1     Running   0          43h
kube-system            kube-apiserver-lab-k8s-master-node            1/1     Running   0          43h
kube-system            kube-controller-manager-lab-k8s-master-node   1/1     Running   0          43h
kube-system            kube-proxy-cwhfc                              1/1     Running   0          42h
kube-system            kube-proxy-gc97b                              1/1     Running   0          43h
kube-system            kube-scheduler-lab-k8s-master-node            1/1     Running   0          43h
kubernetes-dashboard   dashboard-metrics-scraper-764cf47594-l6vzg    1/1     Running   0          42h
kubernetes-dashboard   kubernetes-dashboard-68997bf576-vjgh2         1/1     Running   0          42h
root@lab-k8s-master-node:~# kubectl get node
NAME                    STATUS   ROLES           AGE   VERSION
lab-k8s-master-node     Ready    control-plane   43h   v1.27.2
lab-k8s-worker-node01   Ready    <none>          42h   v1.27.2
  • 今回はただk8sを建てただけなので、ここから様々なサービスを実装してみたい思います。

参考 #

How to Install Kubernetes Cluster on Ubuntu 22.04