🔒

GKE Gateway を TLS 対応させてみる

2023/10/07に公開

概要

前回の記事で GKE Gateway を利用した API のデプロイまでを行ったので、今回はその API を TLS 対応 ( HTTPS 化 ) させてみようと思います。
https://zenn.dev/tetsuya28/articles/gke-gateway-intro

事前準備

TLS 証明書を発行するためドメインを用意します。

今回は gateway.tetsuya28.com を利用するため Cloud DNS にゾーンを作成しました。

resource "google_dns_managed_zone" "gateway" {
  name        = "gateway"
  dns_name    = "gateway.tetsuya28.com."
  description = "gateway"
}

手順

証明書を発行する

Gateway API に利用する証明書はいくつか発行手段があります。

今回は Google のマネージド証明書を利用して TLS 化を行います。
https://console.cloud.google.com/security/ccm/list/lbCertificates

その他手段は公式のドキュメントをご覧ください。

https://cloud.google.com/kubernetes-engine/docs/how-to/secure-gateway?hl=ja#create-ssl

resource "google_compute_managed_ssl_certificate" "default" {
  name = "gateway"
  managed {
    domains = [
      "gateway.tetsuya28.com",
    ]
  }
}

適用後暫くすると証明書が利用出来るようになります。

Gateway API の TLS 化

先ほど作成した証明書を Gateway に付与します。

以下のマニフェストを適用することでロードバランサを TLS 化することが出来ます。

kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: gateway
spec:
  gatewayClassName: gke-l7-gxlb
  listeners:
    - name: https
      protocol: HTTPS # TLS 化に必要
      port: 443 # TLS 化に必要
      tls:
        mode: Terminate
        options:
          networking.gke.io/pre-shared-certs: gateway # 先ほど作成した証明書名

暫くするとロードバランサに設定が適用されます。

image

動作確認

curl -i https://gateway.tetsuya28.com/
HTTP/2 200
server: Werkzeug/2.2.2 Python/3.10.9
date: Sat, 08 Apr 2023 08:51:48 GMT
content-type: application/json
content-length: 375
access-control-allow-origin: *
via: 1.1 google
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

{
  "cluster_name": "tetsuya28",
  "gce_instance_id": "3864015078128664451",
  "gce_service_account": "tetsuya28.svc.id.goog",
  "host_header": "gateway.tetsuya28.com",
  "metadata": "store-v1",
  "pod_name": "store-v1-84c89967f8-hdxnw",
  "pod_name_emoji": "💇🏻‍♂",
  "project_id": "tetsuya28",
  "timestamp": "2023-04-08T08:51:48",
  "zone": "asia-northeast1-c"
}

Discussion