😸

Introduction to Google Kubernetes Engine

2024/10/16に公開

はじめに

こんにちは、クラウドエースの SRE チームに所属している「申」です。

この記事は2部構成となっており、今回は Google Kubernetes Engine を始める前に知っておくべきことを紹介します。
Google Kubernetes Engine の具体的な使用方法については、Google Kubernetes Engine basicsで紹介いたします。

Kubernetes

Google Kubernetes Engine を始める前にまず、Kubernetes について説明します。

コンテナとは?

初期には、物理サーバーで複数のアプリケーションを実行することでリソース割り当ての問題が発生し、これを解決するために仮想化が導入され、VM[1] を通じてリソースを効率的に活用できるようになりました。しかし、VM は依然として重いため、より軽量化されたコンテナ技術が開発されました。
コンテナはアプリケーション間で OS を共有しながらも隔離性を維持し、迅速なデプロイ、高い移植性、効率的なリソース使用などの利点を提供します。

container_evolution.png

https://kubernetes.io/ja/docs/concepts/overview/

Kubernetesとは?

Kubernetes は、Google が開発したオープンソースのコンテナ管理ツールで、コンテナ化されたアプリケーションの運用と構築を自動化します。このツールは、コンテナの数が増えて管理が複雑になる問題を解決するために作られました。 Kubernetes を使用すると、クラウドやオンプレミス環境でコンテナを簡単に起動でき、高い可用性、拡張性、ロードバランシング、マイクロサービスの管理などを容易に行うことができます。

なぜ k8s と呼ばれるか

Kubernetes は略して k8s と呼ばれます。これは、最初の K と最後の s の間に8文字があるためです。

dockerとの違い

項目 Docker Kubernetes
主な目的 アプリケーションをコンテナ化 コンテナを大規模に管理
実行場所 単一ノード クラスター
利用目的 アプリをコンテナに分離 コンテナ管理のため
機能 アプリケーションをコンテナで実行するプラットフォーム クラスター全体で複数のコンテナを管理・運用するオーケストレーションツール
標準 コンテナ技術の事実上の標準 コンテナおよびクラスターの構築、運用、管理を自動化
主な作業 単一システムで独立して実行されるアプリケーションの作成と実行 複数ノードでのコンテナスケジューリング、ローリングアップデート、スケーリングなど

kubernetesの特徴

  1. 自動化されたデプロイとロールバック

    • Kubernetes はアプリケーションのデプロイと更新プロセスを自動化できます。新しいバージョンのアプリケーションをデプロイする際に問題が発生した場合、自動的にロールバックして安定性を保証します。
  2. 自動スケーリング

    • CPU 使用量やメモリ使用量などのメトリクスに基づいて、自動的にアプリケーションのインスタンスをスケーリングします。これにより、トラフィックの増加に対応し、リソースを効率的に使用できます。
  3. 自己修復 (Self-Healing)

    • コンテナが失敗した場合、自動的に再起動したり、問題のあるコンテナを置き換えたりして、サービスの中断を最小限に抑えます。これにより、システムの可用性と安定性が向上します。
  4. サービスディスカバリとロードバランシング

    • Kubernetes はクラスター内でサービスディスカバリとロードバランシングを自動的に処理します。これにより、アプリケーション間の通信を簡単に設定できます。
  5. ストレージオーケストレーション

    • ローカルストレージ、クラウドストレージ、ネットワークストレージなど、さまざまなストレージソリューションを統合して使用できます。これにより、アプリケーションのデータストレージ要件を柔軟に処理できます。
  6. 構成管理

    • ConfigMap や Secret を使用してアプリケーション設定を外部化し、機密データを安全に管理できます。これにより、アプリケーションの設定を簡単に変更し、セキュリティを強化できます。
  7. マルチクラスター管理

    • 複数の Kubernetes クラスターを管理し、クラスター間でワークロードを分散させることができます。これにより、高い可用性と拡張性を維持できます。
  8. 拡張性

    • Kubernetes は数千のノードと数万のコンテナを管理できる拡張性を提供します。これにより、大規模なアプリケーションを効率的に運用できます。
  9. マルチクラウドおよびハイブリッドクラウド対応

    • Google CloudAzureAWS などのさまざまなクラウド環境とオンプレミス環境を混在させたハイブリッドクラウドアーキテクチャをサポートします。これにより、クラウドプロバイダーへの依存を減らし、柔軟なインフラ構成が可能になります。

