朝日ネット 技術者ブログ

朝日ネットのエンジニアによるリレーブログ。今、自分が一番気になるテーマで書きます。

microservicesはじめました (5)

前回までで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の数を変えたりできるので便利です。

f:id:anmrtm:20181022150845p:plain

まとめ

5回かけてMinikubeクラスタ上に自作のmiroservicesをデプロイしました。

実運用するとなるとクラスタの管理が手間なので、Google Kubernetes Engine (GKE)Amazon Elastic Container Service for Kubernetes (Amazon EKS)Azure Kubernetes Service (AKS)などのマネージドサービスを利用するのが楽だと思います。

採用情報

朝日ネットでは新卒採用・キャリア採用を行っております。