はじめに
宣言的YAMLはKubernetesエコシステム内の強力なツールです。Kubernetesクラスタ内のリソースを定義し管理するための、わかりやすく、読みやすく、保守可能な方法を提供します。宣言的YAMLを使用することで、開発者はシステムの望ましい状態を指定し、Kubernetesに実際の状態を管理し、差異を調整させることができます。このアプローチにより、デプロイ、更新、リソースのスケーリングが容易で信頼性が向上します。
命令的アプローチと宣言的アプローチ
プログラミングの文脈において、宣言的という用語は、特定の手順を概説せずに望ましい最終状態または結果を定義することを指します。この概念を説明するために、ユーザーリストから30歳以上の全てのユーザーを抽出するタスクを考えてみます。
命令的アプローチ
このタスクに対する命令的なアプローチでは、具体的なアルゴリズムや手順が指定されます。
- ユーザーリストをループして各ユーザーを取得
- 各ユーザーの年齢をチェック
- ユーザーが30歳以上であれば、結果リストに追加
この方法では、タスクの具体的な手順が詳細に示されています。
宣言的アプローチ
一方、宣言的アプローチでは、単に目的の結果を宣言します。
- 30歳以上のユーザーを抽出
この場合、目標を達成するための具体的な手順やアルゴリズムは明示されません。焦点は、30歳以上のユーザーにのみ置かれています。
宣言的アプローチの利点
宣言的アプローチは、プロセスの詳細を抽象化し、目標や結果に焦点を当てます。これにより、コードの可読性と保守性が向上し、柔軟性が増します。インフラストラクチャ・コード(IaC)の文脈では、YAMLのような宣言的な形式を使用してインフラストラクチャの状態を定義することで、管理と再現性が向上します。
kubectl runからYAMLへ:命令的から宣言的への移行
命令的なkubectl run
コマンドから宣言的なKubernetes YAMLへの移行は、Kubernetesクラスタ内のリソースを管理するための保守性の高いスケーラブルな方法を提供します。
命令的アプローチ
Podの作成
命令的なアプローチを使用して、次のkubectl run
コマンドを使用してPodを作成することができます。
$ kubectl run \
--image gcr.io/google-samples/hello-app:1.0 \
--restart Never \
helloworld
Serviceの作成
同様に、kubectl expose
コマンドを使用してServiceを作成することができます。
$ kubectl expose pod helloworld \
--type ClusterIP \
--port 8080 \
--name helloworld-clusterip
Deploymentの作成
Deploymentを作成する場合、kubectl create deployment
コマンドを使用できます。
$ kubectl create deployment \
--image gcr.io/google-samples/hello-app:1.0 \
helloworld
宣言的アプローチ
宣言的なアプローチへの移行では、これらのリソースの望ましい状態を記述するYAMLファイルを生成します。
Podの作成
次のコマンドを使用してPodのためのYAMLファイルを生成できます。
$ kubectl run \
--port 8080 \
--image gcr.io/google-samples/hello-app:1.0 \
--restart Never \
--dry-run \
-o yaml \
helloworld > 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ファイルを作成できます。
$ kubectl expose pod helloworld \
--type ClusterIP \
--port 8080 \
--name helloworld-clusterip \
--dry-run \
-o yaml > service.yaml
Deploymentの作成
最後に、次のコマンドを使用してDeploymentのYAMLファイルを生成できます。
$ kubectl create deployment \
--port 8080 \
--image gcr.io/google-samples/hello-app:1.0 \
--dry-run \
-o yaml \
helloworld > 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を作成するには、次のコマンドを使用します。
$ 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を削除するためのコマンドです。
$ kubectl delete -f pod.yaml
$ kubectl delete -f service.yaml
$ kubectl delete -f deployment.yaml