このチュートリアルでは、Google Kubernetes Engine(GKE)を使用して、静的外部 IP アドレスでウェブ アプリケーションをインターネットに公開し、そのアプリケーションを指すドメイン名を構成する方法を説明します。
このチュートリアルでは、example.com
などの登録済みのドメイン名を所有していることを前提としています。
目標
このチュートリアルでは次の手順について説明します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
次の手順で Kubernetes Engine API を有効にします。- Google Cloud コンソールの Kubernetes Engine ページにアクセスします。
- プロジェクトを作成または選択します。
- API と関連サービスが有効になるのを待ちます。 これには数分かかることがあります。
-
Make sure that billing is enabled for your Google Cloud project.
このチュートリアルで使用されている以下のコマンドライン ツールをインストールします。
-
gcloud
は、Kubernetes Engine クラスタの作成と削除に使用されます。gcloud
はgcloud
CLI に含まれています。 -
kubectl
は、Kubernetes Engine で使用されるクラスタ オーケストレーション システムである Kubernetes の管理に使用されます。gcloud
を使用してkubectl
をインストールできます。gcloud components install kubectl
GitHub からサンプルコードのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/quickstarts/hello-app/manifests
gcloud
コマンドライン ツールのデフォルト値を設定する
次のようにしてデフォルト値を設定しておくと、gcloud
コマンドライン ツールでプロジェクト ID および Compute Engine ゾーン オプションを入力する時間が節約されます。gcloud config set project project-id gcloud config set compute/zone compute-zone
クラスタを作成する
クラスタを作成します。
gcloud container clusters create-auto domain-test
ウェブ アプリケーションをデプロイする
以下のマニフェストは、サンプルのウェブ アプリケーション コンテナ イメージを実行する Deployment を説明しています。
Deployment を作成します。
kubectl apply -f helloweb-deployment.yaml
アプリケーションを公開する
次のいずれかの方法を使用して、アプリケーションを GKE に公開できます。
Service を使用して、リージョン IP アドレスで動作する外部パススルー ネットワーク ロードバランサを作成します。
Ingress を使用して、アプリケーション ロードバランサを作成し、グローバル IP アドレスをサポートします。
各方法のメリットとデメリットの詳細については、Ingress を使用して外部アプリケーション ロードバランサを設定するをご覧ください。
Service を使用する
アプリケーションに静的外部 IP アドレスが割り当てられていることを保証するには、静的 IP アドレスを予約する必要があります。
Service を使用してアプリケーションを公開する場合は、リージョン IP アドレスを作成する必要があります。次のセクションで説明するように、グローバル IP アドレスは Ingress リソースタイプでのみ機能します。
Service を使用するには、リージョン us-central1
に helloweb-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 をクラスタにインストールするには、インストール手順を実施してください。
マニフェストを 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 アドレスに置き換えます。
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 をクラスタにインストールするには、インストール手順を実施してください。
マニフェストを compute-address-global.yaml
として保存します。
マニフェストをクラスタに適用します。
kubectl apply -f compute-address-global.yaml
以下のマニフェストに記述されている Ingress は、次の 2 つのリソースを持つ静的 IP でウェブ アプリケーションを公開します。
type:NodePort
を使用したService
- サービス名と静的 IP アノテーションで構成された
Ingress
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
これで、ウェブブラウザにドメイン名を指定してウェブサイトにアクセスできるようになりました。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
Service と Ingress を削除します。
kubectl delete ingress,service -l app=hello
予約済みの静的 IP を解放します。ロードバランサが削除されると、未使用の予約済み IP アドレスは、未使用の IP アドレスの料金に従って課金されます。
Service を使用した場合:
gcloud compute addresses delete helloweb-ip --region us-central1
Ingress を使用した場合:
gcloud compute addresses delete helloweb-ip --global
サンプル アプリケーションを削除します。
kubectl delete -f helloweb-deployment.yaml
クラスタを削除します。
gcloud container clusters delete domain-test
次のステップ
- Kubernetes Engine のチュートリアルを調べる。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。