
 
こんにちは、mabuiです。
今回はIngressを導入して、Service, Podに接続するまでの流れを紹介します。
Podを起動してService経由で接続するまでの流れは前回の記事にまとめました。
 
Ingressとは
Ingressとはアプリケーションロードバランサーの役割をするK8sのリソースです。
クラスタ外からIngressを経由してServiceに接続することで、ServiceへのルーティングをURLパスで振り分けたり、TLS証明書を利用してhttps通信できるようになります。
利用するにはオーケストレーションを設定するIngressマニュフェストファイルと、ロードバランサーの実体であるIngressコントローラーが必要です。
 
Ingressコントローラーの用意
ではまずIngressコントローラーを用意します。
これにはいくつか種類がありますが、今回はNGINX Ingress Controllerを利用します。
 
Kubernetesのパッケージマネージャ、Helmを利用してインストールします。
| 1 2 3 4 5 6 7 8 9 | # Helmのインストール(Mac) brew install helm # 公式stableリポジトリの追加  helm repo add stable https://kubernetes-charts.storage.googleapis.com/  # ingressコントローラーインストール  helm install nginx-ingress stable/nginx-ingress  | 
インストール実行時にIngressマニュフェストの例を出力してくれます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | % helm install nginx-ingress stable/nginx-ingress NAME: nginx-ingress LAST DEPLOYED: Sat Jul  4 14:26:10 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The nginx-ingress controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running 'kubectl --namespace default get services -o wide -w nginx-ingress-controller' An example Ingress that makes use of the controller:   apiVersion: extensions/v1beta1   kind: Ingress   metadata:     annotations:       kubernetes.io/ingress.class: nginx     name: example     namespace: foo   spec:     rules:       - host: www.example.com         http:           paths:             - backend:                 serviceName: exampleService                 servicePort: 80               path: /     # This section is only required if TLS is to be enabled for the Ingress     tls:         - hosts:             - www.example.com           secretName: example-tls If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:   apiVersion: v1   kind: Secret   metadata:     name: example-tls     namespace: foo   data:     tls.crt: <base64 encoded cert>     tls.key: <base64 encoded key>   type: kubernetes.io/tls | 
インストールが完了したら色々とリソースが追加されます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | % kubectl get all NAME                                                 READY   STATUS    RESTARTS   AGE pod/nginx-ingress-controller-5989bf7f8f-kcj4k        0/1     Running   0          9s pod/nginx-ingress-default-backend-5b967cf596-5w7hv   1/1     Running   0          9s NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE service/kubernetes                      ClusterIP      10.96.0.1        <none>        443/TCP                      40d service/nginx-ingress-controller        LoadBalancer   10.110.209.187   localhost     80:30668/TCP,443:31882/TCP   9s service/nginx-ingress-default-backend   ClusterIP      10.109.68.85     <none>        80/TCP                       9s NAME                                            READY   UP-TO-DATE   AVAILABLE   AGE deployment.apps/nginx-ingress-controller        0/1     1            0           9s deployment.apps/nginx-ingress-default-backend   0/1     1            0           9s NAME                                                       DESIRED   CURRENT   READY   AGE replicaset.apps/nginx-ingress-controller-5989bf7f8f        1         1         0       9s replicaset.apps/nginx-ingress-default-backend-5b967cf596   1         1         0       9s | 
これでIngressコントローラーの導入は完了です!
 
ServiceのType変更
前回ServiceのTypeをClusterIPにしていたのでNodePortに変更します。
ClusterIPだと外部クラスタからのアクセスができないらしく、ローカルクラスタでの接続はうまくいきましたがGKEデプロイ時にエラーになりました。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | apiVersion: v1  kind: Service  metadata:    name: template    labels:      app: template  spec:    ports:    - port: 8888      protocol: TCP      targetPort: 8888    selector:      app: template    type: NodePort  | 
Ingressマニュフェストの用意
前回の環境に合わせてマニュフェストを用意し、適用します。
 
ingress.yaml
| 1 2 3 4 5 6 7 8 9 | apiVersion: networking.k8s.io/v1beta1  kind: Ingress  metadata:    name: template-ingress  spec:    backend:      serviceName: template      servicePort: 8888  | 
manifest適用
| 1 2 3 4 | kubectl apply -f k8s/deployment.yaml  kubectl apply -f k8s/service.yaml  kubectl apply -f k8s/ingress.yaml  | 
以上です。
ここまでで http://localhost にアクセスしてコンテナ接続ができました!