在 Kubernetes 上运行《我的世界》

news2025/7/17 23:36:24

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

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

  • 我的 HomeLab 常年运行,由于没有重要的数据,不管是对硬件稳定性和数据备份都没有投入,担心游戏数据丢失被埋怨。放在公有云上使用公有云的对象存储,避免数据丢失

  • 偶尔外出时玩的话,还需要 VPN 连回家才能玩

  • 他有朋友一起玩时还能方便联机

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

开始吧!

微软MVP实验室研究员

张晓辉-微软 MVP

Flomesh 高级云原生架构师,资深程序员,LFAPAC 开源布道师,云原生社区管委会成员,公众号“云原生指北”作者。有多年的微服务和基础架构实践经验,主要工作涉及微服务、容器、Kubernetes、DevOps 等。

 

安装 k3s

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

export INSTALL_K3S_VERSION=v1.23.8+k3s2curl -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/v1kind: StorageClassmetadata:  name: blob-fuseprovisioner: blob.csi.azure.comallowVolumeExpansion: trueparameters:  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: defaultEOF

创建 PVC

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

kubectl apply -f - <<EOFapiVersion: v1kind: PersistentVolumeClaimmetadata:  name: minecraft-pvcspec:  storageClassName: blob-fuse  accessModes:    - ReadWriteMany  resources:    requests:      storage: 100GiEOF

部署 Minecraft 服务器

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

kubectl apply -f - <<EOFapiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: minecraft  name: minecraftspec:  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: v1kind: Servicemetadata:  labels:    app: minecraft  name: minecraftspec:  ports:  - port: 25565    protocol: TCP    targetPort: 25565  selector:    app: minecraft  type: NodePortEOF

测试

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

self-hosting-minecraft

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统(四):磁盘调度算法,先来先服务,最短寻道时间优先,电梯算法

文章目录一、磁盘结构二、先来先服务三、最短寻道时间优先四、电梯算法 SCAN一、磁盘结构 盘面&#xff08;Platter&#xff09;&#xff1a;一个磁盘有多个盘面&#xff1b; 磁道&#xff08;Track&#xff09;&#xff1a;盘面上的圆形带状区域&#xff0c;一个盘面可以有多…

大数据处理学习笔记1.2 Scala变量与数据类型

文章目录零、本讲学习目标一、变量声明&#xff08;一&#xff09;简单说明&#xff08;二&#xff09;利用val声明变量1、声明方式2、案例演示&#xff08;三&#xff09;利用var声明变量1、声明方式2、案例演示&#xff08;四&#xff09;换行输入语句&#xff08;续行&#…

生产故障|Kafka ISR频繁伸缩引发性能急剧下降

生产故障&#xff5c;Kafka ISR频繁伸缩引发性能急剧下降-阿里云开发者社区 本文是笔者双十一系列第二弹&#xff0c;源于一个双十一期间一个让笔者猝不及防的生产故障&#xff0c;本文将详细剖析Kafka的副本机制&#xff0c;以及ISR频繁变更(扩张与伸缩)为什么会导致集群不可…

深入浅出C++ ——queue类深度剖析

文章目录一、queue的简介二、queue类常用接口三、STL中queue类的模拟实现一、queue的简介 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器一端插入元素&#xff0c;另一端提取元素。队列作为容器适配器实现&#xff0c;容器适配…

【RNN详解】SimpleRNN,LSTM,bi-LSTM的原理及Tensorflow实现

目录1.摘要2.SimpleRNN2.1.原理介绍2.2.代码实现3.LSTM3.1.原理介绍3.2.代码实现4.LSTM改进—bi_LSTM5.总结感觉不错的话&#xff0c;记得点赞收藏啊。1.摘要 RNN是一种特殊的神经网络结构&#xff0c;它是根据“人的认知是基于过往的经验和记忆”这一观点提出的&#xff0c;它…

node.js+vue图书销售租赁书店运营管理系统mysql vscode

图书销售租赁书店运营管理系 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进行操作时本图书馆租赁管理系统主要分…

面向新手的git实战教程

嗨&#xff01;我是团子&#xff0c;大家好久不见呀~ 记得之前在网上学习git相关知识时&#xff0c;看到的文章大部分都是讲解git的基本命令有哪些&#xff0c;用处是什么&#xff0c;但是自己真正上手使用git时&#xff0c;仍然无从下手。 所以今天就想从初始化一个git仓库开始…

Quartz 快速入门案例,看这一篇就够了

前言 Quartz 是基于 Java 实现的任务调度框架&#xff0c;对任务的创建、修改、删除、触发以及监控这些操作直接提供了 api&#xff0c;这意味着开发人员拥有最大的操作权&#xff0c;也带来了更高的灵活性。 什么是任务调度&#xff1f; 任务调度指在将来某个特定的时间、固…

