本記事について
Google Cloud Platform のKubernetes(GKE)でHTTPS通信する方法についてまとめました。
はじめに
Kubernetesが外部と通信できるようにするには
- Serviceによる方法
- Ingressによる方法
の2通りのやり方があります。
- https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip?hl=ja
- https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer?hl=ja#background
Serviceによる方法では、外部IPはGCPのロードバランサーに直接接続され、外部からのデータはロードバランサーの機能により、KubernetesのServiceに分配されます。ロードバランサーは単純にデータを分配するだけで、外部からのデータはそのままServiceに流されるため、HTTPSの処理はデータを受け取ったKubernetesの内部のPodで処理する必要があります。
Ingressによる方法では、外部IPはIngressというKubernetesのルーティングを行う所に接続され、Ingressは設定に応じて、KubernetesのServiceにデータを分配します。Ingressは内部的にはnginxで作成されており、外部からのHTTPSをHTTPに変換してServiceに流すといった、通信内容に応じたルーティングが可能になります。
本記事では、Ingressを使ったHTTPS通信を行い、IngressでHTTPSをHTTPに変換し、KubernetesにはHTTPを送るように設定します。
手順
外部IP
Ingressの外部IPは「global」である必要があり、「regional」では動作しません。そこで「global」なstatic IPを用意します。
シークレットの作成
証明書と鍵のセットをシークレットとしてKubernetesに登録し、そのシークレットを参照する形でIngressを作成します。
まずは、シークレットの作成を行います。
kubectl create secret tls <シークレット名> \
--key <鍵ファイル> \
--cert <証明書ファイル>
Ingressの作成
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.allow-http: "false"
kubernetes.io/ingress.global-static-ip-name: "<外部IP名>"
labels:
app: ingress
spec:
tls:
- secretName: <シークレット名>
backend:
serviceName: <接続先Service名>
servicePort: <接続先ポート番号>
(HTTPSのみを許可し、HTTP通信は不可としています)
「ingress.yaml」でIngressを作成
kubectl create -f ingress.yaml
ヘルスチェックの確認
以上でIngressが作成され、外部からHTTPSで通信できるようになります。
Ingressが作成されると、Kubernetesはロードバランサーを作成し、ヘルスチェックの設定も行います。
- [GCP]-[ネットワークサービス]-[負荷分散]-[<ロードバランサー名>]-[ヘルスチェック]
でヘルスチェックの詳細が見れます。
このヘルスチェックをパスしないと、Ingressへデータが流されず、動作しませんので注意が必要です。
デフォルトのヘルスチェックはHTTPで「/」アクセスをチェックしていますので、接続先ServiceでHTTPで「/」にアクセスできるようにしておく必要があります。