環境・構成
Proxmoxが入ってる自宅鯖を使い、master,worker一組の構成を作ってマイクラ鯖を動かしました。
VM用意
ubuntuなVMを2つ用意。LVMは不使用としました。
| ホスト名 | CPU | RAM | ディスク | IPアドレス | 
| k8s-m1 | 4 | 6GB | 12GB | 192.168.50.107 | 
| k8s-w1 | 4 | 6GB | 24GB | 192.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環境を構築 / Nats72 | Qiita
Kubernetesクラスターを「クラウド↔自宅ネットワーク」間で作る(Tailscale編) / showchan33 | Qiita
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.tomlcgroupドライバーとして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/24cidrで指定してる範囲はルーターとかのやつとかぶっちゃダメです。うちの環境だと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
この方がマニフェストを公開してくださっていたので使わさせていただきたいと思います。
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
  
  
  
  
コメント