在 Kubernetes 上运行我的世界
2023-2-10 08:2:44 Author: Docker中文社区(查看原文) 阅读量:16 收藏

假期给小朋友装上了叨叨许久的 Minecraft(我的世界),为了体验安装的是 开源启动器 HMCL。其实这游戏我也关注比较久了,不过感觉太耗时间。但被小朋友拉上一起玩,便研究了下自建服务器。GitHub 发现已经有人做好了 Minecraft 服务端容器镜像,先是在 HomeLab 上用 Docker 部署,通过多人连线就能玩起来了。

由于不会玩几下被小朋友给打死,后来才发现还有“和平模式”。无聊转而研究下如何在公有云上部署:

  • 我的 HomeLab 常年运行,由于没有重要的数据,不管是对硬件稳定性和数据备份都没有投入,担心游戏数据丢失被埋怨。放在公有云上使用公有云的对象存储,避免数据丢失
  • 偶尔外出时玩的话,还需要 VPN 连回家才能玩
  • 他有朋友一起玩时还能方便联机
  • 最主要的原因还是去年加入微软 MVP 时,有送 Azure 的 credit,不用实属浪费

基于上面的原因,决定将服务器部署在 Azure 上,开一个 8c16g 的虚拟机并安装 k3s。数据呢,通过 blog-csi-driver 持久化存储在 Azure 的 Blob Storage 上。

开始吧!

安装 k3s

运行下面的命令进行安装,1.23 版本即可。

export INSTALL_K3S_VERSION=v1.23.8+k3s2
curl -sfL https://get.k3s.io | sh -s - --disable traefik --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config

k3s 安装之后,需要安装 blob storage 的 CSI 驱动。根据 文档说明 驱动要使用 v0.9.0 以上的版本,才能使用 存储账户 做动态配置。

安装 CSI 驱动

curl -skSL https://raw.githubusercontent.com/kubernetes-sigs/blob-csi-driver/v1.19.0/deploy/install-driver.sh | bash -s v1.19.0 blobfuse-proxy --

创建 StorageClass

先登录到 Azure Portal 在 存储账户 中创建账户,记得区域的选择和虚拟机相同;网络权限中选择只允许虚拟网络的访问。创建完成后,在账户的 访问秘钥 中可以获取到 key。

执行下面的命令,使用前面的账户名和 key 创建 secert。

kubectl create secret generic azure-secret --from-literal azurestorageaccountname=[ACCOUNT HERE] --from-literal azurestorageaccountkey=[KEY HERE] --type=Opaque

接下来就是使用该 secret 创建 StorageClass。

kubectl apply -f - <<EOF
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: blob-fuse
provisioner: blob.csi.azure.com
allowVolumeExpansion: true
parameters:
  csi.storage.k8s.io/provisioner-secret-name: azure-secret
  csi.storage.k8s.io/provisioner-secret-namespace: default
  csi.storage.k8s.io/node-stage-secret-name: azure-secret
  csi.storage.k8s.io/node-stage-secret-namespace: default
EOF

创建 PVC

有了 StorageClass 之后,就可以创建 PersistentVolumeClaim 了,指定使用上面的 StorageClass blob-fuse

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minecraft-pvc
spec:
  storageClassName: blob-fuse
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
EOF

部署 Minecraft 服务器

使用 Deployment 进行部署,并创建 NodePort Service。镜像使用 itzg/minecraft-server:java17,相关的配置可以参考 官方的文档(我怕再被打,启用了和平模式)。

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: minecraft
  name: minecraft
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minecraft
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: minecraft
    spec:
      containers:
      - image: itzg/minecraft-server:java17
        name: minecraft-server
        env:
        - name: EULA
          value: "TRUE"
        - name: ONLINE_MODE
          value: "FALSE"
        - name: DIFFICULTY
          value: peaceful
        - name: PVP
          value: "false"
        - name: UID
          value: "0"
        - name: GID
          value: "0"
        - name: MEMORY
          value: "4G"
        resources: {}
        ports:
        - containerPort: 25565
          protocol: TCP
        volumeMounts:
        - name: persistent-storage
          mountPath: /data
      volumes:
        - name: persistent-storage
          persistentVolumeClaim:
            claimName: minecraft-pvc
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: minecraft
  name: minecraft
spec:
  ports:
  - port: 25565
    protocol: TCP
    targetPort: 25565
  selector:
    app: minecraft
  type: NodePort
EOF

测试

启动客户端,在多人游戏中添加服务器:地址是虚拟机的公共 IP,端口是 Service 的 NodePort。

self-hosting-minecraft

接下来就可以愉快的玩耍了。

推荐阅读 点击标题可跳转

《Docker是什么?》

《Kubernetes是什么?》

《Kubernetes和Docker到底有啥关系?》

《教你如何快捷的查询选择网络仓库镜像tag》

《Docker镜像进阶:了解其背后的技术原理》

《教你如何修改运行中的容器端口映射》

《k8s学习笔记:介绍&上手》

《k8s学习笔记:缩扩容&更新》

《Docker 基础用法和命令帮助》

《在K8S上搭建Redis集群》

《灰度部署、滚动部署、蓝绿部署》

《PM2实践指南》

《Docker垃圾清理》

《Kubernetes(k8s)底层网络原理刨析》

《容器环境下Node.js的内存管理》

《MySQL 快速创建千万级测试数据》

《Linux 与 Unix 到底有什么不同?》

《浅谈几种常见 RAID 的异同》

《Git 笔记-程序员都要掌握的 Git》

《老司机必须懂的MySQL规范》

《Docker中Image、Container与Volume的迁移》

《漫画|如何用Kubernetes搞定CICD》

《写给前端的Docker实战教程》

《16个概念带你入门 Kubernetes》

《程序员因接外包坐牢456天,长文叙述心酸真实经历》

《IT 行业老鸟,有话对你说》

《HTTPS 为什么是安全的?说一下他的底层实现原理?


免责声明:本文内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系Docker中文社区!



文章来源: http://mp.weixin.qq.com/s?__biz=MzI1NzI5NDM4Mw==&mid=2247494485&idx=1&sn=41849e62a42876ba23ab6ec1e8e20cc8&chksm=ea1b0215dd6c8b030735f48eeb866e7080a2a88e67240c0d530c72d0dfc140cfd937e69eb434#rd
如有侵权请联系:admin#unsafe.sh