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

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

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

関連カテゴリー記事

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com

www.kwbtblog.com