kubectl getを定期実行する方法


# はじめに
**kubectl get** コマンドでリソースの情報取得を定期実行する3つの方法をまとめました。

1. kubectlコマンドの **--watch** オプションを利用する方法
2. **watchコマンド** を利用する方法
3. **シェルのループ** を利用する方法


# 方法

## 1. kubectlコマンドの --watch オプションを利用する

:::note info
確認した kubectl のバージョンは v1.22.4 です。
:::

### 1-1. 定期実行の開始
kubectlコマンドに **--watch** オプションを付与して実行します。

```shell:
% kubectl get pods --watch        
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          63s
```

**-o wide** にも対応しています。

```shell:
% kubectl get pods -o wide --watch
NAME         READY   STATUS    RESTARTS   AGE     IP            NODE                  NOMINATED NODE   READINESS GATES
sample-pod   1/1     Running   0          5m11s   10.244.1.26   kindcluster-worker2   <none>           <none>
```

--watchオプションを指定できるリソースの種類は1種類のみで、複数指定しようとすると以下の通りエラーが表示されてしまいます。allに対しても利用できません。

```shell:
# 複数リソースを指定
% kubectl get pods,services --watch
error: you may only specify a single resource type

# allを指定
% kubectl get all --watch
error: you may only specify a single resource type
```

複数リソースの監視を行いたい場合は **watchコマンド** か **シェルのループ** を利用します。

--watchオプションは **--output-watch-events** オプションを併用し、変更イベントを合わせて表示することができます。

```shell:
% kubectl get pods --watch --output-watch-events
EVENT      NAME         READY   STATUS    RESTARTS   AGE
ADDED      sample-pod   1/1     Running   0          28m
MODIFIED   sample-pod   1/1     Terminating   0          29m   #裏でkubectl delete podを実行
MODIFIED   sample-pod   0/1     Terminating   0          29m
MODIFIED   sample-pod   0/1     Terminating   0          29m
DELETED    sample-pod   0/1     Terminating   0          29m
```

### 1-2. 終了
--watchオプションの実行を終了する場合は **「Ctrl」+「C」** を入力します。


## 2. watchコマンドを利用する

Unix/Linux、Mac環境で利用可能なwatchコマンドを利用する方法です。
環境によってはwatchコマンドがインストールされていない場合もありますので必要に応じてインストールを行います。
watchコマンドの使い方は以下の記事がわかりやすいです。

https://qiita.com/shtnkgm/items/2aa204f2b52f24d02ff3

### 2-1. 定期実行の開始

```shell:
# 構文
% watch <コマンド>

# kubectl get all -o wide を定期実行
% watch kubectl get all -o wide
```

watchコマンドを実行すると定期的に実行結果がリフレッシュされます。

```
Every 2.0s: kubectl get all -o wide

NAME             READY   STATUS    RESTARTS   AGE   IP            NODE                  NOMINATED NODE   READINESS GATES
pod/sample-pod   1/1     Running   0          14m   10.244.1.26   kindcluster-worker2   <none>           <none>

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   20h   <none>
```

watchコマンドの規定の間隔は **2秒** ですが、任意の時間に変更することも可能です。

### 2-2. 終了
watchコマンドを終了する場合は **「Ctrl」+「C」** を入力します。


## 3. シェルのループを利用する

while文の条件に true を指定することで実行を繰り返すことができます。

### 3-1. 定期実行の開始

```shell:
# 構文
% while true; do <コマンド>; sleep <実行間隔[秒]>; done

# kubectl get pods を 1秒間隔 で実行
% while true; do kubectl get pods; sleep 1; done
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          7s
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          8s
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          9s
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          10s
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          11s
```


:::note alert
必ず sleep 秒数 で実行間隔を指定してください。
指定しないとCPUの限り高速で実行を繰り返してしまいます。
:::


画面をリフレッシュさせたい場合はclearを追加します。

```shell:
# 構文
% while true; do <コマンド>; sleep <実行間隔[秒]>; clear; done
```

### 3-2. 終了
whileを終了する場合は **「Ctrl」+「C」** を入力します。


# おわりに
watchコマンドが利用できる場合はwatchコマンドの利用がおすすめです。
シェルのループ（while true）はUnix/Linux環境であれば追加インストール無しで利用できるので覚えておくと便利です。