K8sにおけるyamlファイルの書き方を学ぶ

https://github.com/shmn7iii/k8s_tutorial_yaml

本のチュートリアルを進めて自分でも書いてみる。

Hello K8s

hello_k8s ├ deployment.yaml └ service.yaml
ファイル構造

1. YAMLでdeploymentを書く
apiVersion: apps/v1 kind: Deployment metadata: name: demo labels: app: demo spec: replicas: 1 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: - name: demo image: cloudnatived/demo:hello ports: - containerPort: 8888
deployment.yaml

簡単。今までrunした時には裏でこれをK8sが作ってくれてた。

2. kubectl apply

applyしてYAMLマニュフェストをクラスタに送信する。

$ kubectl apply -f hello_k8s/deployment.yaml deployment.apps/demo created

数秒もすればPodが起動する。

$ kubectl get pods --selector app=demo NAME READY STATUS RESTARTS AGE demo-c77cc8d6f-gxcs8 1/1 Running 0 17s

以上でPodの起動は完了。ただし、これで準備完了ではない。このPodにWEBブラウザから接続するにはServiceが必要になる。ServiceとはデプロイしたPodにアクセスするためのKubernetesリソース。

3. Sericeを作る

PodにアクセスするにはIP・ポート番号を取得する必要があるが、これらは起動の都度変更され、またPodは複数のレプリカを持つことから実用性に優れない。それを解決するのがService。Serviceリソースによって単一で不変のIPアドレスが与えられ、任意のPodへルーティングすることが可能となる。

YAMLでServiceマニュフェストを策定する。

apiVersion: v1 kind: Service metadata: name: demo labels: app: demo spec: ports: - port: 8888 protocol: TCP targetPort: 8888 selector: app: demo type: ClusterIP
service.yaml

大部分はDeploymentに似通い、portやselectorが追加された。

リクエストのルーティングを司るのがselectorという部分。

抑えるべき点は

Podのセットを管理するのがDeployment、Podに対するリクエストのルーティングのため単一のエンドポイントを提供するのがServiceである

ということ。

4. kubectl apply

マニュフェストからServiceを作成する。

$ kubectl apply -f hello_k8s/service.yaml service/demo created $ kubectl port-forward service/demo 9999:8888 Forwarding from 127.0.0.1:9999 -> 8888 Forwarding from [::1]:9999 -> 8888

port-forwardによりdemo Serviceがローカルのポートに接続された。これによりローカルの9999ポートからアクセスが可能となる。

5. 後片付け

不要となったオブジェクトをクリーンアップする。

$ kubectl delete -f hello_k8s/

YAMLマニュフェストの書き方を知る

概要は理解したので書き方を知ろう。

apiVersion: # APIのバージョン。大体v1。 kind: # 作成するObject名 Deployment, Service, Pod etc. metadata: name: # 名前 labels: # オブジェクトに付加する値とキー。Selectorを使う時活躍する。 app: demo # これで「appという値がdemoである」ことを定義。 spec: # 具体的な設定をこの下でしていく。内容は作るkindによって異なる。

labelについて

値とキーを付与する。selectorで活躍する。

例えば「appという値がdemoであるPod」の一覧を表示したかったら

$ kubectl get pods --selector app=demo # または $ kubectl get pods -l app=demo

とすればappをdemoであると定義したPodだけが返ってくる。便利。

活用法としては environment=production として本番環境と開発環境を分たり、versionを定義したりなど色々。

参考