minikubeでingressを使う
k8sを学習していく中でingressという単語に遭遇し、どうやらLoad Balancer的なものであるらしい、ということまでは理解した。
ただ、実際に触ってみた方が理解しやすいかと思い、minikubeでingressを動作させてみた。
前提
以下の環境で動作確認した。
- ubuntu 20.04
- minikube v1.24.0
- kubectl v1.20.8-dispatcher
それからdockerとdocker-composeが動作する環境であること。
動作確認用のdockerファイル作成
まずは動作確認用に2つのdocker imageを作成する。
mkdir html1 touch html1/index.html
html1/index.html
<html> <h1>sample page1</h1> </html>
mkdir html2 touch html2/index.html
<html> <h1>sample page2</h1> </html>
touch Dockerfile1
Dockerfile1
FROM 'nginx:latest' COPY html1/index.html /usr/share/nginx/html/index.html RUN service nginx start
touch Dockerfile2
Dockerfile2
FROM 'nginx:latest' COPY html2/index.html /usr/share/nginx/html/index.html RUN service nginx start
touch docker-compose.yaml
docker-compose.yaml
version: '3' services: nginx1: build: context: ./ dockerfile: Dockerfile1 image: nginx-sample1 ports: - 8080:80 nginx2: build: context: ./ dockerfile: Dockerfile2 image: nginx-sample2 ports: - 8081:80
Docker image作成と動作確認
ここまで出来たら、とりあえず上記の設定でdockerコンテナが狙ったとおりに動作するか確認。
docker-compose up -d curl localhost:8080 以下のようなレスポンスが返ってきたら成功 <html> <h1>sample page1</h1> </html> curl localhost:8081 <html> <h1>sample page2</h1> </html>
正しく動作することがわかったらコンテナを停止。
docker-compose stop
ここまでで正しく動作するdocker imageが作成されていることになる。
docker imageにタグを付ける
docker imageは出来たものの、このままではminikubeで扱えない(latestタグのimageがうまく扱えない模様)のでタグを付ける。
まずは作成されたdocker imageのIDを確認。
docker images
IDがわかったらタグ付けする。
docker tag <nginx-sample1のimage id> nginx-sample1:v1 docker tag <nginx-sample2のimage id> nginx-sample2:v1
minkube起動
minikubeを起動。
minikube start
イメージ取り込み
先程、作成したdocker imageをminikubeにロードする。
最後のminikube image lsはminikubeのimageの一覧を表示するコマンド。
minikube image load nginx-sample1:v1 minikube image load nginx-sample2:v1 minikube image ls
取り込んだイメージが使えるか確認
minikubeに取り込んだimageが本当に動作するか、ここでも動作確認する。
kubectl create deploy test1 --image=nginx-sample1:v1 kubectl expose deploy test1 --type=NodePort --port=8080 --target-port=80 minikube service test1 --url
ターミナルにURLが表示されるので、ブラウザで確認。
sample page1が表示されたら成功。
もう1つのイメージも動作確認する。
kubectl create deploy test2 --image=nginx-sample2:v1 kubectl expose deploy test2 --type=NodePort --port=8080 --target-port=80 minikue service test2 --url
こちらも表示されたURLにアクセスし、sample page2が表示されたら、OK。
ingressがminikubeで有効かどうかを確認
ingressはminikubeのaddonとして提供されている模様。
まずはaddonのリストを調べる。
minikube addons list
もしingressがenabledになっていなかったら有効にする。
minikube addons enable ingress minikube addons list
ingressを設定する
やっと本番。ingressを追加する。
touch ingress.yaml
下の設定ではhttp://test.local/にアクセスするとsample page1のpodにアクセスし、http://test.local/test2にアクセスするとsample page2のpodにアクセスする設定。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: test.local http: paths: - path: / pathType: Prefix backend: service: name: test1 port: number: 8080 - path: /test2 pathType: Prefix backend: service: name: test2 port: number: 8080
下記のコマンドでingressを適用する。
kubectl apply -f ingress.yaml watch kubectl get ingress
watchで表示されるingressでaddressの部分にloocalhostが表示されるまで待つ。
上で作成したingressはhostを指定しているので/etc/hostsも以下ように追記する。
/etc/hosts
127.0.0.1 test.local
これで準備完了。
動作確認
別のターミナルを起動して以下のコマンドを実行する。
minikube tunnel
元のターミナルに戻ってからcurlコマンドでレスポンスを確認する。
ブラウザでももちろん、OK。
curl http://test.local
sample page1が返ってきたら動作OK。
<html> <h1>sample page1</h1> </html>
curl http://test.local/test2
こちらはsample page2が返ってきたらOK。
<html> <h1>sample page2</h1> </html>
というわけでminikubeでingressを動作させることが出来た。
後片付け
下記のコマンドでingressとserviceとdeploymentを削除。
kubectl delete ingress ingress-test kubectl delete svc test1 test2 kubectl delete deploy test1 test2
次に/etc/hostsから下記の設定を削除。
/etc/hosts
127.0.0.1 test.local
minikubeのimageから今回追加したimageを削除。
minikube image rm nginx-sample1:v1 minikube image rm nginx-sample2:v1
最後にminikubeを停止して、後片付け完了。
minikube stop