上篇介绍了k8s集群的搭建,这一篇就主要介绍怎么运行agones提供的unity3d示例。
一、环境准备
打开110虚拟机,为了操作简单,我就直接用root用户操作了,创建一个目录,下面所有的操作都在这个目录下完成
$ mkdir /root/kubernetes
$ cd /root/kubernetes
二、在k8s集群中安装agones
官方提供了两种方式安装agones,yaml配置文件和helm,这儿直接通过yaml配置文件的方式安装。
1、创建agones-system命名空间
$ kubectl create namespace agones-system
2、apply配置文件,成功后会发现集群中多了几个以agones开头命名的pod
$ kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.9.0/install/yaml/install.yaml
![301e2fec2c3a4f23904525fae6efb88a.png](https://i-blog.csdnimg.cn/blog_migrate/407b5a5bdc212ac2a8b4674236cc13c8.jpeg)
如果在apply的过程中发现访问不了这个资源,可以直接在windows浏览器中打开这个资源,然后ctrl+s保存到本地文件install.yaml,用WinSCP将文件拷贝到“/root/kubernetes”目录,然后输入命令:
$ kubectl apply -f install.yaml
三、制作unity-simple-server镜像
从github克隆 agones项目到windwos宿主机上,进入“agones/examples/unity-simple”示例目录,README.md文件有详细的说明,这里只做简单的记录,其中1到5步可以直接在windows上完成,第6步需要在110虚拟机上完成。制作完成后的镜像我已经上传到Docker Hub上面,可以直接通过“docker pull guozhulei/unity-simple-server:0.3”命令获取。
1、用2018.4.2f1或者更高版本的unity打开这个示例,点击“Build Tool->Build Server”编译linux版本的服务器,这时会在示例目录下创建一个“Builds”目录,
![d6a70581664b78cd8061a16a3a1a27ba.png](https://i-blog.csdnimg.cn/blog_migrate/bc2a8da5a8bca9d414d7dda6c03a4cfb.png)
2、由于我是用的Docker Hub存放docker镜像,需要修改示例的Makefile文件,把仓库地址改为自己的私有地址,修改后的Makefile文件为:
REPOSITORY = guozhulei
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
project_path := $(dir $(mkfile_path))
server_tag = $(REPOSITORY)/unity-simple-server:0.3
build-image:
docker build $(project_path) --tag=$(server_tag)
# check if hosted on Google Cloud Registry
gcr-check:
gcloud container images describe $(server_tag)
3、修改示例的Dockerfile文件为:
FROM ubuntu:18.04
WORKDIR /unity
# Need to build with UnityEditor in advance.
COPY Builds/Server/ ./
# [Workaround] Wait until the sidecar is ready.
CMD sleep 2
CMD chmod +x ./UnitySimpleServer.x86_64
CMD ./UnitySimpleServer.x86_64
4、修改gameserver.yaml文件为:
apiVersion: "agones.dev/v1"
kind: GameServer
metadata:
generateName: "unity-simple-server-"
spec:
ports:
- name: default
portPolicy: Dynamic
containerPort: 7777
template:
spec:
containers:
- name: unity-simple-server
image: guozhulei/unity-simple-server:0.3
resources:
requests:
memory: "128Mi"
cpu: "128m"
limits:
memory: "128Mi"
cpu: "128m"
5、将Makefile文件、Dockerfile文件、gameserver.yaml文件、Builds文件夹,用WinSCP拷贝到“/root/kubernetes”目录,文件名或者文件夹名不能变。
6、生成docker镜像,并上传docker镜像到私有云
$ make build-image
$ docker push guozhulei/unity-simple-server:0.3
四、运行示例
1、运行服务器
$ kubectl create -f gameserver.yaml
![2c7aad4bb8d63a1251c72f7780522f6b.png](https://i-blog.csdnimg.cn/blog_migrate/95f4155468a3642f00278eeb1c2e3c04.png)
用“kubectl get pods”命令可以看到是“ContainerCreating”,创建完成后就是“Running”状态。
2、等到创建完成后,查看服务器连接地址和端口号
$ kubectl get gs
![4904f68af9c0001eb98509d4f3e8b490.png](https://i-blog.csdnimg.cn/blog_migrate/3799523d593c6c74f23110e0897a0461.png)
3、在unity编辑器上编译客户端,依次点击“Build Tool->Build Client”,生成成功后打开客户端“agonesexamplesunity-simpleBuildsClientUnitySimpleClient.exe”,按照下图中标记的顺序依次操作,如果能看到服务器的返回,说明客户端和服务器通信成功
![5a6ca0222ee350a9fa20ff18bdbb6d75.png](https://i-blog.csdnimg.cn/blog_migrate/5f4ade550882c15d7b753c692c1e16e3.jpeg)
五、遇到的问题
1、在用unity编辑器打开示例的时候,发现cs脚本都只引用了一个路径,会报错,按照引用的路径把对应的文件拷贝到对应的位置就可以了。
2、在unity编辑器编译服务器的时候,因为我用了更高版本的编辑器,导致有些命名空间不对,直接按照对应的提示把不必要的代码全部删除了。
3、在“四-1”这步运行服务器的时候,发现服务器的状态一直是“CrashLoopBackOff”
![10c6fed3737d68ec5981975df1676f19.png](https://i-blog.csdnimg.cn/blog_migrate/96db750bf88b77119b69b8e1a30b675f.jpeg)
直接去111虚拟机工作节点查看docker容器的日志,显示没权限
![df0f8f5bd76355cfeafea0b0bece0835.png](https://i-blog.csdnimg.cn/blog_migrate/032169ac3a108c6e58cebb9d8877222d.png)
只得手动进入一下“guozhulei/unity-simple-server:0.3”这个镜像看看为什么,发现没执行权限
$ docker run -it guozhulei/unity-simple-server:0.3 /bin/bash
$ ll
![01692b0d64ad6473aa1e9f28fa142667.png](https://i-blog.csdnimg.cn/blog_migrate/8ac073af77fbdcdf1c0909533aee92ab.jpeg)
所以这就是为什么要在“三-3”这步修改Dockerfile文件,增加执行权限的命令。
4、如果k8s版本高于1.16.*,可能会遇到下面提示的错误,这是由于Go版本更新的问题,目前没找到解决办法,只能用官方推荐的k8s版本
Error from server (InternalError): error when creating "gameserver.yaml": Internal error
occurred: failed calling webhook "mutations.agones.dev": Post "https://agones-controller-
service.agones-system.svc:443/mutate?timeout=30s": x509: certificate relies on legacy Common
Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0