kubernetes基本概念

まず Kubernetes を理解する前に、知っておくべき単語たちです。

node-pod-cluster.jpg

  1. クラスター (Cluster)

    • Kubernetes クラスターは、コンテナ化されたアプリケーションを実行するためのノードの集合です。クラスターはマスターノードとワーカーノードで構成されます。
  2. ノード (Node)

    • ノードはクラスター内で作業を行う単位です。一般的にマスターノードとワーカーノードに分かれます。マスターノードはクラスターを管理し、ワーカーノードは実際のアプリケーションを実行します。
  3. ポッド (Pod)

    • Pod は Kubernetes で最小のデプロイ単位です。1 つ以上のコンテナを含むことができ、同じネットワークネームスペースを共有します。

  1. デプロイメント (Deployment)

    • Deployment はアプリケーションを定義し管理する方法です。アプリケーションの状態を定義し、それを維持するために Kubernetes が自動的に作業を行います。
  2. サービス (Service)

    • Service はクラスター内で実行中のPodへのネットワークアクセスを提供する抽象的な方法です。これにより、Pod の IP アドレスが変更されても一貫したネットワークアクセスが保証されます。
  3. ネームスペース (Namespace)

    • Namespace はクラスター内でリソースを論理的に区分する方法です。これにより、複数のチームやプロジェクトが同じクラスターを安全に共有できます。
  4. コンフィグマップ (ConfigMap)

    • ConfigMap は環境設定データを保存し管理する方法です。これにより、アプリケーションの設定をコードから分離して管理できます。
  5. シークレット (Secret)

    • Secret はパスワード、トークン、キーなどの機密データを保存し管理する方法です。これにより、これらのデータを安全に管理できます。
  6. ボリューム (Volume)

    • Volume は Pod 内のコンテナがデータを共有し持続的に保存する方法です。さまざまな種類のボリュームがサポートされています。
  7. イングレス (Ingress)

    • Ingress はクラスター外部から内部サービスへの HTTP および HTTPS リクエストを管理する方法です。これにより、複雑なルーティングルールを定義できます。

Kubernetesリソースタイプ

Kubernetes リソースタイプには色々あります。

リソースタイプ 説明
Pod Kubernetes で最小のデプロイ単位で、一つ以上のコンテナを含むことができます。
Service クラスター内外からアクセス可能なネットワークエンドポイントを提供します。
Deployment アプリケーションのレプリカを作成および管理し、可用性と拡張性を保証します。
StatefulSet 状態を持つアプリケーションを管理します。
DaemonSet クラスター内のすべてのノードで実行されるポッドを管理します。
Job 一度だけ実行されるタスクを管理します。
CronJob 定期的に実行されるタスクを管理します。
ConfigMap アプリケーションの設定データを保存および管理します。
Secret パスワードやAPIキーなどの機密情報を安全に保存および管理します。
PersistentVolume (PV) クラスターで管理されるストレージリソースです。
PersistentVolumeClaim (PVC) PV を要求して使用できるようにするリソースです。
Ingress 外部のHTTPおよびHTTPSトラフィックをクラスター内の特定のサービスにルーティングします。
HorizontalPodAutoscaler (HPA) CPU やメモリの使用率に基づいてポッドの数を自動的にスケーリングします。
NetworkPolicy ポッド間のネットワークトラフィックを制御します。
ReplicaSet 特定の数のポッドを維持することを保証します。
Endpoint サービスと接続されたポッドのネットワーク情報を保存します。
Namespace クラスター内のリソースを論理的に分離します。
ResourceQuota ネームスペース内で使用できるリソースの量を制限します。
LimitRange ネームスペース内でポッドやコンテナが使用できるリソースの最大値と最小値を定義します。
Role および ClusterRole RBAC(Role-Based Access Control)を通じてリソースへのアクセス権限を定義します。
RoleBinding および ClusterRoleBinding ユーザーやサービスアカウントに役割をバインドします。

