跳到主要内容

Kubernetes基礎

Kubernetes(K8s)は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースプラットフォームです。本ドキュメントでは、Kubernetesの基本概念と主要なリソース、そしてAzure Kubernetes Service (AKS) 特有のアーキテクチャについて解説します。

Kubernetesとは

Kubernetesは、Googleが社内で使用していたBorgシステムから得た知見を基に開発されました。複数のホスト(ノード)を束ねてクラスタを構成し、その上でコンテナを効率的に稼働させるためのオーケストレーションツールです。

主な機能:

  • サービスディスカバリと負荷分散: コンテナへのトラフィックを分散します。
  • ストレージオーケストレーション: ローカルストレージやクラウドプロバイダーのストレージを自動的にマウントします。
  • 自動ロールアウトとロールバック: アプリケーションの更新を段階的に行い、問題があれば元に戻します。
  • 自己修復 (Self-healing): 失敗したコンテナを再起動し、応答しないコンテナを置き換えます。

AKSのアーキテクチャとMC_リソースグループ

Azure Kubernetes Service (AKS) は、Azureが提供するマネージドKubernetesサービスです。AKSを使用すると、コントロールプレーン(マスターノード)の管理をAzureに任せることができます。

コントロールプレーンとノード

  • コントロールプレーン: Azureによって管理され、無償で提供されます(SLA付きのStandard Tierを除く)。APIサーバー、スケジューラー、etcdなどが含まれます。
  • ノード(エージェントプール): ユーザーのアプリケーションが実際に動作する仮想マシンです。これらはユーザーのサブスクリプション内に作成されます。

システムノードとユーザーノード

AKSのノードプールには、役割に応じて2つのモードがあります。

  • システムノードプール (System Node Pool):
    • CoreDNSやMetrics Serverなどの重要なシステムPodをホストします。
    • AKSクラスタには少なくとも1つのシステムノードプールが必要です。
    • OSはLinuxのみサポートされます。
  • ユーザーノードプール (User Node Pool):
    • ユーザーのアプリケーションPodをホストするためのノードプールです。
    • 必要に応じて複数のユーザーノードプールを作成できます。
    • LinuxおよびWindowsノードがサポートされます。

MC_リソースグループについて

AKSクラスタを作成すると、指定したリソースグループとは別に、自動的にノードリソースグループが作成されます。デフォルトの命名規則は MC_<ResourceGroupName>_<ClusterName>_<Location> です。

この MC_ リソースグループには、クラスタの動作に必要な以下のAzureリソースが自動的に配置されます:

  1. Virtual Machine Scale Sets (VMSS): ノードプールを構成する仮想マシン群。
  2. Virtual Network (VNet) & Subnets: ノード間の通信や外部との接続を提供するネットワーク(BYO VNetを使用しない場合)。
  3. Load Balancer: Service (type: LoadBalancer) や Ingress Controller へのトラフィックを分散するためのロードバランサー。
  4. Network Security Groups (NSG): 通信制御を行うセキュリティグループ。
  5. Managed Identities: AKSが他のAzureリソース(ACRやNetworkなど)を操作するためのID。
  6. Public IP Addresses: 外部公開用のIPアドレス。
  7. Disks: Persistent Volume (PV) として使用されるManaged Disks。
注意

この MC_ リソースグループ内のリソースを直接手動で変更・削除すると、AKSクラスタが正常に動作しなくなる可能性があります。原則として、KubernetesのマニフェストやAzure CLI/PortalのAKS管理画面を通じて操作してください。

主要リソース (Key Resources)

Kubernetesでは、クラスタの状態を定義するために「オブジェクト」または「リソース」を使用します。これらは通常、Manifest (マニフェスト) と呼ばれるYAML形式のファイルで定義されます。

Manifest (マニフェスト)

Kubernetesリソースの「あるべき状態(Desired State)」を記述した設定ファイルです。kubectl apply -f <filename>.yaml コマンドなどでクラスタに適用します。

apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx:latest

Pod (ポッド)

