Kubernetes Managed Service Column <Kubernetes運用コラム>

Kubernetes マニフェストとは?Kubernetesの構成を定義する方法について解説します!

Category: 入門編

2024.02.01

Kubernetes マニフェストの概要、基本設定、オプション設定、デプロイ、管理方法について

Kubernetes マニフェストは、 Kubernetes の構成と設定を定義する機能です。本記事では、マニフェストについて概要、構造、利用方法、管理方法について解説します。

1. Kubernetesマニフェストとは

マニフェストは、 Kubernetes クラスタ上で実行されるリソースの構成と設定を定義するための YAML または JSON 形式のファイルです。

マニフェストファイルを使用してオブジェクトを作成することで、インフラのコード化( IaC : Infrastructure as Code )を実現することができます。

Kubernetesマニフェストとは

マニフェストファイルの基本構造

基本的なマニフェストファイルの構造を解説します。ファイルは YAML ( Yet Another Markup Language ) 形式で記述されたものを紹介します。 YAML とは人が判読しやすいプログラミング言語として設定ファイルの記述によく使用されます。

APIバージョンと種別 (kind)

マニフェストの先頭には、 Kubernetes API のバージョンと定義するリソースの種別を指定します。これにより、 Kubernetes がどのリソースを操作するかが判断されます。

例えば、 apiVersion: v1 および kind: Pod は、 v1 の API バージョンを使用して Pod を定義していることを示します。

apiVersion: v1
kind: Pod

メタデータ (metadata)

マニフェストの中には、リソースに関するメタデータが含まれます。これには名前、ラベル、アノテーションなどが含まれ、 metadata フィールドに記述されます。

metadata:
  name: mypod
  labels:
    app: myapp

仕様 (spec)

マニフェストの本体には、リソースの具体的な構成や設定が spec フィールドに記述されます。これには Pod のコンテナ構成、 Deployment のレプリカ数、 Service のポート定義などが含まれます。

spec:
  containers:
  - name: mycontainer
    image: nginx:latest

上記の例は Nginx の Pod の作成例です。マニフェストはこれらの要素を組み合わせ、リソースの特定の要件や設定に基づいて簡単に構成することができます。また複数のリソースを一度に定義することも可能です。

マニフェストファイルの基本構造

図版出典:Qiita

2. KubernetesマニフェストでのPod、Serviceの設定について

マニフェストファイルでは 基本設定以外にも、 Kubernetes において重要な Pod 、 Service も設定することができます。

マニュフェストでPodの設定

Pod の設定に必要な項目を解説します。

コンテナイメージ

Pod 内のコンテナの設定は、 spec 内の containers フィールドに記述されます。

spec:
  containers:
  - name: nginx-container
    image: nginx:latest

この例では、 Nginx コンテナを指定したイメージ nginx:latest で起動することを示し、 name フィールドはコンテナに識別名を与えています。

ポート

Pod が公開するポートは、 spec 内の containers フィールド内の各コンテナの ports フィールドで定義できます。

spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80

この例では、Nginxコンテナがポート80で公開されています。

環境変数

環境変数は、 spec 内の containers フィールド内の各コンテナの env フィールドを使用して定義することができます。

spec
  containers:
  - name: nginx-container
    image: nginx:latest
    env:
    - name: MY_ENV_VARIABLE
      value: "some-value"

この例では、 MY_ENV_VARIABLE という環境変数が ” some-value ” という値で設定しています。

ここまで基本的な Pod の設定項目を紹介しました。これらは基本的な要素であり、他にも Pod に関連する様々な設定要素があります。詳しくは公式ドキュメントをご参照ください。

    ※1 参考記事:
  • Pod

マニュフェストでServiceの設定

Service の設定に必要な項目を解説します。 Kubernetes において、 Service は Pod 群に対するネットワークアクセスを提供するための抽象的な概念です。異なるサービスタイプ( ClusterIP 、 NodePort 、 LoadBalancer )の定義について解説します。

ClusterIP サービス

ClusterIPは、クラスタ内部のみからアクセス可能なサービスを定義します。このサービスはクラスタ内のポッドに内部的なIPアドレスを提供します。

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

