miyazi888の覚え書き日記

学習したことを書き留めてます。

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にアクセスする設定。

ingress.yaml

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