kubectl apply -f xxx.yaml
このYAML で書くのは「こういう状態にしたい」という宣言です。kubectl apply -f xxx.yaml は、その宣言を API Server に送り、対象オブジェクトがなければ作成し、あれば更新します。apply は YAML と JSON の両方を受け付けます。Kubernetes のオブジェクトは API 上の永続的なエンティティで、.yaml で表現できます。 (Kubernetes)
まずは 「初心者が最初に読むべき、いちばん小さい Deployment の YAML」 を使って、1行ずつ分解します。
Deployment は、Pod を何個動かすかを宣言し、その状態を保つために ReplicaSet を使って管理する仕組みです。Kubernetes では kubectl が API を通じてこの宣言をクラスタへ送り、Deployment コントローラが実際の状態を望む状態へ近づけます。 (Kubernetes)
まず全体像
この図の意味は、Deployment が直接コンテナを動かすのではなく、まず ReplicaSet を管理し、その ReplicaSet が Pod の個数を保つ、ということです。ReplicaSet の役割は「指定された数の同じ Pod を安定して動かし続けること」です。 (Kubernetes)
最初に読むべき Deployment YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
これは、**「nginx コンテナが入った Pod を 2 個動かして保ってください」**という宣言です。Kubernetes オブジェクトの基本形は、apiVersion、kind、metadata、spec で表されます。 (Kubernetes)
1行ずつ分解
apiVersion: apps/v1
どの Kubernetes API の種類を使うかです。
Deployment は apps/v1 という API グループ・バージョンで扱います。Kubernetes オブジェクトでは apiVersion が必須項目です。 (Kubernetes)
kind: Deployment
何を作るかです。
ここでは Deployment を作る、という意味です。kind も Kubernetes オブジェクトの基本項目です。 (Kubernetes)
metadata:
そのオブジェクト自身の情報を書き始める場所です。
名前、ラベル、アノテーションなどの付帯情報はここに入ります。Kubernetes のオブジェクトには ObjectMeta というメタデータ部分があります。 (Kubernetes)
name: web
この Deployment の名前です。
web という名前の Deployment を作る、という意味です。あとで kubectl get deployment web のように、この名前で扱います。 (Kubernetes)
spec:
「どういう状態にしたいか」の本体です。
Kubernetes では spec が望む状態、status が実際の状態、という考え方が基本です。 (Kubernetes)
replicas: 2
Pod を 2 個にしてほしいという意味です。
Deployment はこの数を目標にして、足りなければ増やし、多ければ減らします。Deployment は宣言的に Pod 群を更新・管理します。 (Kubernetes)
selector:
Deployment が、自分が管理すべき Pod を見分ける条件です。
どの Pod を自分の配下とみなすかをここで決めます。 (Kubernetes)
matchLabels:
ラベル一致で選ぶという意味です。
この下に書いたラベル条件に一致する Pod を対象にします。Kubernetes では labels と selectors が、オブジェクトの関連付けに広く使われます。 (Kubernetes)
app: web
これは app=web というラベル条件です。
つまりこの Deployment は、app: web というラベルを持つ Pod を管理対象にします。 (Kubernetes)
template:
ここから下は、Deployment が作る Pod の設計図です。
Deployment は Pod を直接 1 個書くのではなく、「こういう Pod を作ってね」というテンプレートを持ちます。 (Kubernetes)
metadata: (template: の下のもの)
これは 作られる Pod 自身のメタデータです。
上の metadata.name: web は Deployment 自体の名前でしたが、こちらは Pod 側の metadata です。インデントが違うと意味も変わります。Kubernetes の YAML は、インデントで親子関係を表します。 (Kubernetes)
labels:
これから作る Pod に、どんなラベルを付けるかです。
Pod に付くラベルは、Service や Deployment の selector が見に行く重要な情報です。 (Kubernetes)
app: web (template.metadata.labels の中)
これで、作られる Pod に app=web というラベルが付きます。
ここが selector.matchLabels.app: web と一致しているのがとても重要です。ずれていると、Deployment が自分の Pod を正しく管理できません。Deployment は selector で対象 Pod を見つける仕組みだからです。 (Kubernetes)
spec: (template: の下のもの)
これは Pod の中身です。
どのコンテナを入れるか、環境変数は何か、ポートは何か、ボリュームはあるか、などはここに書きます。Pod は Kubernetes がコンテナを動かす基本単位です。 (Kubernetes)
containers:
Pod の中に入れるコンテナ一覧です。
containers は配列なので、この下に - が出てきます。Pod は 1 個以上のコンテナを持てます。 (Kubernetes)
- name: nginx
- は 一覧の1件目という意味です。
このコンテナの名前を nginx にしています。コンテナ名は Pod 内でそのコンテナを識別するために使います。 (Kubernetes)
image: nginx:latest
このコンテナで使うイメージ名です。
ここでは nginx:latest というコンテナイメージを使います。Deployment の目的は、こうしたコンテナ化アプリをクラスタ上で動かすことです。 (Kubernetes)
ports:
このコンテナが使うポート情報を書きます。
これは「このコンテナはこのポートを使います」という宣言で、あとで読む人や他の設定が理解しやすくなります。 (Kubernetes)
- containerPort: 80
コンテナ内で 80番ポートを使う、という意味です。
nginx は通常 HTTP を 80 番で待ち受けるので、最初の例として分かりやすいです。Service は Pod 群への安定した入口を提供し、こうしたアプリに通信を流すために使われます。 (Kubernetes)
この YAML を初心者向けに1文で言うと
web という名前の Deployment を作り、app=web ラベル付きの nginx Pod を 2 個、常に維持する、という意味です。Deployment は宣言された望む状態に合わせて Pod 群を管理します。 (Kubernetes)
初心者が最初に特に覚えるべき3点
1. metadata.name は Deployment 自体の名前
これは 管理オブジェクトの名前です。Pod の名前ではありません。Kubernetes オブジェクトでは metadata がオブジェクト自体の情報を持ちます。 (Kubernetes)
2. selector.matchLabels と template.metadata.labels はそろえる
ここが食い違うと、Deployment が「自分の Pod」を見つけにくくなります。Deployment は selector で対象 Pod を判断します。 (Kubernetes)
3. template.spec.containers が、実際に動くコンテナの本体
初心者が一番見たいのはここです。
どのイメージを使うのか、何ポートか、環境変数は何か、volume はあるかは、この中に増えていきます。Pod はコンテナを実行する基本単位です。 (Kubernetes)
最初はこう読めば十分です
YAML を上から順に見ると、こう読めます。
-
apps/v1の -
Deploymentを -
webという名前で作って - nginx の Pod を
-
app=webラベル付きで - 2 個維持する。 (Kubernetes)
自分で中身を調べるときの便利コマンド
kubectl explain deployment
kubectl explain deployment.spec
kubectl explain deployment.spec.template.spec.containers
kubectl explain は、各リソースやフィールドの説明を OpenAPI から表示するコマンドです。どのフィールドが何を意味するか確認するときに一番便利です。 (Kubernetes)