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
簡単。今まで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
大部分は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を定義したりなど色々。
参考