【自宅鯖】k8sインストール&マイクラ鯖実行メモ

記事内に広告が含まれています。
スポンサーリンク

環境・構成

Proxmoxが入ってる自宅鯖を使い、master,worker一組の構成を作ってマイクラ鯖を動かしました。

VM用意

ubuntuなVMを2つ用意。LVMは不使用としました。

ホスト名CPURAMディスクIPアドレス
k8s-m146GB12GB192.168.50.107
k8s-w146GB24GB192.168.50.108

インスコ&更新したら次へ

スワップ無効化

ここからの手順はmaster,worker両方で必要です

RAMは余裕があるのでスワップ無効化してディスクへの負荷を減らします。

さくらのクラウドUbuntu 20.04でスワップ領域を無効化する手順 / zembutsu | Qiita

$ sudo swapoff -a
$ sudo vim /etc/fstab

(略)
/swap.img      none    swap    sw      0       0
↓
#/swap.img      none    swap    sw      0       0

環境設定

以下を参考にして進めていきます

コンテナランタイム | Kubernetes

おうちクラウドにkubernetes環境を構築 / Nats72 | Qiita

Kubernetesクラスターを「クラウド↔自宅ネットワーク」間で作る(Tailscale編) / showchan33 | Qiita

kubeadmのインストール | Kubernetes

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を使います。

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] 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 install containerd.io

containerd config default | sudo tee /etc/containerd/config.toml

cgroupドライバーとしてsystemdを選択します。/etc/containerd/config.tomlに以下を追記します。

たぶんSystemdCgroup = falseがあると思うのでそこをtrueに書き換えてください

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true
$ sudo systemctl restart containerd

あんま理解が及んでいないのですが書いてあったのでとりあえずやりました(あほ)

本体と周辺ツール達

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

curl -fsSL https://dl.k8s.io/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | 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

マスターノードでの作業

マスターノード用VMでのみ、kubeadm側のcgroupドライバーも設定します。

その後設定を反映させて初期化します。kubeadm v1.22以降では、cgroupドライバーにはsystemdがデフォルトで使用されるようです。

(CentOS、RHEL、Fedoraでは/etc/sysconfig/kubeletを編集)

$ sudo vim /etc/default/kubelet

KUBELET_EXTRA_ARGS=--cgroup-driver=systemd

// [esc]:wq で保存&退出

$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

$ sudo kubeadm init --pod-network-cidr=192.168.2.0/24

cidrで指定してる範囲はルーターとかのやつとかぶっちゃダメです。うちの環境だと192.168.50.0/24ですね。被っちゃうと「インターネットこわれた」状態になります。(1敗)

...
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

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 192.168.50.107:6443 --token XXXXXXXXXXXXXX \
        --discovery-token-ca-cert-hash sha256:xxxxx...

処理が完了しました。

このVM上でkubectlを使いたい場合はTo start using your clusterのとこに書いてあるコマンドを実行すると使えるようになります。

それと、最後のkubeadm join ~はどっかにメモしておいてください。後で使います。

ワーカーノードでの作業

さっきメモったコマンドを実行します。多分sudo必要だと思います

CNIセットアップ

ノードを跨いだPod間通信のためにCNIが必要らしいです。CalicoというCNIを入れます

※マスターノードで作業

Quickstart for Calico on Kubernetes | Calico Documentation

デフォルトcidrは192.168.0.0/16なので、それ以外でkubeadm initしていれば書き換えが必要です。

$ kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
$ curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml > custom-resources.yaml
$ vim custom-resources.yaml

...
cidr: 192.168.2.0/24 //ここ書き換え
...

[esc]:wq
$ kubectl create -f custom-resources.yaml

しばらくするとNotReadyがReadyになります。

$ kubectl get node
NAME     STATUS   ROLES           AGE   VERSION
k8s-m1   Ready    control-plane   43m   v1.28.2
k8s-w1   Ready    <none>          25m   v1.28.2

