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

このチュートリアルでは、静的外部 IP アドレスでウェブ アプリケーションをインターネットに公開し、そのアプリケーションを指すようにドメイン名の DNS レコードを設定する方法を示します。

このチュートリアルでは、登録済みのドメイン名(example.com など)を所有していることを前提とします。ドメインをお持ちでない場合は、Google Domains または他のお好きなドメイン登録事業者を通じてドメイン名を登録できます。

目標

このチュートリアルでは次の手順について説明します。

  • アプリケーション用の静的外部 IP アドレスを予約する
  • 静的 IP を使用するように Service リソースまたは Ingress リソースを構成する
  • アプリケーションを指すようにドメイン名の DNS レコードを更新する

始める前に

次の手順で Kubernetes Engine API を有効にします。
  1. Google Cloud Platform Console で [Kubernetes Engine] ページにアクセスします。
  2. プロジェクトを作成または選択します。
  3. API と関連サービスが有効になるのを待ちます。これには数分かかることがあります。
  4. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

このチュートリアルで使用されている以下のコマンドライン ツールをインストールします。

  • Kubernetes Engine クラスタを作成および削除するには、gcloud を使用します。gcloudGoogle Cloud SDK に含まれています。
  • kubectl は、Kubernetes Engine で使用されるクラスタ オーケストレーション システムである Kubernetes を管理するために使用されます。gcloud を使用して kubectl をインストールできます。
    gcloud components install kubectl

gcloud コマンドライン ツールのデフォルトを設定する

次のコマンドを実行してデフォルト値を設定しておくと、gcloud コマンドライン ツールでプロジェクト IDCompute Engine ゾーンの各オプションを入力する時間を節約できます。
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

GKE クラスタを作成する

domain-test という名前のコンテナ クラスタを作成して、ウェブ アプリケーションをデプロイします。

gcloud container clusters create domain-test

ステップ 1: ウェブ アプリケーションをデプロイする

サンプル ウェブ アプリケーションをデプロイするには、次のマニフェストを helloweb-deployment.yaml として保存します。

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: gcr.io/google-samples/hello-app:1.0
        ports:
        - containerPort: 8080

その後、次のコマンドを実行して Deployment を作成します。

kubectl apply -f helloweb-deployment.yaml

ステップ 2: アプリケーションを公開する

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

それぞれの方法の長所と短所については、HTTP 負荷分散チュートリアルをご覧ください。

ステップ 2(a): Service を使用する

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

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

us-central1 リージョンで helloweb-ip という名前の静的 IP アドレスを作成するには、次のコマンドを実行します。

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

作成した静的 IP アドレスを見つけるには、次のコマンドを実行します。

gcloud compute addresses describe helloweb-ip --region us-central1
出力:
address: 203.0.113.32
...

次のマニフェストを使用して、サービスを記述する helloweb- service.yaml という名前のマニフェスト ファイルを作成します。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.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

ステップ 2(b): Ingress を使用する

HTTP(S) ロードバランサを作成する Ingress を使ってアプリケーションを公開する場合は、グローバル静的 IP アドレスを予約する必要があります。リージョン IP アドレスは Ingress では機能しません。

Ingress を使用してアプリケーションをインターネットに公開する方法については、Ingress を使用した HTTP 負荷分散チュートリアルをご覧ください。

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

gcloud compute addresses create helloweb-ip --global

作成した静的 IP アドレスを見つけるには、次のコマンドを実行します。

gcloud compute addresses describe helloweb-ip --global
出力:
address: 203.0.113.32
...

Ingress を使用して静的 IP でウェブ アプリケーションを公開するには、次の 2 つのリソースをデプロイする必要があります。

  1. type:NodePort を使用した Service
  2. サービス名と静的 IP アノテーションで構成された Ingress

次のマニフェストを使用して、これら 2 つのリソースを記述した helloweb-ingress.yaml という名前のマニフェスト ファイルを作成します。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: helloweb
  annotations:
    kubernetes.io/ingress.global-static-ip-name: helloweb-ip
  labels:
    app: hello
spec:
  backend:
    serviceName: helloweb-backend
    servicePort: 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 アノテーションは、HTTP(S) ロードバランサに関連付けるグローバル IP アドレス リソースの名前を指定します。

helloweb-ingress.yaml マニフェスト ファイルをクラスタに適用します。

kubectl apply -f helloweb-ingress.yaml
出力:
ingress "helloweb" created
service "helloweb-backend" created

ロードバランサに関連付けられた予約済みの IP アドレスを確認するには、次のようにします。

kubectl get ingress
出力:
NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

ステップ 3: 予約済みの静的 IP アドレスにアクセスする

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

curl http://203.0.113.32
出力:
Hello, world!
Hostname: helloweb-3766687455-8lvqv

ステップ 4: ドメイン名レコードを構成する

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

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

ドメインの DNS レコードはネームサーバーによって管理されます。ネームサーバーは、ドメインが登録された場所(つまり、「登録事業者」)にすることも、Google Cloud DNS やその他のサードパーティ プロバイダなどの DNS サービスにすることもできます。

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

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

ステップ 5: ドメイン名にアクセスする

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

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

host example.com
出力:
example.com has address 203.0.113.32

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

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. 負荷分散リソースを削除します。

    kubectl delete ingress,service -l app=hello

  2. 予約済みの静的 IP を解放します。ロードバランサを削除すると、未使用にはなっても予約済みである IP アドレスが無料ではなくなり、未使用の IP アドレスの料金に従って課金されます。静的 IP リソースを解放するには、次のコマンドを実行します。

    • ステップ 2(a) に従った場合:

      gcloud compute addresses delete helloweb-ip --region us-central1
    • ステップ 2(b) に従った場合:

      gcloud compute addresses delete helloweb-ip --global
  3. サンプル アプリケーションを削除します。

    kubectl delete -f helloweb-deployment.yaml

  4. 次のコマンドの出力を監視して、ロードバランサが削除されるまで待ちます(出力には、名前に "helloweb" を含む転送ルールが表示されなくなるはずです)。

    gcloud compute forwarding-rules list

  5. コンテナ クラスタを削除します。

    gcloud container clusters delete domain-test

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のチュートリアル