この例では、my-clusterip-service というサービスを定義し、my-app ラベルが付いたポッドに対してポート80でアクセス可能にしています。

NodePort サービス

NodePort は、クラスタ内の各ノード上で指定されたポートを公開し、外部からアクセス可能なサービスを定義します。

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

この例では、 my-nodeport-service というサービスを定義し、ノードの IP アドレスと指定したポート( NodePort )でアクセス可能となります。

LoadBalancer サービス

LoadBalancer は、外部のロードバランサを使用してクラスタ内のサービスにトラフィックをルーティングします。このタイプのサービスは、クラウド事業者によって提供される外部ロードバランサを使用します。

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

この例では、 my-loadbalancer-service というサービスを定義し、外部からのトラフィックをクラウド事業者によって提供されるロードバランサにルーティングします。

ここまで利用頻度の高い3つサービスタイプを紹介しました。詳しくは公式ドキュメントをご参照ください。

3. Kubernetesマニフェストでのデプロイ方法について

ここからは、ここまで記述したマニフェストファイルを利用したデプロイ方法を解説します。デプロイは Kubectl というコマンドラインツールを用いて行われます。

マニフェストファイルの作成

デプロイしたいマニフェストファイルを準備します。ここまで解説してきた内容が書かれたファイルをYAML形式で保存します。

マニフェストファイルの適用

作成したマニフェストファイルを Kubernetes クラスタに適用します。このとき kubectl apply コマンドを使用します。

kubectl apply -f your-manifest-file.yaml

リソースの確認

適用が完了したら、 kubectl get コマンドを使用してリソースの状態を確認します。

kubectl get pods

リソースの更新や削除

マニフェストファイルを変更した場合、再び kubectl apply を使用して変更をクラスタに適用します。ただし一部のPodの仕様変更は kubectl apply では反映されないものがあるので注意が必要です。

kubectl delete -f your-manifest-file.yaml

これにより、クラスタから指定したリソースが削除されます。

4. Kubernetesマニフェストの管理について

本章ではコマンドラインの管理ツールである kubectl と比較し、メリット、デメリットを解説します。

マニフェストファイルのメリット

ディスクに永続化された設定

マニフェストファイルは設定やリソースの状態を永続的に保存できます。これにより、設定の履歴を管理し、変更をトラッキングすることも可能です。kubectl では都度の反映でトラッキングには不向きです。

IaC (Infrastructure as Code) の一部

マニフェストは IaC の一環と見なされ、ソースコードと同じくバージョン管理ができます。変更はコードレビューを通じて確認でき、再現性と一貫性を確保することができます。

マニフェストファイルのデメリット

手動管理の必要性

マニフェストファイルを作成および管理するには手動の作業が必要であり、手間がかかるのと合わせ、エラーが生じる可能性もあります。kubectl では都度のコマンド発行なので素早く結果を取得できます。

即時反映が難しい

マニフェストファイルを変更しても、それがクラスタに即座に反映されないことがあります。反映には手動での kubectl apply などのコマンド操作が必要です。しかも一部反映されない設定もあり注意が必要です。

このようにマニフェストファイルは IaC や複雑な設定の管理に適しており、 kubectl はクイックで即座な操作やリアルタイムなクラスタの状態の確認に適しています。両方のアプローチは、使用ケースによって使い分けることが重要です。

5. まとめ

マニフェストは、 Kubernetes の構成と設定を定義し、インフラのコード化( IaC : Infrastructure as Code )を実現することができる機能です。アプリケーションやサービスの変更が簡単かつ効率的に行え、新しい機能や修正が素早くデプロイされ、ビジネスの迅速な変化に適応することができるようになります。

Kubernetes の運用をサポートしてほしい

Kubernetes運用サポートサービス

Kubernetes運用サポートサービス

クラウドベンダが提供する Kubernetes 環境の運用をサポートします。

Free

資料ダウンロード

課題解決に役立つ詳しいサービス資料はこちら

資料ダウンロード
  • Kubernetes運用サポートサービスカタログ

    サービスの詳細をご覧いただけます。

Contactお問い合わせ

お見積もり・ご相談など、お気軽にお問い合わせください。

single.php