IBM Cloud Container Serviceでminecraftサーバー(spigot)を立ち上げてみた

IBM Cloud Container Service で minecraftサーバー(spigot)を立ち上げてみた
このエントリは、[IBM Cloud Advent Calendar 2017](http://qiita.com/advent-calendar/2017/bluemix) 14日目の記事です。

## はじめに
minecraft、Nintendo Switch版が出たりと、最近また身の回りでは盛り上がっていましたが、
PC版(java版)では、このマルチプレイサーバーを自前で運用することができるようになります。
ただ自分でマルチプレイサーバーが運用できるだけでは面白くありません。
自作のプラグインが作れたりと可能性が無限大。

マインクラフトは教育分野でも利用されています。
Minecraftを開発したチームはMicrosoftによって買収され、
Windows10、X-Box、Nintendo Switchなどのクロスプラットフォームでゲームが出来るバージョンも開発提供され、Education Editionという教文向けのエディションも発売されています。

## なにが面白いのか
minecraftはいわゆる「箱庭ゲーム」と呼ばれるシュミレーションゲームです。
SimcityやA列車で行こうなど多くのタイトルがでていますね。
僕も大変大好きな分野です。

この箱庭ゲームの中でも、自分の家をたてたり、冒険したり、回路を作って何かつくってみたりと、
より生活に近い形でのゲームができるのが、マインクラフトです。
教育分野ではこの「回路を作って何かつくってみたり」という部分が大変評価されて、
授業として取り入れられているところもあるようです。

## IBM Cloudとminecraft
実はminecraftを使ったIBM Cloudでの実験というのは既に行われています。
Webでも公開されていますが、すこしバージョンが古かったりなので、今日の記事ではまず「IBM Cloudでminecraftのマルチプレイサーバーを立てる」にフォーカスし、後日「watsonとつなげる」ところを取り扱ってみたいと思います。

Spigotサーバーと、Watson Diagを使ってDr.Watsonと会話
[IBM developerWorks Medical Minecraft] (https://www.ibm.com/developerworks/cognitive/minecraft/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/c8230c02-a5a5-6ccf-d41a-12ff19b2fc6b.png)

## IBM Cloud Container Service(Kubernetes)にminecraftサーバー(spigot)を導入する
### spigot
minecraftには、「シングルプレイ」というローカルでプレイする形態と、
「マルチプレイ」という複数のユーザーでプレイする形態があります。


「マルチプレイ」は複数のユーザーで村を作ったり、外部のユーザーがさまざまなプラグインを開発しており、
それらを利用するために導入しています。
今回はspigotというminecraftサーバーを利用します。

Javaの複数APIから連なるもので、jarファイル形式で誰でもプラグイン開発が出来ます。

### 前提条件
1. IBM Cloud Pay-as-you-goアカウントで登録していること
2. IBM CloudでContainer Service ライトプランクラスタ以上をデプロイ済みであること
3. IBM Cloud Container Service(kubernetes)クラスタと同じリージョンにCloudFoundry組織・名前空間があること

#### 1. IBM Cloud Pay-as-you-goアカウントで登録していること
IBM Cloud ライトアカウントというクレジットカード登録なしで無料で利用が可能なアカウントがあるのですが、
12/14執筆時点ではkubernetesクラスタがデプロイできませんでした。

#### 2. IBM CloudでContainer Service ライトプランクラスタ以上をデプロイ済みであること
IBM Cloud Pay-as-you-goアカウントでは、クレジットカード登録と身分証明書の提示で、
無償でkubernetesクラスタをデプロイ出来る「ライトプラン」のkubernetesクラスタを利用することが可能です。

#### 3. IBM Cloud Container Service(kubernetes)クラスタと同じリージョンにCloudFoundry組織・名前空間があること
今回の記事では

#### ログイン
今回ライトプランのkubernetesクラスタはシドニーにデプロイされました。
ライトプランの場合地域を選んでデプロイすることができないので、デプロイされた地域をConsole上で確認してから、bxコマンドでログインします。


```bash
$ bx login -a api.au-syd.bluemix.net
API エンドポイント: api.au-syd.bluemix.net
```

### クラスタの確認
```bash
$ bx target --cf
$ bx cs clusters
OK
Name    ID                                 State    Created          Workers   Datacenter   Version   
hogehoge   d576c****1884e62a5f4e132a20e4b2c   normal   34 minutes ago   1         mel01        1.7.4_1504   
```
#### kubectl用にクラスタ構成ファイルの読み込み
```bash
$ bx cs cluster-config ssk8s
コマンド実行結果に出てくる "export KUBECONFIG="をコピーして実行する
$ export KUBECONFIG=/Users/sakaigawa/.bluemix/plugins/container-service/clusters/hogehoge/kube-config-mel01-hogehoge.yml
```

#### Dockerfileの作成
```Dockerfile:Dockerfile
# v0.1 run spigot!
FROM centos:latest
MAINTAINER Shoichiro Sakaigawa “sakaigawa@pumpkinheads.jp”
RUN yum update-y &&\
    yum install -y git wget java-1.8.0-openjdk java-1.8.0-openjdk-devel &&\
    mkdir minecraft &&\
    wget "https://hub.spigotmc.org//jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar" -O minecraft/BuildTools.jar &&\
    git config --global core.autocrlf input &&\
    java -jar minecraft/BuildTools.jar --rev 1.12.2 &&\
    rm -rf Bukkit CraftBukkit Spigot BuildData apache-maven-* work craftbukkit-*.jar minecraft
RUN echo "eula=true" > eula.txt &&\
    mkdir plugins
CMD java -Xms512m -Xmx1024m -jar spigot-1.12.2.jar nogui
EXPOSE 25565

```

#### コンテナのビルド
Docker-Registoryのプライベート版であるibm cloudのdocker registryへログインし、
docker imageをタグ付きでビルドします。

```bash
$ bx cr login
$ docker build -t registry.au-syd.bluemix.net/hogehoge/spigot-ibm-cloud .
```

#### ビルドしたコンテナをdocker registryにpushする

```bash
$ docker push registry.au-syd.bluemix.net/hogehoge/spigot-ibm-cloud
$ bx cr image-list
イメージをリストしています...

リポジトリー                                         名前空間   タグ     ダイジェスト   作成            サイズ   脆弱性の状況   
registry.au-syd.bluemix.net/hogehoge/spigot-ibm-cloud   hogehoge      latest   fb75af728a41   5 minutes ago   398 MB   OK   

OK
```

####  Deploy / Serviceの設定を定義する・コミットする
今回はやってみたをメインにするので内容を細かく書きませんが、
Podは１個、ポートはNodePortでロードバランスせずに公開します。

```yaml:deploy.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: spigot
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: spigot
    spec:
      containers:
      - name: spigot
        image: registry.au-syd.bluemix.net/ssk8s/spigot-ibm-cloud
---
apiVersion: v1
kind: Service
metadata:
  name: spigot-service
  labels:
    run: spigot
spec:
  selector:
    app: spigot
  type: NodePort
  ports:
   - protocol: TCP
     port: 25565
```

kubectlでPodのデプロイとServiceのデプロイを実施する。

```bash
$ ~/kubectl create -f deploy.yml 
deployment "spigot" created
service "spigot-service" created
```

## Minecraftで接続してみよう
### サーバアドレスを確認する

bx cs workers コマンドでkubernetesを実行するworkerの外部IPを見つけます。
今回はworker1台のライトプランですので複数台のkubernetesクラスタの場合はPodが動作するworkerを特定してからの作業が必要です。
コマンド結果のPublic IPをメモします。

```bash
$ bx cs workers ssk8s
OK
ID                                                 Public IP      Private IP       Machine Type   State    Status   Version   
kube-mel01-pad576*****884e62a5f4e132a20e4b2c-w1   168.*.***.83   10.118.1**.178   free           normal   Ready    1.7.4_1504   
```

### kubectl get svcで外部公開のポート番号を確認する

今回のサンプルでは、コンテナ側が25565で公開されており、外部側は：の右側31092であることがわかりました。

```bash
$ ~/kubectl get svc
NAME             CLUSTER-IP      EXTERNAL
-IP   PORT(S)           AGE
kubernetes       172.21.0.1      <none>        443/TCP           1d
spigot-service   172.21.47.159   <nodes>       25565:31092/TCP   1d
```

minecraftクライアントを起動後、「マルチプレイ」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/c8230c02-a5a5-6ccf-d41a-12ff19b2fc6b.png)

「サーバの追加」をクリックし、以下のように入力を行う。

|名称|内容|
|:--|:--|
|サーバー名|事由にわかりやすいもので。今回はibmcloud-spigotとしました|
|サーバーアドレス|{Public IP}:{ポート番号}<br>今回は、168.*.***.83:31092となります。|


![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/2faf0e09-83e0-d1ca-4e17-e52a9912f68b.png)

「完了」をクリックするとサーバーへ試験接続され、緑色のアンテナが立ちます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/7657e9f2-5599-14fc-6c77-73bbf7cee307.png)

サーバー名をクリックすると、minecraftの世界にログインできました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/3b13459f-73fc-c944-5f33-a7fb81b0bde9.png)


minecraftの世界では、モンスターや動物、村人、マジシャンがイます。敵意のあるキャラクタもいるので、
明け方まで放置しておくと死んでいることもあるので注意です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/7a0afd14-2de0-ae67-95d4-7724a64294aa.png)

## まとめ
IBM Cloud Container Serviceでなければできないことまで触れたかったのですが、
この部分は追ってqiita記事にしていきたいと思います。

実験的な導入のため、セキュリティ部分も課題がいくつもあります。
むき出しのspigotサーバーはminecraftのワールドを荒らしてみたりする人もいます。
このあたりはwebでもさまざまあるようなので今後見ていこうと思いました。