本番、テスト環境はopenshiftで運用している弊社ですが、営業担当より営業用に使える第三の環境が欲しいとのことだったのでminikubeで環境構築しました。
openshitの基盤自体は別チームにて構築しているため、マニフェストより下のレイヤを触るのは初めてです。
環境
・Amazon EC2
・Ubuntu 22.04 LTS
目標
・本番、テスト環境のopenshiftのマニフェストをそのまま使いたい
・多少の差分はパイプラインで吸収できる範囲としたい
minikubeの構築自体は難しいものではなく、調べたらいくらでも出てくると思います。
ここでは、openshift(k8s)のつもりでやってたらハマったポイントをご紹介
1. 永続ストレージのマウント
minikubeは構成上 ホストサーバ → minikube VM → k8s clusterとなっており、PODからhostPath等でホストサーバのパスをマウントしようとしてもうまくいきません。
ホストサーバのパスをminikube VMでマウントし、そのパスをPODがマウントする必要があります。
minikube開始時に下記でマウントのオプションを入れてやればOKです。
minikube start --mount --mount-string /LOCAL_PATH:/MOUNT_PATH
さらにハマりポイントなのですが、--mount-stringは一つしか指定できないようで、マウントポイントが一つになるようディレクトリ設計をする必要があります。
私の環境ではディレクトリが/のレベルで分かれていたので、パイプラインでminikube環境のマニフェストは一つのパスに集約するよう変更を行いました。
2. Dockerイメージの取得
minikubeだからというわけではないのですが、Dockerレジストリを別途構築し、そこからイメージをpull。ではなくてminikubeをインストールしているホストのローカルからDockerイメージを取得するようにしたかったのです。
その際、単にdocker loadやdocker buildでローカルのdockerdにイメージを追加するだけではだめで、先に出てきた構成の話と同じですが、minikube vmにdockerイメージをロードさせる必要があります。
面倒ですがdocker loadやdocker buildした後に、minikube image loadでさらにminikube vmにDocker imageをロードさせてやればOKです。
docker load -i xxxx.tar.gz
or
docker build -t .
minikube image load docker-image-name:tag-name
3. Routerが存在しない
これはopenshiftとk8sの違いです。。。openshiftにはホスト名とURLにより、Serviceへのルーティングを行ってくれる機能があるのですがk8sにはないので変更しました。
もともとService定義をClusterIPにて行ってましたが、NodePortへ変更しています。
4. NodePortにアクセスできない
NodePortを構成するとk8sクラスタの外からアクセス可能となりますが、私はホストサーバのIPに対してアクセスしていて30分くらいハマりました。。。
minikubeが公開しているIP、URLにアクセスする必要があります。minikube vmのプライベートIPなのかな。。。ちゃんと調べてないです、すみません。
minikube service listコマンドで出てきたURLにアクセスすればOKです。
ただし、当然minikubeが動作しているホスト上からしかアクセスできないので、さらに外からアクセスさせたい場合は、nginxでプロキシさせたり、LBを作れば良いかと思います
$ minikube service list
|-------------|----------------------|-----------------------------|
| NAMESPACE | NAME | URL |
|-------------|----------------------|-----------------------------|
| default | myapp-service | http://192.168.10.10:30010 |
|-------------|----------------------|-----------------------------|
番外編 Proxyを切ったり張ったりが怠かった
私の環境は認証プロキシを通さないとインターネットに出られないのですが、環境構築の中でプロキシ設定が必要な場面と設定してはいけない場面がありました。
■プロキシが必要
curl, aptなどのパッケージインストール
minikube start (おそらくDocker Hubへ接続している)
■プロキシを設定してはいけない
kubectl全般 (ローカルのminikube APIサーバへ接続しないといけないが、外に出ようとしてしまう)
NO_PROXYなどでminikube宛の通信はプロキシ使用しないよう設定すればよいと思います。
今回は断片的な情報になりましたが、時間があれば一連をまとめて公開します。