などがあります。
今回は代表的に 5 つを紹介したいと思います。

Pod

Pod は、Kubernetes で最も小さいデプロイ単位であり、1 つ以上のコンテナを含むことができます。
Pod は同じネットワークネームスペースとストレージを共有するコンテナのグループです。これにより、アプリケーションのさまざまな構成要素を1つの論理単位としてまとめることができます。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx:latest
    ports:
    - containerPort: 80

apiVersion: リソースのAPIバージョンです。
kind: リソースの種類です。ここでは Pod です。
metadata: リソースのメタデータで、名前やネームスペースなどを定義します。
spec: リソースの仕様(構成)です。ここにはコンテナのリストが含まれます。
containers: Pod 内で実行されるコンテナのリストです。
image: コンテナイメージです。ここでは nginx:latest を使用します。
ports: コンテナが使用するポートです。ここでは 80 ポートを使用します。

service

Service は、クラスター内外からアクセス可能なネットワークエンドポイントを提供します。
Service はロードバランシングを通じてトラフィックを複数の Pod に分散させます。これにより、Pod の IP アドレスが変更されても安定したネットワークアクセスを保証します。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

apiVersion: リソースの API バージョンです。
kind: リソースの種類です。ここでは Service です。
metadata: リソースのメタデータで、名前やネームスペースなどを定義します。
spec: リソースの仕様(構成)です。
**selector: サービスがトラフィックをルーティングする Pod を選択するために使用されるラベルです。
ports: サービスが公開するポートです。
type: サービスの種類です。ここでは LoadBalancer として設定し、外部アクセスを許可します。

Deployment

Deployment は、アプリケーションのレプリカを作成および管理し、可用性と拡張性を保証します。
Deployment は Pod の作成、更新、削除を管理し、ローリングアップデートおよびロールバック機能を提供します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: nginx:latest
        ports:
        - containerPort: 80

apiVersion: リソースの API バージョンです。
kind: リソースの種類です。ここでは Deployment です。
metadata: リソースのメタデータで、名前やネームスペースなどを定義します。
spec: リソースの仕様(構成)です。
replicas: 作成する Pod のレプリカ数です。
selector: Deployment が管理する Pod を選択するために使用されるラベルです。
template: 作成する Pod のテンプレートです。
containers: Pod 内で実行されるコンテナのリストです。
image: コンテナイメージです。ここでは nginx:latest を使用します。
ports: コンテナが使用するポートです。ここでは 80 ポートを使用します。

ConfigMap

ConfigMap は、アプリケーションの設定データを保存および管理します。
ConfigMap を使用すると、アプリケーションの設定をコードから分離でき、設定変更時にアプリケーションを再デプロイせずに更新できます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  APP_ENV: "production"
  LOG_LEVEL: "info"

apiVersion: リソースの API バージョンです。
kind: リソースの種類です。ここでは ConfigMap です。
metadata: リソースのメタデータで、名前やネームスペースなどを定義します。
data: 設定データです。キーと値のペアで保存されます。

Secret

Secret は、パスワードや API キーなどの機密情報を安全に保存および管理します。
Secret は ConfigMap と似ていますが、機密情報を base64 でエンコードして保存します。

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  DB_PASSWORD: dXNlcl9wYXNzd29yZA==  # base64エンコードされた値

apiVersion: リソースの API バージョンです。
kind: リソースの種類です。ここでは Secret です。
metadata: リソースのメタデータで、名前やネームスペースなどを定義します。
type: Secret の種類です。ここでは Opaque として設定し、一般的なキーと値のペアを保存します。
data: 機密情報です。base64 でエンコードされた値で保存されます。

