อยากรู้ว่าใน K8s มีการใช้ทรัพยาการในเครื่องอะไรไปเท่าไหร่บ้าง มีอะไรเหลือบ้าง
Tags: kubernetes, k8s
Published: 2022-06-04 17:16:49

หลายคนคงสงสัยเหมือนผมว่า ใน K8s cluster ของเรา 
- ทรัพยากรในเครื่องถูกใช้ไปเยอะไหม
- มี App ตัวไหนใช้ทรัพยากรอะไรไปบ้าง
- ทรัพยากรในเครื่องใกล้หมดยัง มีเหลืออยู่มากน้อย
- อยากดูแบบละเอียด ๆ เลยถึงในระดับ container ว่ากิน memory กิน CPU เยอะไหม
- แต่ละ node มีการ request ทรัยากรไปเท่าไหรแล้่ว ได้มีการกำหนด limit ไว้ไหม ยังเหลืออยู่อีกเท่าไหร่

### คำถามเหล่านี้ว่าไปแล้ว ก็สามารถหาคำตอบได้จากคำสั่ง kubectl ที่เราคุ้นเคยได้
- ถ้าอยากหาคำตอบเรื่อง request และ limit ก็หาได้จาก ```kubectl describe nodes <node_name>```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/igob0n8m4op4vx9xffs1.png)
- ถ้าอยากหาคำตอบเรื่องปริมาณการใช้งานทรัพยากร สามารถใช้คำสั่ง ```kubectl top [pods,nodes]``` แต่ว่าต้องติดตั้ง metrics server ให้เรียบร้อยก่อนใช้งาน
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kg370ikdrs3fpn0d3rcv.png)
ถ้าอยากเห็นภาพรวมของการใช้ทรัพยากร ก็คือต้องค่อย ๆ ไปไล่ดูทีละ node หรือในบางกรณีก็ต้องค่อย ๆ ไล่ดูทีละ namespace

### kube-capacity ช่วยตอบโจทย์ให้เราได้
[kube-capacity](https://github.com/robscott/kube-capacity) ถูกพัฒนาขึ้นมาเพื่อให้เราเห็นภาพรวมของ requests, limits และ  utilizations ใน Kubernetes Cluster ซึ่งก็จะมีข้อมูลที่มีประโยชน์จาก kubectl top และ kubectl describe มาแสดงผลให้เห็นภาพรวมของทรัพยากรใน cluster ได้ง่ายขึ้น
#### ก่อนเริ่มต้น

1. ติดตั้ง [metrics server](https://github.com/kubernetes-sigs/metrics-server) เรียบร้อย
2. ติดตั้ง kube-capacity (ทดสอบบน macOS v12.3.1)
```
> brew tap robscott/tap
> brew install robscott/tap/kube-capacity
```

#### ดูภาพรวมราย nodes ของ requests และ limits ของ Kubernetes Cluster
```shell
❯ kube-capacity
NODE             CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
*                6350m (39%)    7500m (46%)   2040Mi (8%)       340Mi (1%)
cluster4-cp0     950m (47%)     0Mi (0%)      440Mi (24%)       340Mi (18%)
cluster4-cp1     750m (37%)     0Mi (0%)      300Mi (16%)       0Mi (0%)
cluster4-cp2     750m (37%)     0Mi (0%)      300Mi (16%)       0Mi (0%)
cluster4-node0   780m (39%)     1500m (75%)   200Mi (5%)        0Mi (0%)
cluster4-node1   780m (39%)     1500m (75%)   200Mi (5%)        0Mi (0%)
cluster4-node2   780m (39%)     1500m (75%)   200Mi (5%)        0Mi (0%)
cluster4-node3   780m (39%)     1500m (75%)   200Mi (5%)        0Mi (0%)
cluster4-node4   780m (39%)     1500m (75%)   200Mi (5%)        0Mi (0%)
```

#### [เพิ่มข้อมูล utilization] ดูภาพรวมราย nodes ของ requests,limits และ  utilization ของ Kubernetes Cluster
```shell
❯ kube-capacity --util
NODE             CPU REQUESTS   CPU LIMITS    CPU UTIL      MEMORY REQUESTS   MEMORY LIMITS   MEMORY UTIL
*                6350m (39%)    7500m (46%)   5934m (37%)   2040Mi (8%)       340Mi (1%)      8533Mi (35%)
cluster4-cp0     950m (47%)     0Mi (0%)      100m (5%)     440Mi (24%)       340Mi (18%)     1098Mi (61%)
cluster4-cp1     750m (37%)     0Mi (0%)      63m (3%)      300Mi (16%)       0Mi (0%)        1065Mi (59%)
cluster4-cp2     750m (37%)     0Mi (0%)      70m (3%)      300Mi (16%)       0Mi (0%)        1087Mi (60%)
cluster4-node0   780m (39%)     1500m (75%)   1286m (64%)   200Mi (5%)        0Mi (0%)        992Mi (26%)
cluster4-node1   780m (39%)     1500m (75%)   1071m (53%)   200Mi (5%)        0Mi (0%)        986Mi (25%)
cluster4-node2   780m (39%)     1500m (75%)   1104m (55%)   200Mi (5%)        0Mi (0%)        1153Mi (30%)
cluster4-node3   780m (39%)     1500m (75%)   1118m (55%)   200Mi (5%)        0Mi (0%)        1167Mi (30%)
cluster4-node4   780m (39%)     1500m (75%)   1126m (56%)   200Mi (5%)        0Mi (0%)        989Mi (26%)
```

#### ดูข้อมูลเป็นราย pods ในแต่ละ node เฉพาะ namespace: test
```shell
❯ kube-capacity --pods --namespace test
NODE             POD       CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*                *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-cp0     *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-cp1     *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-cp2     *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node0   *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node1   *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node2   *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node3   *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node4   *         0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)
cluster4-node4   mynginx   0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)
```

#### ดูข้อมูลเป็นราย containers ในแต่ละ node เฉพาะ namespace: test
```shell
❯ kube-capacity --containers --namespace test
NODE             POD       CONTAINER   CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
*                *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-cp0     *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-cp1     *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-cp2     *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node0   *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node1   *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node2   *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node3   *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)

cluster4-node4   *         *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)
cluster4-node4   mynginx   *           0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)
cluster4-node4   mynginx   hello       0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)
cluster4-node4   mynginx   mynginx     0Mi (0%)       0Mi (0%)     0Mi (0%)          0Mi (0%)
```

#### เลือกดูเฉพาะข้อมูลที่อยากดู มีหลาย option ให้กรอกดูเฉพาะที่อยากดูได้หลายอย่างให้เลือกเลย

- -n หรือ --namespace เพื่อเลือกดูข้อมูลเฉพาะ namespace ที่ระบุเท่านั้น
- --namespace-labels key=value เพื่อเลือกดูข้อมูลเฉพาะ namespace ที่มี label ตามที่ระบุไว้
- --node-labels key=value เพื่อเลือกดูข้อมูลเฉพาะ node ที่มี label ตามที่ระบุไว้
- --pod-labels key=value เพื่อเลือกดูข้อมูลเฉพาะ pod ที่มี label ตามที่ระบุไว้

More Info: 
https://github.com/robscott/kube-capacity

## มูลค่าความสุข