KubernetesのPodのステータス，CPU，メモリのリソースの取り方

 # 初めに

皆さんこんにちは！！！
今回はKUbernetesのPodのリソースの取り方にについて説明していこうと思います！
取得するメトリクスは内容ステータス，CPU，メモリに絞ろうと思います．

Kubernetesが分からない人は[こちら](https://cloud.google.com/learn/what-is-kubernetes?hl=ja)を見てみてください．


 # Podのステータスの取り方
Podの値を取るための便利なライブラリとしてkubernetesクライアントがあります．
以下のコマンドでインストールしてきましょう！
```
$ pip3 install kubernetes
```
これで使えるようになります．

次にPythonを用いてPodのステータスを取得していきましょう．
例として以下のようなコードを用意しました．
```python
from kubernetes import client, config #kubernetes #クライアントモジュールのインストール

config.load_kube_config("/home/review2/kube/config") #パスの指定　

v1 = client.CoreV1Api()

pod_list = v1.list_namespaced_pod("bookman") #namespaceの指定
for pod in pod_list.items:
print(pod.status.phase)
```
出力結果
```
Running
Running
Running
Running
```
超簡単にですがステータスが出ていますね．
 # CPUの値の取り方

次はCPUメトリクスの取り方ですね！以下のようなコードを作りましょう．
```python
from kubernetes import client, config
import json
file = "/home/review2/kube/config"
config.load_kube_config(file)
api = client.CustomObjectsApi()
v1 = client.CoreV1Api()
resource = api.list_namespaced_custom_object(group="metrics.k8s.io",version="v1beta1", namespace="bookman", plural="pods")

all_array = []

#print(json.dumps(resource,ensure_ascii=False, indent=4, sort_keys=True, separators=(',', ': ')))
for pod in resource["items"]:
    s=pod["metadata"]["name"],pod['containers'][0]["usage"]["cpu"].replace('n','')
    all_array.append(s)
    print(s)

max=None
max_name=""
for container in all_array:
    if max is None:
        max = int(container[1])
    elif int(container[1])<max:
        max=int(container[1])
        max_name=container[0]
print(max_name,max)

# Configs can be set in Configuration class directly or using helper utility
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
    if 'replicas-deployment' in i.metadata.name:

        print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
```

そうするとこんな出力になります．んーーーいい感じ！
```
('mysql-test-79489b6494-46hrp', '266171')
('wordpress-test-667846cf96-dcgcj', '20848')
('wordpress-test-667846cf96-njdcc', '19222')
('wordpress-test-667846cf96-qvkbd', '20063')
```

最後にメモリの取り方を載せておきます！
 # メモリの取り方

```python
from kubernetes import client, config

config.load_kube_config()
api = client.CustomObjectsApi()
v1 = client.CoreV1Api()
resource = api.list_namespaced_custom_object(group="metrics.k8s.io", version="v1beta1", namespace="test", plural="pods")

all_array = []

for pod in resource["items"]:
    container_name = pod["metadata"]["name"]
    memory_usage = pod['containers'][0]["usage"]["memory"]
    
    # 単位を取り除いて数値に変換
    memory_value = int(memory_usage[:-2]) * 1024  # 'Ki'を取り除いて数値に変換し、バイトに変換する
    
    all_array.append((container_name, memory_value))
    print((container_name, memory_value))

max_memory = None
max_container = ""
for container in all_array:
    if max_memory is None:
        max_memory = container[1]
    elif container[1] > max_memory:
        max_memory = container[1]
        max_container = container[0]
        
print(f"Container with highest memory usage: {max_container}, Memory: {max_memory} bytes")

# Podの情報を表示
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
    if 'replicas-deployment' in i.metadata.name:
        print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
```

これでメモリのメトリクスが取れていますね！
```
('mysql-test-79489b6494-46hrp', 4087808)
('wordpress-test-667846cf96-dcgcj', 3260416)
('wordpress-test-667846cf96-njdcc', 3059712)
('wordpress-test-667846cf96-qvkbd', 11759616)
```

 # 最後に
こんな感じでメトリクスを取れるので同じようにメトリクスを取れるので皆さんもよければ使ってみてください！