kubernetes clientでpodの状態を確認する

kubectlコマンドでも確認できるのですが、久々にプログラミングをしたくなったので、
kubernetes clientを使って標記の件をやってみました。

kubernetes client

公式ドキュメントのclient librariesにクライアントライブラリ一覧が記載されています。

この記事を書いている時点の情報ですが、オフィシャルサポートとなっているクライアントの言語は、GO/python/java/C#/javascriptの5種類。
せっかくの機会なので未経験のpythonでやってみることにします。

クライアントを使ってやってみること

podの情報を取得し、そこからkafka brokerコンテナの情報を出力する。
kubectl get -n -o jsonで取得可能な情報をkubernetes clientで同じようにやってみる感じです。

podの作成

kubernetesのhelmを使ってpodを作ります。
helmでのdeployは、特に拘りはないのですがkafkaをチョイス。
kafka用のhelm chartはこちらを利用しました。
デフォルトの設定から一部変更し、brokerの数を1、jmx-exporterをenableにし、1pod-2containerの構成に変更。

$ helm install -n kafka incubator/kafka -f values.yaml --namespace kafka

投入コマンドはこんな感じですが、helmは本記事の趣旨ではないので説明は割愛します。

podの状態確認

$ kubectl get pod kafka-0 -n kafka
NAME      READY     STATUS    RESTARTS   AGE
kafka-0   2/2       Running   1          5m

無事に起動。

サンプルプログラム

#!/usr/bin/env python                                                     

import os                                                                 
from kubernetes import client, config                                     
from kubernetes.client.rest import ApiException                           

################################################################          

config.load_kube_config(os.path.join(os.environ["HOME"], '.kube/config')) 
v1 = client.CoreV1Api()                                                   

namespace = 'kafka'                                                       
label = 'app=kafka'                                                       

try:                                                                      
  pod_list = v1.list_namespaced_pod(namespace, label_selector=label)      
except ApiException as e:                                                 
  print('Exception when calling CoreV1Api->list_namespaced_pod: %s\n' % e)

for pod in pod_list.items:                                                
  for container in pod.spec.containers:                                   
    if container.name == 'kafka-broker':                                  
      print container

以下は簡単な説明。

kubernetesのconfigファイル読み込み

config.load_kube_config(os.path.join(os.environ["HOME"], '.kube/config')) 

引数にはconfigファイルのパスを指定。

podの取得

namespace = 'kafka'                                                       
label = 'app=kafka'

try:                                                                 
  pod_list = v1.list_namespaced_pod(namespace, label_selector=label)      

kubectl get pod -n kafka -l app=kafka -o jsonと同じようなイメージです。
利用したhelm chartでは、kafka podにはラベルapp=kafkaが付与されます。

コンテナ情報の参照

for pod in pod_list.items:                                                
  for container in pod.spec.containers:                                   
    if container.name == 'kafka-broker':                                  
      print container

なんかネストが深いのでちょっと微妙な感じがします…
今回はlist_namespaced_pod関数を使いましたが、左記リンクのresponseに書かれている情報を見れば、どのような構造で値が返ってくるか読み取れます。
kubectl get pod -n kafka -l app=kafka -o jsonに馴染みがある人はそちらの構造をそのまま辿っていただければ見たい情報に辿り着けると思います。
今回はkafka用のポッド内には、brokerのコンテナとprometheusのexporter用のコンテナの2つがありますので、brokerのコンテナのみ出力するためにコンテナ名で判定しています。

出力結果

{'args': None,
 'command': ['sh',
             '-exc',
             'unset KAFKA_PORT && \\\nexport KAFKA_BROKER_ID=${HOSTNAME##*-} && \\\nexport KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://${POD_IP}:9092 && \\\nexec /etc/confluent/docker/run\n'],
.
.
.
(略)

こんな感じで出力されます。

广告
将在 10 秒后关闭
bannerAds