Kubernetesクラスタの操作には、kubectlというCLIルーツを使用します。このkubectlはKubernetes Masterが持つAPIにリクエストを送ることでKubernetesを操作しています。これはつまり、curl(コマンドラインツール)でAPIにリクエストを送りKubernetesを操作することも可能ということです。
ということで、kubectlのコマンドをcurlを使ってやってみることにしました。勉強になりました。
環境
- minikube : v1.25.1
Kubectlコマンドの裏では何をやっているの?
kubectl get nodes でノードの情報をとります。オプションで–v=6と指定すると、このコマンドが何をやっているのかが表示されるようです。
kubectl get nodes --v=6
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リクエストを送ってみます。
curl -XGET https://192.168.49.2:8443/api/v1/nodes?limit=500
SSLのエラーが出ております。とりあえず、–insecureオプションで逃げてみましょう。
curl -XGET https://192.168.49.2:8443/api/v1/nodes?limit=500 --insecure
403 forbedden が返ってきています。禁止されているようです。クライアントの証明とかをしていないので、そりゃそうです。では、curlコマンドに以下2つの部分を組み込んでみましょう。
- Config loaded from file: /home/goto/.kube/config
- Starting client certificate rotation controller
こちらのブログを参考にさせていただきました。
~/.kube/config ファイル内の以下情報を使用するといいみたいです。(kubectl config viewでも確認可能)
cat ~/.kube/config
- 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にしております)
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
通った!!!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にオプション付けて頑張ったのバカみたいですね。。
一応、このコードで試してみました。簡単にできました。
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))
まとめ
- kubectlはkubeconfigファイルを使って、APIサーバーの特定と認証している。
- curlでもkubectlコマンドと同じことはできる。しかし、認証に必要な3つのオプションが必要。
- python clientを使用すると、kubectlのkubeconfigを使う部分と同じことをやってくれるので楽。
今回は以上です。少しだけ理解が進みました。が、まだまだ、セキュリティ周りが全然弱いです。そもそもkubernetesの基礎的な仕組みがわかっていないし、証明書とか認証とかのセキュリティの基礎もダメ、APIもよくわかっていないです。やることたくさん。