たねやつの木

Photographs, Keyboards and Programming

【Kubernetesを学ぶ:4日目】マニフェストファイルでPodとDeploymentを定義する

こんにちは、たねやつです。

前回はkubectlコマンドを使って、クラスタの状態を「見る」方法を学びました。 今回は、いよいよ自分たちのアプリケーションをクラスタに配置(デプロイ)するための第一歩として、Kubernetesにおける「設計図」の役割を果たすマニフェストファイルの書き方を学びます。

前の記事

www.taneyats.com

この記事でできること

  • Kubernetesマニフェスト(YAMLファイル)の基本的な構造を理解できる。
  • コンテナを配置する最小単位であるPodリソースの役割を説明できる。
  • アプリケーションのデプロイを管理するDeploymentリソースの役割と書き方を理解できる。

マニフェストファイルとは?

Docker Composeでdocker-compose.ymlを使ったように、KubernetesでもYAML形式のファイルを使って、「クラスタがどうあるべきか(Desired State)」を定義します。このYAMLファイルをマニフェストファイルと呼びます。

マニフェストファイルには、どのコンテナイメージを、いくつ、どのように起動するか、といった情報を記述します。 kubectlでこのマニフェストファイルをクラスタに適用(apply)すると、Kubernetesのコントロールプレーンがファイルの内容を読み取り、記述された通りの状態になるように、コンテナの作成や設定を自動的に行ってくれます。

すべてのマニフェストファイルには、共通して以下の4つの主要なキーが必要です。

キー 説明
apiVersion このマニフェストの記述方法を定めたAPIのバージョン。リソースの種類によって決まります。
kind 作成したいリソースの種類(例: Pod, Deployment, Service)。
metadata リソースの名前やラベルなど、リソースを識別するための情報。
spec リソースの「あるべき状態」を定義する最も重要な部分。コンテナイメージ名、レプリカ数などをここに記述します。

Pod: コンテナを包む最小単位

Kubernetesでは、コンテナを直接デプロイするのではなく、Podという単位で管理します。

Podは、Kubernetesがデプロイできる最小の単位であり、1つ以上のコンテナのグループです。 Pod内のコンテナは、ストレージやネットワーク(IPアドレス)を共有し、あたかも同じマシン上で動いているかのように振る舞うことができます。 基本的には、1つのPodには1つのコンテナを配置するのが一般的です。

試しに、Nginx(Webサーバー)のコンテナを1つ持つPodを定義するマニフェストを見てみましょう。

pod-nginx.yml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
  • kind: Pod: 作成するリソースがPodであることを示します。
  • metadata.name: Podにnginx-podという名前を付けています。
  • spec.containers: このPodで実行するコンテナのリストを定義します。
    • name: コンテナの名前。
    • image: 使用するDockerイメージ。
    • ports.containerPort: コンテナが公開するポート番号。

Deployment: アプリケーションのデプロイを司る

Podはコンテナを起動する基本的な単位ですが、Podが停止しても自動で復旧(自己修復)する機能はありません。また、複数のPodを起動して負荷分散(スケーリング)することもできません。

そこで登場するのがDeploymentです。 Deploymentは、Podとその集合であるReplicaSetを管理するためのリソースです。Deploymentを使うことで、以下のことが可能になります。

  • 自己修復: Podが何らかの理由で停止した場合、Deploymentがそれを検知し、新しいPodを自動的に起動して、定義された数のPodを維持します。
  • スケーリング: replicasというフィールドの数を変更するだけで、簡単にPodの数を増減できます。
  • ローリングアップデート: アプリケーションの新しいバージョンを、サービスを停止することなく(無停止で)安全に更新できます。

先ほどのNginxを、今度は3つのPodで起動するDeploymentとして定義してみましょう。

deployment-nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80
  • kind: Deployment: リソースの種類がDeploymentになっています。
  • spec.replicas: 3: 同じPodを3つ起動するように指定しています。
  • spec.selector: このDeploymentがどのPodを管理対象とするかを定義します。matchLabelsapp: nginxというラベルを持つPodを探します。
  • spec.template: 管理対象となるPodの設計図(テンプレート)です。ここにPodのmetadataspecを記述します。template.metadata.labelsに、selectorで指定したのと同じラベル(app: nginx)を付けることが重要です。

最後に

今回は、Kubernetesの設計図であるマニフェストファイルの基本と、アプリケーションをデプロイするための中心的なリソースであるPodDeploymentについて学びました。

  • Podはコンテナを動かすための最小単位。
  • DeploymentはPodを管理し、自己修復やスケーリングといった高度な機能を提供する。

この2つの関係性を理解することが、Kubernetesを使いこなす上で非常に重要です。 次回は、いよいよ前章で作成したFastAPIアプリケーションを、DeploymentとしてKubernetesクラスタにデプロイします。

次の記事

' www.taneyats.com