IBM Cloud Container Service で minecraftサーバー(spigot)を立ち上げてみた
このエントリは、IBM Cloud Advent Calendar 2017 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/)
IBM Cloud Container Service(Kubernetes)にminecraftサーバー(spigot)を導入する
spigot
minecraftには、「シングルプレイ」というローカルでプレイする形態と、
「マルチプレイ」という複数のユーザーでプレイする形態があります。
「マルチプレイ」は複数のユーザーで村を作ったり、外部のユーザーがさまざまなプラグインを開発しており、
それらを利用するために導入しています。
今回はspigotというminecraftサーバーを利用します。
Javaの複数APIから連なるもので、jarファイル形式で誰でもプラグイン開発が出来ます。
前提条件
- IBM Cloud Pay-as-you-goアカウントで登録していること
- IBM CloudでContainer Service ライトプランクラスタ以上をデプロイ済みであること
- 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コマンドでログインします。
$ bx login -a api.au-syd.bluemix.net
API エンドポイント: api.au-syd.bluemix.net
クラスタの確認
$ 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用にクラスタ構成ファイルの読み込み
$ bx cs cluster-config ssk8s
コマンド実行結果に出てくる "export KUBECONFIG="をコピーして実行する
$ export KUBECONFIG=/Users/sakaigawa/.bluemix/plugins/container-service/clusters/hogehoge/kube-config-mel01-hogehoge.yml
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をタグ付きでビルドします。
$ bx cr login
$ docker build -t registry.au-syd.bluemix.net/hogehoge/spigot-ibm-cloud .
ビルドしたコンテナをdocker registryにpushする
$ 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は1個、ポートはNodePortでロードバランスせずに公開します。
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のデプロイを実施する。
$ ~/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をメモします。
$ 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であることがわかりました。
$ ~/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クライアントを起動後、「マルチプレイ」をクリックする
「サーバの追加」をクリックし、以下のように入力を行う。
名称 | 内容 |
---|---|
サーバー名 | 事由にわかりやすいもので。今回はibmcloud-spigotとしました |
サーバーアドレス | {Public IP}:{ポート番号} 今回は、168..**.83:31092となります。 |
「完了」をクリックするとサーバーへ試験接続され、緑色のアンテナが立ちます。
サーバー名をクリックすると、minecraftの世界にログインできました。
minecraftの世界では、モンスターや動物、村人、マジシャンがイます。敵意のあるキャラクタもいるので、
明け方まで放置しておくと死んでいることもあるので注意です。
まとめ
IBM Cloud Container Serviceでなければできないことまで触れたかったのですが、
この部分は追ってqiita記事にしていきたいと思います。
実験的な導入のため、セキュリティ部分も課題がいくつもあります。
むき出しのspigotサーバーはminecraftのワールドを荒らしてみたりする人もいます。
このあたりはwebでもさまざまあるようなので今後見ていこうと思いました。