新しいことにはウェルカム

技術 | 電子工作 | ガジェット | ゲーム のメモ書き

Kubernetes(GKE)でHTTPS通信する方法(Ingress編)

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を一旦削除して再作成または、再更新することにより、ヘルスチェックを再度行うようにする必要があります。