Kubernetes入門:定義ファイル(マニフェストファイル)の書き方

 Kubernetesの基礎的な概念の一つが、定義ファイル(マニフェストファイル)です。Kubernetesにおけるすべてのリソースはこの定義ファイルを通じて管理され、サーバーの望ましい状態を維持します。ここでは、定義ファイルの基本的な書き方や注意点について詳しく説明していきます。

定義ファイル(マニフェストファイル)とは

 Kubernetesでは、定義ファイルを使用してPodやサービスなどのリソースを作成します。定義ファイルは、サーバーの状態を指定し、それをetcdデータベースにアップロードすることで、その状態を維持します。この定義された内容に基づいてKubernetesが自動的にリソースを管理します。

定義ファイルの書き方

  • YAML形式で書く
     定義ファイルは主にYAML形式で記述します。YAMLは、シンプルで視覚的にわかりやすく、読み書きがしやすいため、Kubernetesの設定には最適です。定義ファイルは、拡張子.yml.yamlを使用しますが、内容が正確ならどちらでも構いません。
  • 名前付けのルール
     定義ファイルには特に決まった名前はありませんが、他の人が理解しやすい名前を付けることが重要です。例えば、apache-deployment.ymlnginx-service.ymlといった具合です。これにより、ファイルが何を目的とするものかがすぐに分かるようになります。

定義ファイルはリソース単位で記述

 Kubernetesのリソースは、Pod、サービス、デプロイメント、レプリカセットなど多岐にわたりますが、初心者が扱う際には、主にデプロイメントサービスのリソースに焦点を当てます。各リソースは、それぞれ別の目的を持ち、適切なリソース単位で定義を行います。

  • デプロイメント(Deployment)
     デプロイメントは、Podを管理し、設定した数に保つ役割を持っています。このデプロイメントは、バックグラウンドでレプリカセットやPodを作成し、それらを維持します。そのため、個別にPodやレプリカセットを作成することは一般的ではありません。
  • サービス(Service)
     サービスは、外部または内部からPodに対して通信を行うためのリソースです。Podが複数のノードにまたがる場合でも、一つのIPアドレスを通じてアクセスをまとめて処理することができます。

定義ファイルの例

以下は、apache-deployment.ymlの基本的な例です。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: apache
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
      - name: apache
        image: httpd:2.4
        ports:
        - containerPort: 80

レプリカセットやPodはデプロイメントで設定できる

 Kubernetesでは、システムを効率的に管理・運用するためにデプロイメント(Deployment)というリソースを使用します。デプロイメントは、Podやレプリカセット(ReplicaSet)を管理するための上位のリソースで、主にアプリケーションのデプロイやスケーリング、更新を自動的に行うために使われます。

デプロイメントによるPodとレプリカセットの管理

  • Pod単体ではなく、デプロイメントを使用する理由
     Kubernetesの重要な機能の一つは、「望ましい状態に自動で保つ」機能です。たとえば、サーバが何らかの理由でダウンした場合、Kubernetesは自動的に新しいPodを起動して、常に指定された数のPodが稼働していることを保証します。Podそのものを直接定義しても、Podの数を自動的に調整したり、復旧させたりする機能が含まれていません。そのため、Pod単体で定義することは、特定の状況を除いて推奨されません。代わりに、デプロイメントを使ってPodを管理するのが一般的です。デプロイメントを使用することで、Podの数や状態が自動で管理されます。
  • レプリカセットの役割
     レプリカセットは、指定された数のPodを維持するためのリソースです。たとえば、「3つのPodを常に稼働させる」といった設定をレプリカセットで管理します。しかし、レプリカセット自体を直接定義することは一般的ではありません。通常は、デプロイメントを定義することで、バックグラウンドでレプリカセットも自動的に作成され、Podの数を管理します。
  • デプロイメントによる自動管理
     デプロイメントは、アプリケーションのデプロイやアップデートを管理する役割を持っています。これにより、アプリケーションの新バージョンをリリースする際も、ローリングアップデートなどの方法で順次Podを更新していき、サービスの停止時間を最小限に抑えることが可能です。

要するに「デプロイメント」項目が「レプリカセット」と「Pod」を内包しているのです。

定義ファイルは分けても良い

 定義ファイルは、リソースごとに分けて記述することができますが、複数のリソースを一つのファイルにまとめることも可能です。まとめる場合は、リソースごとに「---」で区切りを入れ、個別のリソースとして認識させます。

定義ファイルの例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
      - name: apache
        image: httpd:2.4
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: apache-service
spec:
  selector:
    app: apache
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

まとめ

 Kubernetesの定義ファイルは、システムの自動化と管理を効率化するために必要不可欠です。リソース単位での定義や適切な形式、命名ルールを理解し、効率的な設定を行うことがKubernetesの活用を最大限に引き出す鍵です。