rabbitmq topic模式设置#通配符情况下 消费者队列未接收消息问题排查解决

目录说明说明 生产者配置 Exchange&#xff1a;topic_exchange_shcool Routing key&#xff1a;topic.shcool.# 消费者代码配置 Exchange&#xff1a;topic_exchange_shcool Routing key&#xff1a;topic.shcool.user PostConstructpublic void twoRabbitInit() {//声明交换…

基于微信小程序云开发实现考研题库小程序项目(完整版)

今天手把手的带大家实现一款答题类的题库小程序&#xff0c;如果着急的话&#xff0c;可以直接去看文末源码.下载与项目部署。考研题库小程序云开发实战&#xff0c;完整版提供给大家学习。题库小程序&#xff0c;基于云开发的微信答题小程序&#xff0c;软件架构是微信原生小程…

YOLOv8进行改进并训练自定义的数据集

一.训练数据集准备 YOLOv8的训练数据格式与YOLOv5的训练数据格式一致&#xff0c;这一部分可以进行沿用。之前博文有发布VOC标注格式转YOLO标注格式的脚本&#xff0c;有需要可以查看。 二.项目克隆 YOLOv8项目文件可以直接去github上下载zip文件然后解压&#xff0c;也可以直…

Telerik UI for WPF 2023 R1

Telerik UI for WPF 2023 R1 之 WPF 的 Telerik 用户界面&#xff0c;WPF 控件库开发人员信任&#xff0c;快速构建美观、高性能的 WPF 业务应用程序。现在支持 .NET 6 和 7.0。 概述部分背景图像 主要特征 现代专业主题图标&#xff0c;现代专业主题 通过各种受 Office、Wind…

【机器学习】P0 基础与相关名词

机器学习基础与相关名词什么是机器学习监督学习与非监督学习Classification And RegressionClusteringModel and Function什么是机器学习 机器学习是计算机发展到一定阶段的必然产物。相比于19世纪一个房间大小的计算机&#xff0c;当前的计算机更便携&#xff0c;性能更强&am…

开源项目-旅游信息管理系统

哈喽,大家好,今天给大家带来一个开源系统-旅游信息管理系统 前台 地址:http://ip/index 账号:user 密码:123456 后台 地址:http://ip/login 账号:root 密码:123456 功能模块:旅游路线、旅游景点、旅游酒店、旅游车票、旅游保险、旅游策略、订单管理、留言管理、数据…

一篇解决Linux 中的负载高低和 CPU 开销并不完全对应

负载是查看 Linux 服务器运行状态时很常用的一个性能指标。在观察线上服务器运行状况的时候&#xff0c;我们也是经常把负载找出来看一看。在线上请求压力过大的时候&#xff0c;经常是也伴随着负载的飙高。 但是负载的原理你真的理解了吗&#xff1f;我来列举几个问题&#x…

c/c++开发,无可避免的模板编程实践(篇二)

一、开发者需要对模板参数负责 1.1 为您模板参数提供匹配的操作 在进行模板设计时&#xff0c;函数模板或类模板一般只做模板参数&#xff08;typename T&#xff09;无关的操作为主&#xff0c;但是也不见得就不会关联模板参数自身的操作&#xff0c;尤其是在一些自定义的数据…

JVM基础学习

JVM分为两个子系统,两个组件一个子系统是Class loader类装载系统&#xff0c;另一个子系统是Execution Engine执行引擎一个组件是Runtime data area 运行时数据区&#xff0c;Native Interface 本地接口Class loader&#xff1a;根据给定的全限定类名来装载class文件到运行时数…

借助docker, 使用verdaccio搭建npm私服

为何要搭建npm私服 搭建npm私服好处多多&#xff0c;网上随便一篇教程搜出来都罗列了诸多好处&#xff0c;譬如: 公司内部开发环境与外网隔离&#xff0c;内部开发的一些库高度隐私不便外传&#xff0c;内网搭建npm服务保证私密性同属内网&#xff0c;可以确保使用npm下载依赖…

RPC技术选型

前言HTTP1.0 & HTTP1.1 & HTTP2.0 & RPCHTTP1.0无法复用连接HTTP1.0 协议时&#xff0c;HTTP 调用还只能是短链接调用&#xff0c;每次发送请求的时候&#xff0c;都需要进行一次TCP的连接&#xff0c;而TCP的连接释放过程又是比较费事的。这种无连接的特性会使得网…

金三银四跳槽季,JAVA面试撸题就来【笑小枫】微信小程序吧~

JAVA面试撸题就来【笑小枫】微信小程序啦~ 疫情已过&#xff0c;金三银四即将到来&#xff0c;小伙伴们是否有跳槽的打算呢&#xff1f;不管有没有&#xff0c;技术不能丢&#xff0c;让我们一起来撸题吧。 博主最近整理了一批面试题&#xff0c;包括JAVA基础、多线程与锁、Red…