はじめに

Agones 有名なのでちゃんと勉強したいのですが、なかなか時間が取れませんでした。 このブログをきっかけに検証環境を作って今後使いたい時に使えるようにしたいと思っています。

もくじ

  • ローカルの k8s 環境

ローカルのk8s 環境

minikube は virtual box / docker が必要だったので諦める kindを試してみる

What’s kind

https://qiita.com/tomoyafujita/items/5a3c06705f62c5732bc5

kind is a tool for running local Kubernetes clusters using Docker container “nodes”.

公式のツールで、docker container “nodes"を使って、ローカルでクラスターを動かす

Let’s Start

kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.27.3) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

これだけでOK

status 確認 kubectl で Control Plane に対して操作

kubectl cluster-info --context kind-kind
Kubernetes control plane is running at https://127.0.0.1:49314
CoreDNS is running at https://127.0.0.1:49314/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

ローカルホストで Control Plane が待ち受けるようになる

これやるととんでもない量のデータが

kubectl cluster-info dump --context kind-kind 

replicaset と daemonset

  • replicaset : 指定された数のポッドのコピーを維持すること。可用性を確保
  • daemonset: 全てのノード(または特定のノード)に対して、特定のポッドを一つずつ実行する.ログや proxy 向け
kubectl get nodes -o wide
NAME                 STATUS   ROLES           AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION    CONTAINER-RUNTIME
kind-control-plane   Ready    control-plane   18m   v1.27.3   172.18.0.2    <none>        Debian GNU/Linux 11 (bullseye)   6.4.16-linuxkit   containerd://1.7.1

kind-control-plane が動作していることがわかる

docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                       NAMES
36ba1eb386b8   kindest/node:v1.27.3   "/usr/local/bin/entr…"   19 minutes ago   Up 19 minutes   127.0.0.1:49314->6443/tcp   kind-control-plane

「127.0.0.1:49314->6443/tcp」の部分より ホストのポート6443をコンテナとして起動したapi-serverへマッピングしているため、ホストマシンからkubectlにてクラスタを管理することも可能です。

Agones のホスト

https://castaneai.hatenablog.com/entry/2019/05/16/153339 https://agones.dev/site/docs/installation/ これを参考に

kubectl create namespace agones-system --context kind-kind
namespace/agones-system created

Install Agones using YAML (本番は helm を推奨) https://agones.dev/site/docs/installation/install-agones/yaml/

kubectl apply --server-side -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/install/yaml/install.yaml

確認

kubectl describe --namespace agones-system pods
kubectl describe --namespace agones-system pods | grep "Name:"

4種類立ち上がる

agones-allocator-6bd8dcf69-bl6t4
agones-controller-6d64fc55fc-8lwv8
agones-extensions-64bd6f4f88-k65ng
agones-ping-5bc68794f9-6m7vg
kubectl get pods --namespace agones-system

NAME                                 READY   STATUS    RESTARTS   AGE
agones-allocator-6bd8dcf69-bl6t4     1/1     Running   0          2m
agones-allocator-6bd8dcf69-tnm8l     1/1     Running   0          2m
agones-allocator-6bd8dcf69-x9wss     1/1     Running   0          2m
agones-controller-6d64fc55fc-8lwv8   1/1     Running   0          2m
agones-controller-6d64fc55fc-vf59s   1/1     Running   0          2m
agones-extensions-64bd6f4f88-k65ng   1/1     Running   0          2m
agones-extensions-64bd6f4f88-z8z5g   1/1     Running   0          2m
agones-ping-5bc68794f9-6m7vg         1/1     Running   0          2m
agones-ping-5bc68794f9-md59q         1/1     Running   0          119s

ここまでで、 GameLift 的な CP の準備ができた状態。 まだ GameServer がないので立ち上げる

GameServer Deploy

kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/examples/simple-game-server/gameserver.yaml
kubectl get gameservers

接続してみる

kubectl get gs

NAME                       STATE   ADDRESS      PORT   NODE                 AGE
simple-game-server-ff9w5   Ready   172.18.0.2   7171   kind-control-plane   34s
nc -u 172.18.0.2 7171

接続できんくね? kind の制約の可能性あるな… https://egashira.dev/blog/nodeport-with-port-mapping-in-kind-cluster

kind は、Docker コンテナ上で動作し k8s クラスタとして振る舞うが、ホストマシンからルーティング可能な IP アドレスが kind の Docker コンテナに振られないため。

touch kconfig.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    extraPortMappings:
    - containerPort: 7171
      hostPort: 8080
  - role: worker
kind create cluster --config ./kconfig.yaml

kubectl create namespace agones-system --context kind-kind

kubectl apply --server-side -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/install/yaml/install.yaml

以下でステータスを確認して待つ

kubectl get pods --namespace agones-system
kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/examples/simple-game-server/gameserver.yaml

