🎃

GatewayとHTTPRouteとManaged Certificateを利用してGKEクラスターで動作するサービスをHttpsで公開する

2024/05/30に公開

記事の内容

GatewayとHTTPRouteを利用してGKEクラスターで動作するサービス(Pod)に、ロードバランサーを通してインターネットからhttpsアクセスできるように設定します。

SSL証明書はGoogleのmanagedのものを利用します。

記事の長さ

2分で読めます

GKEクラスターの作成

この記事ではGKEクラスター自体の作成方法は取り上げません。

https://zenn.dev/ring_belle/articles/gcp-terraform-gke

こちらの記事でGKEクラスターをTerraformで作成する方法を公開していますので、クラスターの作成についてはこちらをご参照ください。

Certificateを準備する

GKE上にGatewayを設定する前にそのGatewayで利用するSSL証明書をGoogleのManaged Certificateを利用して取得しておきます。

resource "google_compute_managed_ssl_certificate" "this" {
  project = var.project_id

  name = "certificate-name"

  managed {
    domains = [
        "example.com."
    ]
  }
}

このTerraformのソースコードをapplyすると証明書を発行できます。

Nginxサービスを起動する

Gatewayへのアクセスを確認しやすいように、Nginxの初期画面が表示されるServiceとPodを作成します。

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: ClusterIP
  selector:
    name: nginx
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: nginx
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    ports:
    - containerPort: 80

このマニフェストファイルをkubectl apply して、nginx サービスに対して80ポートでトラフィックを流せばnginxの初期画面が表示されるように実装してください。

GatewayとHTTP Routeを設定する

証明書とnginxサービスの準備が完了したので、最後にGatewayとHTTP Routeを作成します。

gateway.yaml

kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: example-domain
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
  - name: https
    protocol: HTTPS
    port: 443
    tls:
      mode: Terminate
      options:
        networking.gke.io/pre-shared-certs: certificate-name

http-route.yaml

kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: example-domain
spec:
  parentRefs:
  - kind: Gateway
    name: example-domain
  hostnames:
  - "example.com"
  rules:
  - backendRefs:
    - name: nginx
      port: 80

この二つをkubectl applyして、GKEクラスターにGatewayとHTTP Routeを作成してください。

Apply後に以下のコマンドを実行して、Gateway マニフェストによって自動で付与されたグローバルIPアドレスの値を調べます。

$ kubectl get gateway
NAME             CLASS                            ADDRESS         PROGRAMMED   AGE
example-domain   gke-l7-global-external-managed   111.111.111.11  True         78m

DNSレコードを設定する

GatewayがGCP上に作成したロードバランサーのIP Addressが判明したので、最後にこのIPアドレスをドメインのAレコードのバリューとしてDNS設定してください。

  • レコードタイプ: A
  • レコードバリュー: <IP Address>

レコードが正常に設定されると対象のドメイン名でインターネットからHttpsアクセスをした際にnginxの初期画面が表示されるようになります。

まとめ

GatewayとHTTP Routeを利用してGKE上にHTTPSアクセスできる入り口を作る方法を紹介しました。

従来のIngressと異なり、GatewayとHTTP Routeを利用することで柔軟なネットワーク構成が可能になります。

note

勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。

https://note.com/ring_belle/membership

Discussion