Traffine I/O

日本語

2022-06-27

Kubernetesにおける宣言的YAML

はじめに

宣言的YAMLはKubernetesエコシステム内の強力なツールです。Kubernetesクラスタ内のリソースを定義し管理するための、わかりやすく、読みやすく、保守可能な方法を提供します。宣言的YAMLを使用することで、開発者はシステムの望ましい状態を指定し、Kubernetesに実際の状態を管理し、差異を調整させることができます。このアプローチにより、デプロイ、更新、リソースのスケーリングが容易で信頼性が向上します。

命令的アプローチと宣言的アプローチ

プログラミングの文脈において、宣言的という用語は、特定の手順を概説せずに望ましい最終状態または結果を定義することを指します。この概念を説明するために、ユーザーリストから30歳以上の全てのユーザーを抽出するタスクを考えてみます。

命令的アプローチ

このタスクに対する命令的なアプローチでは、具体的なアルゴリズムや手順が指定されます。

  1. ユーザーリストをループして各ユーザーを取得
  2. 各ユーザーの年齢をチェック
  3. ユーザーが30歳以上であれば、結果リストに追加

この方法では、タスクの具体的な手順が詳細に示されています。

宣言的アプローチ

一方、宣言的アプローチでは、単に目的の結果を宣言します。

  1. 30歳以上のユーザーを抽出

この場合、目標を達成するための具体的な手順やアルゴリズムは明示されません。焦点は、30歳以上のユーザーにのみ置かれています。

宣言的アプローチの利点

宣言的アプローチは、プロセスの詳細を抽象化し、目標や結果に焦点を当てます。これにより、コードの可読性と保守性が向上し、柔軟性が増します。インフラストラクチャ・コード(IaC)の文脈では、YAMLのような宣言的な形式を使用してインフラストラクチャの状態を定義することで、管理と再現性が向上します。

kubectl runからYAMLへ:命令的から宣言的への移行

命令的なkubectl runコマンドから宣言的なKubernetes YAMLへの移行は、Kubernetesクラスタ内のリソースを管理するための保守性の高いスケーラブルな方法を提供します。

命令的アプローチ

Podの作成

命令的なアプローチを使用して、以下のkubectl runコマンドを使用してPodを作成することができます。

bash
$ kubectl run \
    --image gcr.io/google-samples/hello-app:1.0 \
    --restart Never \
    helloworld

Serviceの作成

同様に、kubectl exposeコマンドを使用してServiceを作成することができます。

bash
$ kubectl expose pod helloworld \
    --type ClusterIP \
    --port 8080 \
    --name helloworld-clusterip

Deploymentの作成

Deploymentを作成する場合、kubectl create deploymentコマンドを使用できます。

bash
$ kubectl create deployment \
    --image gcr.io/google-samples/hello-app:1.0 \
    helloworld

宣言的アプローチ

宣言的なアプローチへの移行では、これらのリソースの望ましい状態を記述するYAMLファイルを生成します。

Podの作成

以下のコマンドを使用してPodのためのYAMLファイルを生成できます。

bash
$ kubectl run \
    --port 8080 \
    --image gcr.io/google-samples/hello-app:1.0 \
    --restart Never \
    --dry-run \
    -o yaml \
    helloworld > pod.yaml
pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld
  name: helloworld
spec:
  containers:
  - image: gcr.io/google-samples/hello-app:1.0
    name: helloworld
    ports:
    - containerPort: 8080
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Serviceの作成

同様に、以下のコマンドを使用してServiceのためのYAMLファイルを作成できます。

bash
$ kubectl expose pod helloworld \
    --type ClusterIP \
    --port 8080 \
    --name helloworld-clusterip \
    --dry-run \
    -o yaml > service.yaml

Deploymentの作成

最後に、以下のコマンドを使用してDeploymentのYAMLファイルを生成できます。

bash
$ kubectl create deployment \
    --port 8080 \
    --image gcr.io/google-samples/hello-app:1.0 \
    --dry-run \
    -o yaml \
    helloworld > deployment.yaml
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: helloworld
  name: helloworld
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloworld
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: helloworld
    spec:
      containers:
      - image: gcr.io/google-samples/hello-app:1.0
        name: hello-app
        ports:
        - containerPort: 8080
        resources: {}
status: {}

KubernetesでのYAMLの使用

KubernetesでYAMLを使用して宣言的なアプローチに移行すると、リソースの管理がよりシンプルで効率的なプロセスになります。YAMLファイルは人間が読みやすく、各リソースの設定を理解しやすくなります。さらに、アプリケーションコードと一緒に格納し、バージョン管理することができるため、インフラストラクチャのセットアップが再現可能で一貫性が保たれます。

YAMLで定義されたリソースの作成

KubernetesでYAMLファイルで定義されたリソースを作成するには、kubectl apply -fコマンドを使用してYAMLファイルのパスを指定します。このコマンドにより、Kubernetesはファイルで記述された望ましい状態を実現します。

例えば、前の章で生成されたYAMLファイルで定義されたPod、Service、Deploymentを作成するには、次のコマンドを使用します。

bash
$ kubectl apply -f pod.yaml
$ kubectl apply -f service.yaml
$ kubectl apply -f deployment.yaml

Kubernetesは、各ファイルから設定を読み取り、対応するリソースを作成(存在しない場合)または更新(存在する場合)し、実際の状態がYAMLファイルで指定された望ましい状態と一致するようにします。

YAMLで定義されたリソースの削除

YAMLファイルを使用して作成されたリソースを削除するのも同様に簡単です。applyの代わりにdeleteコマンドを使用します。これにより、KubernetesはYAMLファイルで定義されたリソースを削除します。

以下は、先程作成したPod、Service、Deploymentを削除するためのコマンドです。

bash
$ kubectl delete -f pod.yaml
$ kubectl delete -f service.yaml
$ kubectl delete -f deployment.yaml

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!