うさぎでもわかる Google Kubernetes Engine (GKE) 入門
うさぎでもわかる Google Kubernetes Engine (GKE) 入門
こんにちは、みなさん!今回は Google Kubernetes Engine (GKE) というサービスについて、初心者の方でもわかりやすく解説していきます。
「Kubernetes って難しそう...」「コンテナってよく聞くけどよくわからない...」そんな声をよく聞きますが、大丈夫ですぴょん!この記事を読めば、GKEの基本から実際のアプリケーションデプロイまでマスターできますよ。
1. GKEとは何か
Google Kubernetes Engine (GKE) は、Google Cloud が提供するマネージド Kubernetes サービスです。Kubernetes自体は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースプラットフォームですが、自分でKubernetesクラスターを構築・運用するのは結構大変です。
そこでGKEの登場です!GKEを使えば、Google Cloud のインフラ上にKubernetesクラスターを簡単に作成し、Google が管理してくれるので運用の手間が大幅に削減されます。
GKEの主な特徴は次のとおりです
- マネージドサービスなので運用の負担が少ない
- クラスターの自動スケーリングが可能
- Google Cloud の他のサービスとの統合が容易
- セキュリティ対策が充実している
- 最新のKubernetesバージョンへの自動アップグレードが可能
2. Kubernetesの基本概念
GKEを理解するには、まずKubernetesの基本概念を知っておく必要があります。うさぎさん目線で簡潔に説明しますぴょん!
コンテナオーケストレーションとは
コンテナ(Dockerなど)を使ったアプリケーションを大規模に運用する場合、多数のコンテナを管理・調整する必要がありますが、これを自動化するのがコンテナオーケストレーションです。Kubernetesはその代表的なツールです。
これは、うさぎさんたちが畑でニンジンを育てるとき、種まき、水やり、収穫など様々な作業を調整して管理するようなものですぴょん。
Podとは
Kubernetesの最小デプロイ単位で、一つ以上のコンテナのグループです。同じPod内のコンテナは同じノード上で実行され、ストレージとネットワークを共有します。
うさぎさんの巣穴に例えると、一つの巣穴(Pod)の中に複数のうさぎ(コンテナ)が住んでいるイメージですぴょん。
Deploymentとは
複数のPodのレプリカを作成・管理するためのリソースで、スケーリングやローリングアップデートなどの機能を提供します。
これは、うさぎさんの集落を管理するリーダーうさぎのようなものですぴょん。何匹のうさぎが必要か、どの巣穴に住まわせるかなどを決めます。
Serviceとは
Podへのネットワークアクセスを提供するリソースです。Podは動的に作成・削除されるため、ServiceがPodへのアクセスを安定させます。
これは、うさぎさんの集落への訪問者が特定のうさぎを探す時に案内してくれる案内係のようなものですぴょん。
その他の重要なリソース
- Namespace リソースをグループ化する仮想的なクラスター
- ConfigMap/Secret 設定情報や機密情報を管理
- PersistentVolume 永続的なデータストレージ
- Ingress 外部からのHTTPトラフィックをルーティング
3. GKEの基本構成
GKEクラスターは、コントロールプレーンとノードという2つの主要コンポーネントで構成されています。
コントロールプレーンとノード
- コントロールプレーン クラスターの管理を担当するコンポーネントで、GKEではGoogle側で管理されます。APIサーバー、スケジューラー、コントローラーマネージャーなどが含まれます。
- ノード 実際にコンテナを実行するワーカーマシンで、Compute Engine VMインスタンスです。各ノードには、コンテナランタイム(Docker など)とkubeletというKubernetesエージェントが実行されています。
Standardモードとは
従来のGKEモードで、ノードプールの構成や管理を細かく制御できます。ノードの数やマシンタイプを指定し、手動でスケーリングや管理を行えますが、その分管理の手間がかかります。
Autopilotモードとは
2021年に導入された新しいモードで、ノード管理が完全に自動化されています。ユーザーはワークロード(Pod)の定義だけを行い、必要なリソースは自動的にプロビジョニングされます。運用の手間が大幅に削減され、コスト最適化も自動的に行われるため、多くの場合で推奨されます。
うさぎさんで例えると、Standardモードは自分で巣穴を掘り管理するのに対して、Autopilotモードは巣穴の管理を全て任せて、自分はニンジンを食べることだけに集中できるようなものですぴょん。
ノードプールの概念
同じ構成を持つノードのグループをノードプールと呼びます。GKE Standardモードでは複数のノードプールを作成でき、それぞれ異なるマシンタイプやGPUなどを持たせることができます。これにより、ワークロードに応じた最適なリソース割り当てが可能になります。
4. GKEクラスターの作成
では、実際にGKEクラスターを作成してみましょう!
前提条件(Google Cloudアカウント、APIの有効化)
- Google Cloudアカウントを持っていない場合は、新規登録してプロジェクトを作成します
- プロジェクトに課金を有効化します(新規ユーザーは無料枠を利用できます)
- Google Kubernetes Engine APIを有効化します
gcloud services enable container.googleapis.com
Cloud Shellを使った環境準備
Google Cloud Consoleからアクセスできる「Cloud Shell」を使うと、ブラウザからコマンドラインツールを使えるので便利です。必要なツールは全て事前にインストールされています。
ローカル環境で操作する場合は、Google Cloud SDKとkubectlをインストールし、適切に設定する必要があります。
Autopilotクラスターの作成
今回は簡単で運用負荷の少ないAutopilotモードでクラスターを作成します
gcloud container clusters create-auto my-first-cluster \
--region=us-central1
これで実行すると、数分後にAutopilotクラスターが作成されます。クラスター作成が完了するまで5〜10分ほどかかるので、気長に待ちましょうぴょん。
クラスターへの接続
クラスターができたら、kubectlで接続するための認証情報を取得します
gcloud container clusters get-credentials my-first-cluster --region=us-central1
このコマンドを実行すると、kubectlコマンドでクラスターを操作できるようになります。次のコマンドで接続確認ができます
kubectl get nodes
5. サンプルアプリケーションのデプロイ
クラスターができたので、実際にアプリケーションをデプロイしてみましょう!
サンプルアプリケーションの準備
今回はGoogle提供のサンプルアプリケーション「hello-app」を使います。このアプリはシンプルなWebサーバーで、アクセスするとメッセージを表示します。
独自のアプリケーションを使う場合は、Dockerコンテナにパッケージングし、Container Registryにプッシュする必要があります。
Deploymentの作成
まずはDeploymentを作成しましょう。以下の内容をdeployment.yaml
ファイルに保存します
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
spec:
replicas: 3
selector:
matchLabels:
app: hello-app
template:
metadata:
labels:
app: hello-app
spec:
containers:
- name: hello-app
image: gcr.io/google-samples/hello-app:1.0
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
そして、次のコマンドで適用します
kubectl apply -f deployment.yaml
これにより、3つのPodが作成され、それぞれでhello-appコンテナが実行されます。
Serviceの作成と公開
次に、アプリケーションを外部に公開するためのServiceを作成します。以下の内容をservice.yaml
ファイルに保存します
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
そして、次のコマンドで適用します
kubectl apply -f service.yaml
type: LoadBalancer
を指定することで、Google Cloud Load Balancerが自動的に作成され、外部IPアドレスが割り当てられます。
アプリケーションへのアクセス確認
Serviceが作成されたら、割り当てられた外部IPアドレスを確認します
kubectl get services hello-service
EXTERNAL-IP
列に表示されるIPアドレスにWebブラウザでアクセスすると、「Hello, World!」というメッセージが表示されるはずです。おめでとうございますぴょん!これでGKEにアプリケーションをデプロイすることができました。
6. GKEの運用管理
アプリケーションをデプロイした後は、運用管理も重要です。GKEでは以下のような機能が提供されています。
モニタリングとログ収集
GKEはGoogle Cloud Operationsと統合されており、以下の機能を提供します
- Cloud Monitoring クラスターとワークロードのメトリクスを収集・分析
- Cloud Logging コンテナのログを一元管理
- Error Reporting アプリケーションのエラーを集約
コンソールの「Kubernetes Engine」→「クラスター」からモニタリングダッシュボードにアクセスできます。
オートスケーリング
GKEには複数のスケーリングオプションがあります
- 水平Pod自動スケーリング (HPA) CPU使用率などに基づいてPodの数を自動調整
- 垂直Pod自動スケーリング (VPA) Podのリソース要求を自動調整
- クラスターオートスケーラー ワークロードに基づいてノードの数を自動調整
AutopilotモードではこれらのスケーリングがGoogleによって管理されます。
クラスターのアップグレード
GKEでは定期的にKubernetesバージョンのアップグレードが提供されます
- 自動アップグレード メンテナンスウィンドウ内で自動的にアップグレード
- 手動アップグレード タイミングを制御して手動でアップグレード
Autopilotモードでは自動アップグレードが基本ですが、リリースチャンネル(Rapid、Regular、Stable)を選択できます。
セキュリティのベストプラクティス
GKEにおけるセキュリティベストプラクティスには以下のようなものがあります
- Workload Identity GCPサービスアカウントとKubernetesサービスアカウントを統合
- Binary Authorization 承認されたコンテナイメージのみデプロイを許可
- Container-Optimized OS セキュリティが強化されたノードOS
- Secret管理 機密情報を安全に管理
この他に、ネットワークポリシーやPodセキュリティポリシーなどを設定することで、セキュリティを強化できます。
7. GKEのコスト最適化
クラウドサービスを利用する上で重要なのがコスト管理です。GKEでは以下のような最適化が可能です。
GKEの料金体系
GKEの料金は主に以下の要素で構成されます
- クラスター管理料金 コントロールプレーンの費用(Autopilotは不要)
- コンピューティングリソース ノードとして使用されるCompute Engineインスタンスの費用
- ストレージ 永続ディスクやGCSバケットなどのストレージ費用
- ネットワーク データ転送や負荷分散の費用
Autopilotモードではポッドレベルで課金され、使用したリソースに対してのみ支払いが発生します。
Spot VMの活用
非本番環境やバッチ処理など、中断許容型のワークロードでは、大幅に割引されたSpot VM(以前のPreemptible VM)を利用することで、最大91%のコスト削減が可能です。
# Standardモードでのスポットノードプールの作成例
gcloud container node-pools create spot-pool \
--cluster=my-cluster \
--spot \
--machine-type=e2-standard-4
リソース要求と制限の最適化
コンテナには適切なリソース要求(requests)と制限(limits)を設定することが重要です
resources:
requests:
cpu: 100m # 0.1 CPU
memory: 128Mi
limits:
cpu: 200m # 0.2 CPU
memory: 256Mi
リソース要求が少なすぎるとパフォーマンス問題が発生し、多すぎるとコストが増加します。実際の使用量をモニタリングして調整していくことが大切です。
自動スケーリングによるコスト削減
- 水平Pod自動スケーリング 負荷に応じてPod数を調整
- クラスターオートスケーラー 未使用のノードを自動的に削減
- マルチテナンシー 複数のアプリケーションを同じクラスターで実行
こうした機能を活用することで、リソースの無駄を減らしコストを最適化できます。
8. まとめと次のステップ
いかがでしたか?この記事では、GKEの基本から実際のアプリケーションデプロイまでを幅広く解説しました。
GKEを使うことで、Kubernetesの複雑さを抽象化し、スケーラブルで信頼性の高いアプリケーション実行環境を簡単に構築できます。特にAutopilotモードを使えば、運用の負担を大幅に減らしながら、Kubernetesのメリットを享受できます。
ここからさらに学習を進めるには、以下のようなトピックがおすすめですぴょん
- CI/CDパイプラインとの統合
- マイクロサービスアーキテクチャの実装
- Istioなどのサービスメッシュの導入
- Prometheusによる高度なモニタリング
Google Cloud のドキュメントやチュートリアルも充実しているので、ぜひチェックしてみてください
GKEを使って、みなさんのアプリケーションが跳躍的に成長することを願っていますぴょん!
Discussion