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を定義したりなど色々。

参考

Kubernetesで実践するクラウドネイティブDevOps
Kubernetesが標準プラットフォームであるクラウドネイティブの世界でアプリケーションを開発し運用する方法を解説する書籍です。 はじめに、Kubernetesの概要と背景、ソフトウェアの開発と運用にKubernetesがもたらす変化、コンテナの動作原理、コンテナの構築および管理方法、クラウドネイティブなサービスおよびインフラの設計方法などの基礎を紹介します。 そしてKubernetesアプリケーションの作成とデプロイ、Kubernetesクラスタの設定と運用、クラウドインフラの自動化、Helmなどのツールを用いたデプロイについてサンプルコードを使って学習します。ロールベースのアクセス制御(RBAC)をはじめとした、セキュリティ、認証、パーミッションなどに対するKubernetesのサポートや、本番でコンテナとKubernetesの安全性を確保するためのベストプラクティスについても学びます。 さらにKubernetesで継続的インテグレーションと継続的デプロイをセットアップする方法、データをバックアップおよび復元する方法、クラスタの適合性や信頼性をテストする方法、監視・トレーシング・ロギング・メトリクスを集約する方法、Kubernetesインフラの拡張性・耐障害性・費用対効果を高める方法を解説します。 Kubernetesの基本から、継続的デプロイ、機密情報管理、オブザーバビリティなどの高度なトピックを扱う本書は、サーバ、アプリケーション、サービスを管理するIT運用者、クラウドネイティブサービスの構築や移行を行う開発者必携の一冊です。
Favicon of the bookmark site
https://www.oreilly.co.jp
Site image of the bookmark