kubectlコマンドをcurlでやってみた!

Kubernetesクラスタの操作には、kubectlというCLIルーツを使用します。このkubectlはKubernetes Masterが持つAPIにリクエストを送ることでKubernetesを操作しています。これはつまり、curl(コマンドラインツール)でAPIにリクエストを送りKubernetesを操作することも可能ということです。

ということで、kubectlのコマンドをcurlを使ってやってみることにしました。勉強になりました。

環境

  • minikube : v1.25.1

Kubectlコマンドの裏では何をやっているの?

kubectl get nodes でノードの情報をとります。オプションで–v=6と指定すると、このコマンドが何をやっているのかが表示されるようです。

bash
kubectl get nodes --v=6
bash

3つのことをやっているようです。

  • Config loaded from file:  /home/goto/.kube/config
  • Starting client certificate rotation controller
  • GET https://192.168.49.2:8443/api/v1/nodes?limit=500

config ファイルをロードして、クライアントの証明をして、GETリクエストを送る。という感じでしょうか。おそらく、この3つをcurlを使ってやればいいのでしょう。

curlしてみる

まず、curlでGETリクエストを送ってみます。

bash
curl -XGET https://192.168.49.2:8443/api/v1/nodes?limit=500
bash

SSLのエラーが出ております。とりあえず、–insecureオプションで逃げてみましょう。

bash
curl -XGET https://192.168.49.2:8443/api/v1/nodes?limit=500 --insecure
bash

403 forbedden が返ってきています。禁止されているようです。クライアントの証明とかをしていないので、そりゃそうです。では、curlコマンドに以下2つの部分を組み込んでみましょう。

  • Config loaded from file:  /home/goto/.kube/config
  • Starting client certificate rotation controller

こちらのブログを参考にさせていただきました。

~/.kube/config ファイル内の以下情報を使用するといいみたいです。(kubectl config viewでも確認可能)

bash
cat ~/.kube/config
bash
  • cercertificate-authority: /home/goto/.minikube/ca.crt
  • client-certificate: /home/goto/.minikube/profiles/minikube/client.crt
  • client-key: /home/goto/.minikube/profiles/minikube/client.key

ではこれらをcurlのオプションで指定してGETリクエストをしてみます。(出力長くなるのでlimit=1にしております)

bash
curl -XGET https://192.168.49.2:8443/api/v1/nodes?limit=500 \
--cacert ~/.minikube/ca.crt \
--cert ~/.minikube/profiles/minikube/client.crt \
--key ~/.minikube/profiles/minikube/client.key
bash

通った!!!Nodes情報GET出来ています。

pythonのライブラリを使えば簡単

公式ドキュメントのTasksには、Kubernetesは公式でGo,Python,Java,dotnet,javascript,Haskellのクライアントライブラリをサポートしていると書いてあります。

Pythonを見てみると、Pod情報を取得するコードが例として紹介されています。かなりスッキリしたコードです。証明書関連はどうなっているのだろうと見ているとこんな記述があります。

The Python client can use the same kubeconfig file as the kubectl CLI does to locate and authenticate to the API server.

https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#python-client

「Pythonクライアントは、kubectlと同じkube configファイルを使って、APIサーバーの特定と認証をすることができる」とのことです。curlにオプション付けて頑張ったのバカみたいですね。。

一応、このコードで試してみました。簡単にできました。

example_python_client.py
from kubernetes import client, config

config.load_kube_config()

v1=client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
    print("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
bash

まとめ

  • kubectlはkubeconfigファイルを使って、APIサーバーの特定と認証している。
  • curlでもkubectlコマンドと同じことはできる。しかし、認証に必要な3つのオプションが必要。
  • python clientを使用すると、kubectlのkubeconfigを使う部分と同じことをやってくれるので楽。

今回は以上です。少しだけ理解が進みました。が、まだまだ、セキュリティ周りが全然弱いです。そもそもkubernetesの基礎的な仕組みがわかっていないし、証明書とか認証とかのセキュリティの基礎もダメ、APIもよくわかっていないです。やることたくさん。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です