Kubernetesにおけるデプロイの最小単位です。1つ以上のコンテナを含みます。同じPod内のコンテナは、IPアドレスやストレージボリュームを共有します。通常、Podを直接作成することは少なく、Deploymentなどの上位リソースを通じて管理します。

ReplicaSet (レプリカセット)

指定された数のPodのレプリカが常に稼働していることを保証するリソースです。Podが停止した場合、自動的に新しいPodを作成して指定数を維持します。

Deployment (デプロイメント)

ステートレスなアプリケーションを管理するためのリソースです。ReplicaSetを管理し、アプリケーションのローリングアップデートやロールバックを容易にします。WebサーバーやAPIサーバーなどのデプロイに最もよく使用されます。

StatefulSet (ステートフルセット)

データベースのように状態を持つ(ステートフルな)アプリケーションを管理するためのリソースです。

  • Podに一意のID(順序付きのインデックス)が付与されます。
  • 永続ストレージが各Podに紐付き、Podが再作成されても同じストレージが再アタッチされます。

Service (サービス)

Podの集合に対するネットワークアクセスを抽象化するリソースです。Podは再起動ごとにIPが変わる可能性がありますが、Serviceは固定のIP(ClusterIP)やDNS名を提供します。

  • ClusterIP: クラスタ内部からのみアクセス可能(デフォルト)。
  • NodePort: 各ノードの特定のポートで外部公開。
  • LoadBalancer: クラウドプロバイダーのロードバランサーを使用して外部公開(AKSではAzure Load Balancerが作成されます)。

Ingress (イングレス)

クラスタ外部からのHTTP/HTTPSトラフィックをクラスタ内のServiceにルーティングするルールを管理するリソースです。

  • パスベースやホストベースのルーティングが可能。
  • SSL/TLS終端機能を提供。
  • 実装にはIngress Controller(Nginx Ingress ControllerやApplication Gateway Ingress Controllerなど)が必要です。

PVC (Persistent Volume Claim)

Podが永続ストレージを要求するためのリソースです。

  • PV (Persistent Volume): 実際のストレージ実体(Azure DiskやAzure Filesなど)。
  • PVC: ユーザーが必要な容量やアクセスモードを指定してPVを要求する「請求書」。
  • StorageClassを使用することで、PVC作成時に動的にPV(Azure Disk等)をプロビジョニングできます。

Secret (シークレット)

パスワード、OAuthトークン、SSHキーなどの機密情報を保存・管理するためのリソースです。

  • Base64でエンコードされて保存されます(暗号化ではないため、RBACやKMSでの保護が重要)。
  • Podから環境変数やボリュームとしてマウントして利用します。

ServiceAccount (サービスアカウント)

Pod内で実行されるプロセスがKubernetes APIサーバーと通信するためのIDです。

  • 認証と認可: PodがAPIサーバーにアクセスする際、どのServiceAccountを使用しているかによって認証され、RBAC (Role-Based Access Control) によって権限(認可)が制御されます。
  • デフォルト: Pod作成時に指定しない場合、そのNamespaceの default ServiceAccountが自動的にマウントされます。
  • Workload Identity: AKSでは、ServiceAccountをMicrosoft Entra ID (旧Azure AD) のIDと連携させることで、パスワードレスでAzureリソース(Key VaultやSQL Databaseなど)へ安全にアクセスさせることが可能です。

HPA (Horizontal Pod Autoscaler)

CPU使用率やメモリ使用量などのメトリクスに基づいて、Podのレプリカ数(DeploymentやStatefulSetの規模)を自動的にスケーリングする機能です。

  • トラフィックの増減に合わせて自動的にスケールアウト/スケールインを行い、リソース効率と可用性を高めます。
  • 利用するにはMetrics Serverがクラスタにインストールされている必要があります。

まとめ

Kubernetesは多くのリソースタイプを持ち、最初は複雑に見えるかもしれませんが、基本となる Pod, Deployment, Service の関係を理解することが第一歩です。AKSを使用することで、インフラ管理の負担を軽減しつつ、これらの強力な機能を活用してスケーラブルなアプリケーションを構築できます。