はじめに
この記事は、クラウドネイティブなアプリケーション運用を検討している方、特に Google Cloud を初めて触る方を対象としています。現代のコンテナオーケストレーションの標準である Kubernetes (K8s) を、Google Cloud のフルマネージドサービスである GKE を使って、最も効率的かつ手軽に始める方法を紹介します。
Kubernetes (K8s) の基本と参考文献
Kubernetes は、コンテナ化されたワークロードとサービスを管理するための、ポータブルで拡張可能なオープンソースプラットフォームです。コンテナのデプロイ、スケーリング、管理を自動化し、アプリケーションの信頼性を向上させます。
K8s の詳細な仕組みや概念(Pod, Node, Deployment, Serviceなど)については、以下の公式ドキュメントや信頼できる情報源をご参照ください。
- hogehoge
Google Cloud で Kubernetes を使う選択肢
Google Cloud には、コンテナを実行するためのサービスがいくつかありますが、Kubernetes のフルパワーを活用したい場合は GKE (Google Kubernetes Engine) が最良の選択肢となります。
GKE を選ぶ理由
GKE は、Kubernetes の生みの親である Google が提供するフルマネージドなサービスです。
- 管理の負担軽減: K8s クラスターのコントロールプレーン(マスターノード群)の運用、パッチ適用、アップグレードをすべて Google が自動で行います。ユーザーはノード(Worker)とアプリケーションの管理に集中できます。
- 自動スケーリング: GCP のインフラと統合されており、クラスターオートスケーラーがノード(VM)の数を自動で増減し、コスト効率が向上
- セキュリティ: Google のセキュリティノウハウに基づき、ノードの自動修復やセキュリティパッチの自動適用など、高いレベルでクラスターを保護
GKE の採用ユースケース
- マイクロサービスアーキテクチャの実行: 多数の独立したサービスを安定かつ効率的に連携・運用したい場合。
- 高頻度なデプロイとロールバック: CI/CDパイプラインと連携し、ダウンタイムなしで迅速なアプリケーションの更新を行いたい場合
- ハイブリッド/マルチクラウド戦略: Kubernetes の標準インターフェースを利用し、将来的なクラウド間のポータビリティを確保したい場合
GKE クラスターを作成し、サンプルアプリケーションをデプロイする
本項では Google Cloud Console と Cloud Shell を使用し、初めての方でも簡単にアプリケーションをデプロイする手順を説明します。
環境準備とツールの確認
- Google Cloud プロジェクトの作成: GCP Console から新しいプロジェクトを作成し、課金を有効にします。
- APIの有効化: Kubernetes Engine API を有効にします。
- Cloud Shell の起動: GCP Console 上部のアイコンから Cloud Shell を起動します。これにより、gcloud (GCP管理ツール) と kubectl (K8s管理ツール) がインストールされた環境がすぐに利用できます。
GKE クラスターの作成
GKE クラスターとは、アプリケーションを実行するためのノード(VM)と、それらを管理するコントロールプレーンの集合体です。
Cloud Shell で以下のコマンドを実行し、最もシンプルな構成のクラスターを作成します。(クラスター名、ゾーンは適宜変更してください)
# API 有効化
gcloud container clusters create sample-cluste
# クラスタ作成
gcloud container clusters create sample-cluster \
--zone us-central1-c \
--num-nodes 1 \
--machine-type e2-small
# --num-nodes 1:Workerノードの数を1台に指定(最小構成でコストを抑えます)
# 作成には数分かかります。完了後、以下のコマンドでクラスターへの接続情報を設定
# 認証情報を設定し、kubectlが使えるようにする
gcloud container clusters get-credentials sample-cluster --zone us-central1-c
サンプルアプリケーションのデプロイ
ここでは、外部に "Hello World" を公開するシンプルなウェブアプリケーションをデプロイします。
本記事では Cloud Shell をエディタモードで開き、そこで適当な作業ディレクトリを作成してサンプルアプリケーションを作成しています。
1. Deployment 定義 (deployment.yaml)
アプリケーションの「あるべき姿」(どのコンテナイメージを、いくつ起動するか)を定義します。
Cloud Shell のエディタで以下の内容のファイルを作成し、deployment.yaml として保存します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
replicas: 2 # 2つのPod(コンテナ群)を起動する
selector:
matchLabels:
app: hello-k8s
template:
metadata:
labels:
app: hello-k8s
spec:
containers:
- name: hello-container
image: gcr.io/google-samples/hello-app:1.0 # Googleが提供するサンプルイメージ
ports:
- containerPort: 8080
2. Service 定義 (service.yaml)
外部からアプリケーションへアクセスできるようにするための LB を定義します。
以下の内容のファイルを作成し、service.yaml として保存します。
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
type: LoadBalancer # 外部IPアドレスを持つロードバランサーを作成
selector:
app: hello-k8s # このServiceが対象とするPodのラベル
ports:
- protocol: TCP
port: 80 # サービスが公開するポート
targetPort: 8080 # コンテナがリッスンしているポート
外部公開されてしまうため、動作確認後には削除するようにしてください。
意図せぬ DDoS 攻撃等でクラウド利用料がとんでもないことになりかねません。
3. デプロイ実行と確認
作業ディレクトリ内にて kubectl apply コマンドを実行することで、これらの定義を GKE クラスター内に適用します。
Cloud Shell から kubectl コマンドを実行するために、Google Cloud Console にて、作成したクラスターの右にある 3 点リーダー > 接続、よりコマンドラインアクセスのコマンドをコピーして Cloud Shell 内で実行してください。
# クラスターへ接続
gcloud container clusters get-credentials sample-cluster --zone us-central1-c --project <Google Cloud Project>
# 作業ディレクトリに移動
cd <作業ディレクトリ>
# DeploymentとServiceをクラスターに適用
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
# Podの状態を確認
kubectl get pods
# Serviceの状態を確認
kubectl get services
kubectl get services の実行結果で、hello-service の EXTERNAL-IP の欄に IP アドレスが表示されるまで待ちます(数分かかる場合があります)。IP アドレスが表示されたら、ブラウザでそのアドレスにアクセスしてください。
"Hello, world!" のメッセージが表示されれば、GKE へサンプルアプリケーションのデプロイ成功です。
(どうやら Google 提供のイメージだと hostname が分かるので、負荷分散しているかどうかの確認も出来そうですね)
削除する際には下記コマンドを実行して削除してください。
# DeploymentとServiceをクラスターに適用
kubectl delete -f deployment.yaml
kubectl delete -f service.yaml
# Podの状態を確認 (何も存在しないことを確認)
kubectl get pods
# Serviceの状態を確認 (Type が LoadBalancer のリソースが存在しないことを確認)
kubectl get services
まとめと次のステップ
本記事では、Google Cloud の GKE を利用し、コンテナアプリケーションを Kubernetes 上で実行する最も基本的な手順を体験しました。
GKE の次のステップとしては、以下のような発展的なトピックがあります。
- オートスケーリング: Pod やノードの数をトラフィックに応じて自動で調整する設定
- 永続ストレージ: データベースなど、データを保持する必要があるアプリケーションのための設定(Persistent Volume/Persistent Volume Claim)
- Ingress: 複数のアプリケーションへのアクセスを一つのロードバランサーで管理し、URLパスなどで振り分ける方法
ぜひ、Kubernetes の公式ドキュメントを参照しながら、GKE 上でのクラウドネイティブな開発を進めてみてください。