Google Cloud Platform のKubernetes(GKE)でHTTPS通信する方法についてのまとめです。
はじめに
Kubernetesが外部と通信できるようにするには
- Serviceによる方法
- Ingressによる方法
の2通りのやり方があります。
Serviceによる方法では、外部IPはGCPのロードバランサーに接続され、外部からのデータはロードバランサーの機能により、KubernetesのServiceに直接届けられます。ロードバランサーは単純にデータを分配するだけで、外部からのデータはそのままServiceに流されるため、HTTPSの処理はデータを受け取ったKubernetesの内部のPodで処理する必要があります。
Ingressによる方法では、外部IPはServiceによる方法と同様、GCPのロードバランサーに接続されるのですが、そこから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の作成
ingress.yaml
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress annotations: kubernetes.io/ingress.allow-http: "false" kubernetes.io/ingress.global-static-ip-name: "<外部IP名>" spec: tls: - secretName: <シークレット名> backend: serviceName: <接続先Service名> servicePort: <接続先ポート番号>
(HTTPSのみを許可し、HTTP通信は不可としています)
「ingress.yaml」でIngressを作成
kubectl create -f ingress.yaml
ヘルスチェックの確認
以上でIngressが作成され、外部からHTTPSで通信できるようになります。 Ingressが作成されると、Kubernetesはロードバランサーを作成し、ヘルスチェックの設定も行います。
- [GCP]-[ネットワークサービス]-[負荷分散]-[<ロードバランサー名>]-[ヘルスチェック]
でヘルスチェックの詳細が見れます。
このヘルスチェックをパスしないと、Ingressへデータが流されず、動作しませんので注意が必要です。
ヘルスチェックで何をするかは、Ingressで接続先のサービスのPodの「readinessProbe」で定義します。
例えば、IngressからNginxに接続する構成にしていて、Nginxが正常に動作している場合はデフォルトの「Welcome」ページが表示されるようになっていたとします。
Nginxが生きているかのヘルスチェックは、Nginxにhttpでアクセスして応答があればいいので、その場合のNginxのdeploymentの「readinessProbe」は、下記のように書きます。
deployment-nginx.yaml
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: xxxx ports: - containerPort: 80 readinessProbe: httpGet: path: / port: 80 scheme: HTTP
注意
ヘルスチェックはIngressが作成される時に行なわれ、その時点で既に接続先Serveiceが立ち上がっている必要があります。なので、接続先Service、Ingressの順で作成する必要があります。
ヘルスチェックが失敗した時、接続先Serviceを修正・アップしても、自動でヘルスチェックは再実行されないので、Ingressを一旦削除して再作成または、再更新することにより、ヘルスチェックを再度行うようにする必要があります。