こんにちは、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 にアクセスしてコンテナ接続ができました!