前回まででMinikubeクラスタでサービスを動かすことはできていますが、まだクラスタの外部からはアクセスできていません。 なので今回はIngressを設定してサービスを外部公開できるようにしていきます。
前回のおさらい
前回の記事ではMinikubeクラスタ上にサービス群をデプロイしました。 引き続き、MinikubeはWindows 10でHyper-Vによって動かしているCentOS 7の上で動かしています。
外部アクセス
さて、ここまででMinikubeが動いているCentOSからサービスにアクセスすることができるのですが、せっかくなのでブラウザが動くホストのWindowsのブラウザから見たくなります。 そこでCentOSにnginxを立ててMinikubeクラスタにreverse proxyしてやる方法を考えます。 しかしMinikubeが公開するサービスのポート番号はServiceを作るたびに変わってしまい、そのたびにnginx.configを書き換えるのは実用的ではありません。 ここでは、もともとあったnginxのServiceに代わってIngressを追加します。
Ingress
Ingressはクラスタ外部から内部へのアクセスを許可するルールの集合として存在します。 Ingressを適切に設定することでインターネットなど外部にサービスのエンドポイントを提供することができます。
Ingressの設定
Ingressを動かすためのコントローラをインストールする必要があります。 今回はNGINX Ingress Controllerを追加します。 また、Ingressはまだベータ版の機能なのでMinikubeでのIngressを有効化します。
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml namespace/ingress-nginx configured configmap/nginx-configuration unchanged serviceaccount/nginx-ingress-serviceaccount unchanged clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole configured role.rbac.authorization.k8s.io/nginx-ingress-role unchanged rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding unchanged clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding configured deployment.extensions/nginx-ingress-controller created $ minikube addons enable ingress ingress was successfully enabled
Ingressの設定のためyamlを書きます(ingress.yaml)。
/
をfrontに、/api
をAPIに振り向けます。
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: grpc02-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - http: paths: - path: / backend: serviceName: grpc02-front servicePort: 80 - path: /api backend: serviceName: grpc02-api servicePort: 80
そのyamlファイルからIngressを適用します。
$ kubectl apply -f ingress.yaml ingress.extensions/grpc02-ingress created $ kubectl get ingress NAME HOSTS ADDRESS PORTS AGE grpc02-ingress * 192.168.122.112 80 42s
すると、Ingressは443番(HTTPS)でlistenしてくれます。 HEADリクエストを送ってみると200が返ってきます。
$ curl -I -k https://192.168.122.112 HTTP/1.1 200 OK Server: nginx/1.13.12 Date: Fri, 30 Nov 2018 03:49:45 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Vary: Accept-Encoding
もともとあったnginxのServiceは、Ingressが同じ役割を果たしてくれるため不要になるので消してしまいます。
$ kubectl delete service grpc02-nginx service "grpc02-nginx" deleted $ kubectl delete deployment grpc02-nginx deployment.extensions "grpc02-nginx" deleted
あとはCentOSのnginxで先ほどのアドレスにproxyしてあげればWindowsのブラウザからもアクセスできます。 nginxに次のような設定を追加します。
upstream grpc02-ingress { server 192.168.122.112:443; } server { listen 443 ssl; ... location / { proxy_pass https://grpc02-ingress; } }
おまけ: Minikube dashboard
Minikubeクラスタを管理できる画面が提供されています。 次のコマンドでURLを得ることができます。
$ minikube dashboard --url http://192.168.39.223:30000
Serviceと同じようにnginxでproxyしてやります。 この画面で状態を確認したりPodの数を変えたりできるので便利です。
まとめ
5回かけてMinikubeクラスタ上に自作のmiroservicesをデプロイしました。
実運用するとなるとクラスタの管理が手間なので、Google Kubernetes Engine (GKE)やAmazon Elastic Container Service for Kubernetes (Amazon EKS)、Azure Kubernetes Service (AKS)などのマネージドサービスを利用するのが楽だと思います。
採用情報
朝日ネットでは新卒採用・キャリア採用を行っております。