【Kubernetes】kubespyでリソース監視
はじめに
kubespy
とはどんなものか、どうやって使うか、実際にkubespy
を使ってKubernetesリソースを監視してみます。
kubespyとは
kubespy
とは、リアルタイムにKubernetesリソースを監視できるツールです。
Kubernetesリソースが作成されたり、変更されるときに何が起こっているかをリアルタイムに表示するツールになっています。
GitHub - pulumi/kubespy: Tools for observing Kubernetes resources in real time, powered by Pulumi.
Tools for observing Kubernetes resources in real time, powered by Pulumi. - pulumi/kubespy
インストール
brew
を使う場合、下記でインストールできます。
1brew install kubespy
使い方
kubespy
には3つのコマンドがあります。
status
.status
フィールドの変更をJSON diffとして表示します。
1kubespy status <apiVersion> <kind> [<namespace>/]<name>
Kubernetesオブジェクトを理解する
このページでは、KubernetesオブジェクトがKubernetes APIでどのように表現されているか、またそれらを.yamlフォーマットでどのように表現するかを説明します。 Kubernetesオブジェクトを理解する Kubernetesオブジェクト は、Kubernetes上で永続的なエンティティです。Kubernetesはこれらのエンティティを使い、クラスターの状態を表現します。具体的に言うと、下記のような内容が表現できます: どのようなコンテナ化されたアプリケーションが稼働しているか(またそれらはどのノード上で動いているか) それらのアプリケーションから利用可能なリソース アプリケーションがどのように振る舞うかのポリシー、例えば再起動、アップグレード、耐障害性ポリシーなど Kubernetesオブジェクトは「意図の記録」です。一度オブジェクトを作成すると、Kubernetesは常にそのオブジェクトが存在し続けるように動きます。オブジェクトを作成することで、Kubernetesに対し効果的にあなたのクラスターのワークロードがこのようになっていて欲しいと伝えているのです。これが、あなたのクラスターの望ましい状態です。 Kubernetesオブジェクトを操作するには、作成、変更、または削除に関わらずKubernetes APIを使う必要があるでしょう。例えばkubectlコマンドラインインターフェースを使った場合、このCLIが処理に必要なKubernetes API命令を、あなたに代わり発行します。あなたのプログラムからクライアントライブラリを利用し、直接Kubernetes APIを利用することも可能です。 オブジェクトのspec(仕様)とstatus(状態) ほとんどのKubernetesオブジェクトは、オブジェクトの設定を管理する2つの入れ子になったオブジェクトのフィールドを持っています。それはオブジェクト spec とオブジェクト status です。specを持っているオブジェクトに関しては、オブジェクト作成時にspecを設定する必要があり、望ましい状態としてオブジェクトに持たせたい特徴を記述する必要があります。 status オブジェクトはオブジェクトの 現在の状態 を示し、その情報はKubernetesシステムとそのコンポーネントにより提供、更新されます。Kubernetesコントロールプレーンは、あなたから指定された望ましい状態と現在の状態が一致するよう常にかつ積極的に管理をします。 例えば、KubernetesのDeploymentはクラスター上で稼働するアプリケーションを表現するオブジェクトです。Deploymentを作成するとき、アプリケーションの複製を3つ稼働させるようDeploymentのspecで指定するかもしれません。KubernetesはDeploymentのspecを読み取り、指定されたアプリケーションを3つ起動し、現在の状態がspecに一致するようにします。もしこれらのインスタンスでどれかが落ちた場合(statusが変わる)、Kubernetesはspecと、statusの違いに反応し、修正しようとします。この場合は、落ちたインスタンスの代わりのインスタンスを立ち上げます。 spec、status、metadataに関するさらなる情報は、Kubernetes API Conventionsをご確認ください。 Kubernetesオブジェクトを記述する Kubernetesでオブジェクトを作成する場合、オブジェクトの基本的な情報(例えば名前)と共に、望ましい状態を記述したオブジェクトのspecを渡さなければいけません。KubernetesAPIを利用しオブジェクトを作成する場合(直接APIを呼ぶか、kubectlを利用するかに関わらず)、APIリクエストはそれらの情報をJSON形式でリクエストのBody部に含んでいなければなりません。 ここで、KubernetesのDeploymentに必要なフィールドとオブジェクトのspecを記載した.yamlファイルの例を示します: application/deployment.yaml apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.
changes
全てのフィールドの変更をJSON diffとして表示します。
1kubespy changes <apiVersion> <kind> [<namespace>/]<name>
trace
Kubernetesリソースが行っていることをわかりやすくまとめて表示します。
1kubespy trace <kind> [<namespace>/]<name>
Podを監視
kubespy status
とkubespy changes
でPodが作成されてたときの動きを見てみたいと思います。
監視するPodのマニフェストpod.yml
は下記になります。
1apiVersion: v1
2kind: Pod
3metadata:
4 name: nginx-pod
5 labels:
6 app: nginx
7spec:
8 containers:
9 - name: nginx-container
10 image: nginx
11 ports:
12 - containerPort: 80
statusで監視
まずは下記コマンドでPodの監視が開始されます。
1kubespy status v1 Pod nginx
マニフェストを反映させてPodを作成すると、.status
フィールドの差分が表示されます。
1kubectl apply -f pod.yml
一旦、Podを削除します。
1kubectl delete -f pod.yml
changesで監視
次にchanges
で監視してみます。
1kubespy changes v1 Pod nginx
再度、マニフェストを反映させてPodを作成します。
1kubectl apply -f pod.yml
kubespy status
とは異なり、全てのフィールドの差分が表示されます。
作成したPodは削除しておきます。
1kubectl delete -f pod.yml
Deploymentを監視
次は、Deploymentが作成されるのをkubespy trace
で監視します。
作成するDeploymentのマニフェストdeployment.yml
は下記の通りです。
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: nginx-deployment
5spec:
6 replicas: 4
7 selector:
8 matchLabels:
9 app: nginx
10 template:
11 metadata:
12 labels:
13 app: nginx
14 spec:
15 containers:
16 - name: nginx
17 image: nginx:1.21
18 ports:
19 - containerPort: 80
下記コマンドでDeploymentの監視をします。
1kubespy trace deployment nginx-deployment
マニフェストを反映させてDeploymentを作成すると、Deploymentの管理下にあるPodが作成されていくのが表示されているのがわかります。
1kubectl apply -f deployment.yml
作成したリソースは削除しておきます。
1kubectl delete -f deployment.yml
Serviceを監視
最後にServiceを監視してみます。
作成するServiceと紐づくDeploymentのマニフェストnginx.yml
は下記になります。
1apiVersion: v1
2kind: Service
3metadata:
4 name: nginx-service
5 labels:
6 app: nginx-service
7spec:
8 ports:
9 - port: 80
10 protocol: TCP
11 targetPort: 80
12 selector:
13 app: nginx
14---
15apiVersion: apps/v1
16kind: Deployment
17metadata:
18 name: nginx-deployment
19 labels:
20 app: nginx-deployment
21spec:
22 replicas: 4
23 selector:
24 matchLabels:
25 app: nginx
26 template:
27 metadata:
28 labels:
29 app: nginx
30 spec:
31 containers:
32 - name: nginx
33 image: nginx:1.21
34 ports:
35 - containerPort: 80
下記コマンドでServiceの監視をします。
1kubespy trace service nginx-service
マニフェストを反映させてServiceを作成すると、Serviceに紐づくPodとそのIPアドレスがReadyになると表示されていくのがわかります。
1kubectl apply -f deployment.yml
まとめ
kubespy
を使うとKubernetesリソースをリアルタイムで監視できる
参考
- pulumi/kubespy: Tools for observing Kubernetes resources in real time, powered by Pulumi.
- Kubernetesオブジェクトを理解する | Kubernetes