2018年9月2日日曜日

minikube で Ingress の機能を使ってみた

概要

minikube ではアドオンの概念がありこれを使って Ingress を ON にするだけでホスト名ベースのロードバランシングができるようになります
今回は簡単な Web アプリを Ingress にぶら下げて挙動を確認してみました

環境

  • macOS 10.13.6
  • minikube v0.28.2
  • kubectl 1.11.2

Ingress を有効にする

  • minikube addons enable ingress

これだけで OK です

  • minikube addons list

アドオンの一覧を確認できます
enable になっていれば OK です

  • kubectl get all -n kube-system

pod の一覧を調べると Ingress 用の pod が生成されています
どうやら内部的には nginx が立ち上がりそれを使って Web アプリとして立ち上げた pod をバランシングしているようです

pod/nginx-ingress-controller-5984b97644-rb48q
deployment.apps/nginx-ingress-controller
replicaset.apps/nginx-ingress-controller-5984b97644

Ingress を試す

では Ingress の挙動を確認しましょう
まずは pod を作成し service を expose します

  • kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.4 --port=8080
  • kubectl expose deployment hello-minikube

これでコンテナ自体は立ち上がります
ただしまだ外部からアクセスすることができません
これを Ingress にぶら下げてアクセスできるようにします

Ingress の生成

Ingress は YAML ファイルの定義から生成します

  • vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello
spec:
  rules:
  - host: hello.minikube.dev
    http:
      paths:
      - backend:
          serviceName: hello-minikube
          servicePort: 8080

ポイントは backend の部分でここで指定している serviceName を Ingress にぶら下げてます
Ingress から servicePort で指定した Web アプリケーションのポートに対してリクエストを投げます
なので servicePort で指定するポートは expose したポートにします

  • kubectl create -f ingress.yaml

これで Ingress を登録しましょう
登録した Ingress の一覧は get で確認できます

  • kubectl get ingress

動作確認

ぶら下げた Web アプリにホストベースでアクセスしてみます
今回は ingress.yaml で hello.minikube.dev という名前のホストとして Web アプリをぶら下げたのでヘッダに指定します

  • curl http://minikube ip-H "Host: hello.minikube.dev"

Host の指定がないと Ingress (nginx) が振り先がわからず 404 になってしまします
これでアクセスすると今回の Web アプリ (echoserver) からレスポンスが返ってくると思います

CLIENT VALUES:
client_address=172.17.0.4
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://hello.minikube.dev:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
connection=close
host=hello.minikube.dev
user-agent=curl/7.54.0
x-forwarded-for=192.168.99.1
x-forwarded-host=hello.minikube.dev
x-forwarded-port=80
x-forwarded-proto=http
x-original-uri=/
x-real-ip=192.168.99.1
x-request-id=9e3a2e5f6076a7d956fddd0783b7d1ec
x-scheme=http
BODY:
-no body in request-

さらっと minikube の IP にアクセスしていますが minikube はホストが 1 台しかないので当然と言えば当然です
本番環境の kubernetes などでは Ingress 用のホストを準備してそこに nginx が立ち上がりバランシングする感じになります
GKE などでは Google Cloud Load Balancing があるのでそれを使うことが推奨されています

お掃除

Ingress の削除

  • kubectl delete ingress hello

or

  • kubectl delete -f ingress.yaml

Service および Deployment, Replicaset, Pod の削除

  • kubectl delete service,deploy hello-minikube

minikube の停止

  • minikube stop

最後に

minikube で Ingress を試してみました
minikube の場合ホストが 1 台しかないのでアクセスできる IP は --type=NodePort と同じですが今回の場合は Ingress (nginx) を通してコンテナにアクセスします
正直本番に近い構成にすることは難しいですが Ingress の感じを掴んだり、Ingress の定義の登録ができるかなどの確認には使えると思います

参考サイト

0 件のコメント:

コメントを投稿