$ kubectl get pod -n calico-system -o wide
NAME                                       READY   STATUS    RESTARTS   AGE     IP               NODE     NOMINATED NODE   READINESS GATES
calico-kube-controllers-8576448968-c8czh   1/1     Running   0          3m29s   192.168.42.130   k8s-m1   <none>           <none>
calico-node-5wcl7                          1/1     Running   0          3m31s   192.168.50.107   k8s-m1   <none>           <none>
calico-node-xcx84                          1/1     Running   0          3m31s   192.168.50.108   k8s-w1   <none>           <none>
calico-typha-7485679f59-gdd2l              1/1     Running   0          3m31s   192.168.50.108   k8s-w1   <none>           <none>
csi-node-driver-ghq7v                      2/2     Running   0          3m30s   192.168.42.129   k8s-m1   <none>           <none>
csi-node-driver-rjl4h                      2/2     Running   0          3m30s   192.168.228.65   k8s-w1   <none>           <none>

これで構築作業は終了です。

マイクラ鯖実行

こちらを参考にしました。

KubernetesでMinecraftサーバーを構築してみた / だだっこぱんだ | Zenn

この方がマニフェストを公開してくださっていたので使わさせていただきたいと思います。

https://github.com/dn5-run/k8s/tree/main/manifests/sasa/minecraft/main

main配下のファイル、namespace.yml、metallb.ymlをコピーしてきて

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml

$ vim metallb.yml

// アドレス変更
# - 192.168.1.210-192.168.1.220
- 192.168.50.210-192.168.50.220

$ kubectl apply -f metallb.yml

$ kubectl apply -f namespace.yml
$ vim deployment.yml

// env:以下にEULA=trueを追記
 - name: EULA
   value: "true"

$ kubectl apply -f deployment.yml
$ kubectl apply -f pvc.yml
$ kubectl apply -f pv.yml
$ vim service.yml

// クラスタ外からアクセスできるようにする
// 参考:https://jisaba.life/2023/11/04/kubernetes-で-minecraft-server-を設置する(その5)/
...
spec:
  type: LoadBalancer
  loadBalancerIP: 10.1.11.11    # IPアドレスの固定化
  ports:
...

$ kubectl apply -f service.yml

$ kubectl get pods --namespace=sasa
NAME                              READY   STATUS              RESTARTS   AGE
minecraft-main-5fb6c4d7fb-djmvj   0/1     ContainerCreating   0          54s

$ kubectl describe pods -n sasa

※うちにはNFSサーバーはないので、pv.ymlをローカルストレージ用に書き換えました

NFSサーバーがある場合はこちらも参考に→

nfsサーバを構築しKubernetesからストレージとして利用してみた – DENET 技術ブログ

#spec:
#  storageClassName: minecraft-main
#  volumeMode: Filesystem
#  accessModes:
#    - ReadWriteMany
#  capacity:
#    storage: 5Gi
#  nfs:
#    path: /exports/fast-drive-02/k8s/sasa/minecraft/main
#  persistentVolumeReclaimPolicy: Delete
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mcdata
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-w1

すでにpv作っちゃってて消せなかったので、↓を参考にして削除しました。

PersistentVolume(pv)を削除しようとしたらステータスがTerminatingから変化しない問題が発生した

メモ

Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
To see the stack trace of this error execute with --v=5 or higher

コンテナランタイム?が複数あるよ!って言われたら指定してあげる。

sudo kubeadm init --pod-network-cidr=192.168.2.0/24 --cri-socket=unix:///var/run/cri-dockerd.sock

メモ

ログ,pod再起動,pods監視

kubectl logs minecraft-main-xxxxxxxxxxxx-xxxxx --namespace=hoge

kubectl rollout restart deploy minecraft-main-xxxxxxxxxxxx-xxxxx --namespace=hoge

watch kubectl get pods --namespace=hoge

コメント

タイトルとURLをコピーしました