環境・構成
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.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
この方がマニフェストを公開してくださっていたので使わさせていただきたいと思います。
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
コメント