静的 IP アドレスを使用したドメイン名の構成

このチュートリアルでは、Google Kubernetes Engine(GKE)を使用して、静的外部 IP アドレスでウェブ アプリケーションをインターネットに公開し、そのアプリケーションを指すドメイン名を構成する方法を説明します。

このチュートリアルでは、example.com などの登録済みのドメイン名を所有していることを前提としています。

ウェブ アプリケーションをデプロイする

以下のマニフェストは、サンプルのウェブ アプリケーション コンテナ イメージを実行する Deployment を説明しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    matchLabels:
      app: hello
      tier: web
  template:
    metadata:
      labels:
        app: hello
        tier: web
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 200m

Deployment を作成します。

kubectl apply -f helloweb-deployment.yaml

アプリケーションを公開する

次のいずれかの方法を使用して、アプリケーションを GKE に公開できます。

各方法のメリットとデメリットの詳細については、Ingress を使用して外部アプリケーション ロードバランサを設定するをご覧ください。

Service を使用する

アプリケーションに静的外部 IP アドレスが割り当てられていることを保証するには、静的 IP アドレスを予約する必要があります。

Service を使用してアプリケーションを公開する場合は、リージョン IP アドレスを作成する必要があります。次のセクションで説明するように、グローバル IP アドレスは Ingress リソースタイプでのみ機能します。

Service を使用するには、リージョン us-central1helloweb-ip という名前の静的 IP アドレスを作成します。

gcloud

gcloud compute addresses create helloweb-ip --region us-central1

作成した静的 IP アドレスを探します。

gcloud compute addresses describe helloweb-ip --region us-central1

出力は次のようになります。

...
address: 203.0.113.32
...

Config Connector

注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順を実施してください。

apiVersion: compute.cnrm.cloud.google.com/v1beta1
kind: ComputeAddress
metadata:
  name: helloweb-ip
spec:
  location: us-central1

マニフェストを compute-address-regional.yaml として保存します。

マニフェストをクラスタに適用します。

  kubectl apply -f compute-address-regional.yaml

作成した静的 IP アドレスを探します。

  kubectl get computeaddress helloweb-ip -o jsonpath='{.spec.address}'

次のマニフェストでは、LoadBalancer タイプの Service を記述しています。これは、外部パススルー ネットワーク ロードバランサを作成し、外部 IP アドレスを持つ Pod を公開します。

YOUR.IP.ADDRESS.HERE を静的 IP アドレスで置き換えます。

apiVersion: v1
kind: Service
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    app: hello
    tier: web
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer
  loadBalancerIP: "YOUR.IP.ADDRESS.HERE"

Service を作成します。

kubectl apply -f helloweb-service-static-ip.yaml

ロードバランサに関連付けられた予約済み IP アドレスを表示します。

kubectl get service

出力は次のようになります。

NAME               CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
helloweb           10.31.254.176   203.0.113.32     80:30690/TCP     54s

Ingress を使用する

Ingress を使用してアプリケーションを公開する場合は、グローバル静的 IP アドレスを予約する必要があります。アノテーション kubernetes.io/ingress.global-static-ip-name を使用して、グローバル IP アドレスを指定します。

アプリケーションをリージョンのクライアントや Service に公開するには、GKE 用の内部 Ingress リソースをデプロイするときに、必要なアノテーションとともにリージョンの静的内部 IP アドレスを使用します。

Ingress を使用してアプリケーションをインターネットに公開する方法については、Ingress を使用して外部アプリケーション ロードバランサを設定するをご覧ください。

helloweb-ip という名前のグローバル静的 IP アドレスを作成するには、次のコマンドを実行します。

gcloud

gcloud compute addresses create helloweb-ip --global

作成した静的 IP アドレスを探します。

gcloud compute addresses describe helloweb-ip --global

出力は次のようになります。

...
address: 203.0.113.32
...

Config Connector

注: この手順には Config Connector が必要です。Config Connector をクラスタにインストールするには、インストール手順を実施してください。

apiVersion: compute.cnrm.cloud.google.com/v1beta1
kind: ComputeAddress
metadata:
  name: helloweb-ip
spec:
  location: global

マニフェストを compute-address-global.yaml として保存します。

マニフェストをクラスタに適用します。

  kubectl apply -f compute-address-global.yaml

以下のマニフェストに記述されている Ingress は、次の 2 つのリソースを持つ静的 IP でウェブ アプリケーションを公開します。

  • type:NodePort を使用した Service
  • サービス名と静的 IP アノテーションで構成された Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: helloweb
  annotations:
    kubernetes.io/ingress.global-static-ip-name: helloweb-ip
  labels:
    app: hello
spec:
  defaultBackend:
    service:
      name: helloweb-backend
      port:
        number: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: helloweb-backend
  labels:
    app: hello
spec:
  type: NodePort
  selector:
    app: hello
    tier: web
  ports:
  - port: 8080
    targetPort: 8080

kubernetes.io/ingress.global-static-ip-name アノテーションは、ロードバランサに関連付けるグローバル IP アドレス リソースの名前を指定します。

マニフェストをクラスタに適用します。

kubectl apply -f helloweb-ingress-static-ip.yaml

ロードバランサに関連付けられている IP アドレスを表示します。

kubectl get ingress

出力は次のようになります。

NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

予約済みの静的 IP アドレスを確認する

ロードバランサが正しく構成されていることを確認するには、ウェブブラウザを使用して IP アドレスにアクセスするか、次のように curl を使用します。

curl http://203.0.113.32/

出力は次のようになります。

Hello, world!
Hostname: helloweb-3766687455-8lvqv

ドメイン名レコードを構成する

ドメイン名(example.com など)またはサブドメイン名(blog.example.com など)を問い合わせるブラウザが、予約した静的 IP アドレスを参照するようにするには、ドメイン名の DNS(ドメイン ネームサーバー)レコードを更新する必要があります。

ドメイン名またはサブドメイン名の A(アドレス)タイプ DNS レコードを作成し、予約済みの IP アドレスでその値を構成する必要があります。

ドメインの DNS レコードはネームサーバーによって管理されます。ネームサーバーは、ドメインを登録した「登録事業者」、Cloud DNS などの DNS サービス、または別のサードパーティ プロバイダの場合があります。

  • ネームサーバーが Cloud DNS の場合: Cloud DNS クイックスタート ガイドに沿って、アプリケーションの予約済み IP アドレスを使用してドメイン名の DNS A レコードを構成します。

  • ネームサーバーが他のプロバイダの場合: DNS A レコードの設定に関する DNS プロバイダのドキュメントを参照して、ドメイン名を構成します。Google Cloud DNS を使用する場合は、Cloud DNS に移行するをご覧ください。

ドメイン名にアクセスする

ドメイン名の DNS A レコードが予約した IP アドレスに解決されることを確認するには、そのドメイン名にアクセスします。

ドメイン名の A レコードに対して DNS クエリを発行するには、次の host コマンドを実行します。

host example.com

出力は次のようになります。

example.com has address 203.0.113.32

これで、ウェブブラウザにドメイン名を指定してウェブサイトにアクセスできるようになりました。