Google Kubernetes Engine

Google Kubernetes Engineとは

Google Kubernetes Engine は、Google Cloud が提供する管理された Kubernetes サービスです。
Google Kubernetes Engine を使用すると、Kubernetes クラスターを簡単に設定、管理、拡張することができます。
Google Kubernetes Engine は Google のインフラストラクチャを基盤にしており、高い可用性と拡張性を提供し、Kubernetes のすべての機能を活用できるようにサポートします。

Cloud Runとの違い

Cloud Run は、コンテナ化されたアプリケーションをサーバーレス方式で実行できるサービスです。
Google Kubernetes EngineCloud Run の主な違いは次のとおりです:

  • 管理方式: Google Kubernetes Engine はユーザーがクラスターとノードを直接管理する必要がありますが、Cloud Run は完全なサーバーレス環境を提供し、インフラストラクチャの管理が不要です。
  • 拡張性: Google Kubernetes Engine はクラスター内で数千のノードと数万のコンテナを管理できますが、Cloud Run はリクエストに応じて自動的に拡張し、使用した分だけ料金を支払います。
  • 使用ケース: Google Kubernetes Engine は複雑なアプリケーションやマイクロサービスアーキテクチャの運用に適しており、Cloud Run はシンプルなウェブアプリケーションや API を迅速にデプロイするのに適しています。

Google Kubernetes Engineの機能

  1. 自動化されたクラスター管理
  • Google Kubernetes Engine はクラスターの作成、アップグレード、スケーリングなどを自動化し、管理の負担を軽減します。
  1. 高可用性および復旧機能
  • Google Kubernetes Engine は複数のリージョンにわたってクラスターを分散させ、高可用性を提供し、障害が発生した場合には自動的に復旧します。
  1. 自動スケーリング
  • Google Kubernetes Engine はクラスターのリソース使用量に基づいて自動的にノードを追加または削除し、効率的なリソース使用を保証します。
  1. セキュリティおよび規制遵守
  • Google Kubernetes Engine は Google Cloud のセキュリティ機能を活用してクラスターとアプリケーションを保護します。また、さまざまな規制遵守要件を満たすことができます。
  1. 統合モニタリングおよびロギング
  • Google Kubernetes Engine は Google Cloud のモニタリングおよびロギングツールと統合されており、クラスターとアプリケーションの状態をリアルタイムでモニタリングし、ログを分析できます。

Google Kubernetes Engineの長所

  1. 管理の容易さ
  • Google Kubernetes Engine は Kubernetes クラスターの作成と管理を自動化し、ユーザーがインフラ管理に費やす時間を削減します。
  1. 拡張性
  • Google Kubernetes Engine は数千のノードと数万のコンテナを管理できる拡張性を提供し、大規模なアプリケーションを運用できます。
  1. コスト効率
  • Google Kubernetes Engine は使用した分だけ料金を支払う方式で運用され、コスト効率を提供します。
  1. 統合されたエコシステム
  • Google Kubernetes Engine は Google Cloud のさまざまなサービスと統合されており、アプリケーションの開発および運用のための総合的なソリューションを提供します。
  1. コミュニティサポート
  • Kubernetes はオープンソースプロジェクトとして活発なコミュニティのサポートを受けており、最新技術と機能を迅速に導入できます。

終わり

次の記事 Google Kubernetes Engine basics では、Google Kubernetes Engine の使用方法を画面を使って説明いたします。

脚注
  1. 仮想マシン (VM) とは?
    仮想マシン(VM, Virtual Machine)は、物理的なコンピュータ(ホストマシン)内でソフトウェア的に実装されたコンピュータシステムです。
    VM は物理的ハードウェアと独立して動作し、実際のコンピュータと同じ機能を果たします。これにより、一つの物理的サーバーで複数の VM を実行することができます。 ↩︎

Discussion