Open Match チュートリアルをminikubeでやる場合の落とし穴

「 [Applibot Advent Calendar 2022](https://qiita.com/advent-calendar/2022/applibot) 」 18日目の記事になります。
前日は @smoto-shei さんの [Amazon SageMaker でモデルをデプロイしてみた](https://blog.applibot.co.jp/2022/12/17/amazon-sagemaker-deploy/)という記事でした。

## はじめに
Open Matchとminikube何もわからんという状態からOpen Match チュートリアルをminikube環境で実行する際にハマった箇所を紹介します。
※チュートリアル自体の解説はしません。

## 動作環境
今回、動作確認した環境は下記の通りです。
![Screen Shot 2022-12-17 at 23.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893255/5021acd8-6f8a-7f23-4a57-04fc23d29602.png)

## 落とし穴
### Installation
[Setup a Minikube Cluster](https://open-match.dev/site/docs/installation/#setup-a-minikube-cluster)に下記のコマンドが記載していますが、これだとOpen Matchが正常に起動しません。
```bash
$ minikube start --cpus=3 --memory=2500mb
```
Dashboardを見ると状況がわかりやすいのでminikubeを起動したら下記コマンドでDashboardも起動するのがおすすめです。
```bash
$ minikube dashboard
```
Dashboardが開いたらネームスペースでopen-matchを選択してメニューからポッドを選択します。
Pendingになっているポッドを確認すると下記画像のエラーが表示されています。
※違うエラーが表示されることがありますが、おそらく原因は同じです。
![Screen Shot 2022-12-18 at 0.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893255/b9413bf7-74ec-771f-03e3-233cc29c4ae7.png)
これを見るとCPUとメモリが足りていないことがわかります。
`minikube start`時に指定する`--cpus`と`--memory`を環境に合わせて余裕を持った値を指定してください。

#### Install with Helm
[Install the default Evaluator](https://open-match.dev/site/docs/installation/helm/#install-the-default-evaluator)の下記コマンドでOpen Matchをインストールするとエラーが発生します
```bash
$ helm install open-match --create-namespace --namespace open-match open-match/open-match \
  --set open-match-customize.enabled=true \
  --set open-match-customize.evaluator.enabled=true \
  --set open-match-override.enabled=true 

Error: INSTALLATION FAILED: unable to build kubernetes objects from release manifest: [resource mapping not found for name: "open-match-redis-podsecuritypolicy" namespace: "open-match" from "": no matches for kind "PodSecurityPolicy" in version "policy/v1beta1"
ensure CRDs are installed first, resource mapping not found for name: "open-match-core-podsecuritypolicy" namespace: "open-match" from "": no matches for kind "PodSecurityPolicy" in version "policy/v1beta1"
ensure CRDs are installed first]
```

非推奨になっていたPodSecurityPolicyがKubernetes 1.25で削除されたのが原因です。
下記 1.25のChangelog
[PodSecurityPolicy is Removed, Pod Security Admission graduates to Stable
](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.25.md#podsecuritypolicy-is-removed-pod-security-admission-graduates-to-stable)

HelmでOpen Matchをインストールする場合はKubernetes 1.24.8以下を使うことでインストールできます。
具体的には下記のように`minikube start`時にKubernetesのバージョンを指定して起動します。
```bash
$ minikube start --kubernetes-version v1.24.8
```
余計なものでハマらないようにOpen Matchインストール時にチュートリアルのバージョンに合ったものを明示的に指定することをおすすめします。
下記のようにバージョン指定します。
```bash
$ helm install open-match --version 1.5.0
```

### Tutorials
メニューの[Tutorials](https://open-match.dev/site/docs/tutorials/)にとても大事な内容が書いてありますが、直接子要素のチュートリアルリンクを開くと見逃してしまうので注意してください。

Note
For Minikube users, please run the command below to instruct Minikube to use local Docker images.

```bash
# Instructs Minikube to use local images
# https://kubernetes.io/docs/setup/learning-environment/minikube/#use-local-images-by-re-using-the-docker-daemon
$ eval $(minikube docker-env)
```
minikube起動後に`eval $(minikube docker-env)`を実行するとローカルのDockerイメージを使えるようになるのでminikubeでチュートリアルをする場合は必ず実行してください。

#### Set up Image Registry
どのチュートリアルでも`Set up Image Registry`という項目がありますが
`REGISTRY=[YOUR_REGISTRY_URL]`と書いてあり何を設定するか困ると思います。
minikube環境でローカルイメージを使用する場合は適当な文字列で大丈夫です！
`REGISTRY=local`とかで構いません。

また`docker build`と`docker push`する項目がありますが、`docker build`だけで大丈夫です。
`eval $(minikube docker-env)`をしていれば`docker build`でminikube内でイメージを使えるようになります。
`docker build`後に`docker image ls`でビルドしたイメージが表示されていれば問題ありません。

#### Get the Tutorial template
各チュートリアルの`Get the Tutorial template`で下記のように書いてあるのでインストールしたOpen Matchと合うブランチをチェックアウトするようにしてください。
```
Checkout release-x.y branch（e.g. release-1.3, release-1.4） of the Open Match Git repository. 
```
私はこれを無視してmainブランチでチュートリアルを進めたら`docker build`でビルドできない罠にハマりました:cry:
具体的に何が違うかというとDockerfile内の記述が変わります。
release-1.5ブランチだと`go build`の前に下記が追記されています。
```Dockerfile
RUN go mod edit -replace open-match.dev/open-match@v0.0.0-dev=open-match.dev/open-match@v1.5.0
RUN go mod tidy
```
チュートリアル内のgo.modは下記のようになっていて、ローカルのOpen Matchを使うようにreplaceされているので`docker build`する際はバージョン指定してreplaceするようです。
```go
require (
	google.golang.org/grpc v1.36.0
	open-match.dev/open-match v0.0.0-dev
)

replace open-match.dev/open-match v0.0.0-dev => ../../../
```
ドキュメントにはチュートリアルフォルダをコピーして使うように書いてありますが、go.modがこのようになっているのでIDEで開くとインポートが上手くいきません。
適宜`v0.0.0-dev`を変えてreplaceを削除するかコピーせずにローカルのopen-matchリポジトリ内で作業してください。

#### Deploy and Run
各チュートリアルの`Deploy and Run`で`sed`を使って`kubectl apply`する箇所があります。
[Build a basic Matchmaker](https://open-match.dev/site/docs/tutorials/matchmaker101/)の[Step 4 - Deploy and Run](https://open-match.dev/site/docs/tutorials/matchmaker101/deploy/)では
`For Minikube users, run:`とminikube向けのコマンドが別で記載されていますが、他のチュートリアルでは省略されているので注意が必要です。
```bash
$ sed "s|REGISTRY_PLACEHOLDER|$REGISTRY|g" matchmaker.yaml | sed "s|Always|Never|g" | kubectl apply -f -
```
minikube環境で必要なのは`sed "s|Always|Never|g"`の部分です。
`kubectl apply`する箇所では`sed "s|Always|Never|g"`を忘れずに実行しましょう！:smile: 

## おわりに
これでOpen Match チュートリアルを最後まで実行できるようになったと思います。
それでは良きOpen Matchライフをお過ごしください！

以上、「 [Applibot Advent Calendar 2022](https://qiita.com/advent-calendar/2022/applibot) 」 18日目の記事でした！
明日は@ref3000さんです！