kubectl get gs

これだとポートが変わっちゃう

wget https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/install/yaml/install.yaml

nodeport どれ割り当てるかは Agones がレンジから決める

        # minimum port that can be exposed to GameServer traffic
        - name: MIN_PORT
          value: "7171"
        # maximum port that can be exposed to GameServer traffic
        - name: MAX_PORT
          value: "7171"
kind create cluster --config ./kconfig.yaml
kubectl create namespace agones-system --context kind-kind
kubectl apply --server-side -f ./install.yaml
kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/examples/simple-game-server/gameserver.yaml
docker ps
d4d44169f79a   kindest/node:v1.27.3   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes   127.0.0.1:51084->6443/tcp, 0.0.0.0:8080->7171/tcp   kind-control-plane

TCP で繋いでるので接続きれちゃう

nc -u 0.0.0.0 8080
kubectl get pod --context kind-kind
NAME                       READY   STATUS    RESTARTS   AGE
simple-game-server-cmw54   2/2     Running   0          11m
kubectl describe pod simple-game-server-cmw54

    Port:           7654/UDP
    Host Port:      7171/UDP
kubectl cluster-info --context kind-kind
Kubernetes control plane is running at https://127.0.0.1:51084
CoreDNS is running at https://127.0.0.1:51084/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    extraPortMappings:
    - containerPort: 7171
      hostPort: 8080
      protocol: UDP
  - role: worker

三度目の正直

kind create cluster --config ./kconfig.yaml
kubectl create namespace agones-system --context kind-kind
kubectl apply --server-side -f ./install.yaml
kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/examples/simple-game-server/gameserver.yaml

ステータス確認

kubectl get gs -n agones-system
NAME                       STATE   ADDRESS      PORT   NODE          AGE
simple-game-server-4cwqd   Ready   172.18.0.2   7171   kind-worker   26s
docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                                               NAMES
1084d7762661   kindest/node:v1.27.3   "/usr/local/bin/entr…"   3 minutes ago   Up 3 minutes   127.0.0.1:52636->6443/tcp, 0.0.0.0:8080->7171/udp   kind-control-plane
b37826c00192   kindest/node:v1.27.3   "/usr/local/bin/entr…"   3 minutes ago   Up 3 minutes                                                       kind-worker

テスト

nc -u 0.0.0.0 8080

うーーーん?kind-worker に立ち上がってるのはミスな気がする

kubectl apply --server-side -f ./install.yaml --context kind-kind
kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/examples/simple-game-server/gameserver.yaml --context kind-kind
kubectl get pods --namespace agones-system --context kind-kind
kubectl get gs --context kind-kind

4 回目

kind create cluster --config ./kconfig.yaml --name agones
kubectl cluster-info --context kind-agones
Kubernetes control plane is running at https://127.0.0.1:53821
CoreDNS is running at https://127.0.0.1:53821/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
kubectl create namespace agones-system --context kind-agones
kubectl apply --server-side -f ./install.yaml --context kind-agones
kubectl get pods --namespace agones-system --context kind-agones
kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/examples/simple-game-server/gameserver.yaml --context kind-agones

kubectl get gs --context kind-agones
NAME                       STATE       ADDRESS      PORT   NODE            AGE
simple-game-server-tvmfq   Scheduled   172.18.0.2   7171   agones-worker   13s
nc -u 0.0.0.0 8081

nc -u 0.0.0.0 8081

やっぱこれがおかしい気がする

docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                                               NAMES
d463f2b5dd0e   kindest/node:v1.27.3   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes   127.0.0.1:53821->6443/tcp, 0.0.0.0:8081->7171/udp   agones-control-plane
bda97cc3724e   kindest/node:v1.27.3   "/usr/local/bin/entr…"   8 minutes ago   Up 8 minutes                                                       agones-worker

agones-worker Node へのパスが必要。こうだわ

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
    extraPortMappings:
    - containerPort: 7171
      hostPort: 8081
      protocol: UDP

v5

kind create cluster --config ./kconfig.yaml --name agones
kubectl create namespace agones-system --context kind-agones
kubectl apply --server-side -f ./install.yaml --context kind-agones


kubectl get pods --namespace agones-system --context kind-agones

kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.36.0/examples/simple-game-server/gameserver.yaml --context kind-agones

docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                       NAMES
1f76dc794754   kindest/node:v1.27.3   "/usr/local/bin/entr…"   2 minutes ago   Up 2 minutes   127.0.0.1:54608->6443/tcp   agones-control-plane
83f91c792726   kindest/node:v1.27.3   "/usr/local/bin/entr…"   2 minutes ago   Up 2 minutes   0.0.0.0:8081->7171/udp      agones-worker
shuaki@909c4ac8a726 [~/_tmp] % nc -u 0.0.0.0 8081
a
ACK: a

OK やっとセットアップできた