それもそう
これも大した話ではないんだけど勉強になったのでメモ.
まとめ
Kubernetes API
の/version
をたたけばversion情報を取得できる.
# kube-apiserverのversion情報を取得
$ curl -s --insecure https://<Kubernetes API>/version | jq '.gitVersion'
# jqが使えない場合でも生のjsonのgitVersionから読み取れる
$ curl --insecure https://<Kubernetes API>/version
環境
- macOS Mojave 10.14
- Docker Desktop for Mac
- Version 2.5.0.0
- Kubernetes: v1.19.3
- jq-1.6
やりかた
Kubernetes
クラスタのAPIのバージョンを調べたいとき, kubectl
が使えるならkubectl version
で確認できる.
# Docker DesktopのKubernetesクラスタを使用
$ kubectl cluster-info
Kubernetes master is running at https://kubernetes.docker.internal:6443
KubeDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
# Kubernetesのversionを確認
$ kubectl version --short
Client Version: v1.19.3 # クライアント(kubectl)のversion
Server Version: v1.19.3 # サーバー(kube-apiserver)のversion
これをkubectl
が使えない環境で確認する方法がわかんなかった.
とはいえkubectl
も中身はwebクライアントなので, API側にHTTPリクエストを飛ばして結果を表示しているはず。
ということでkubectl
のコードを読んでみた.kubectl version
を実行したときの処理はたぶんここ1.
呼び出されているdiscoveryClient.ServerVersion()
の処理はおそらくここ2.
APIエンドポイントの/version
にGETを飛ばしてるだけっぽい.
というわけでcurl
でやってみる.
今回使うKubernetes
クラスタはDocker Desktop
で立てたものなのでクライアント認証をしているが,
他の認証方法を使っているクラスタの場合でもエンドポイント等は同じはず.
$ curl --insecure --cert ./client.crt --key ./client.key https://kubernetes.docker.internal:6443/version
{
"major": "1",
"minor": "19",
"gitVersion": "v1.19.3",
"gitCommit": "1e11e4a2108024935ecfcb2912226cedeafd99df",
"gitTreeState": "clean",
"buildDate": "2020-10-14T12:41:49Z",
"goVersion": "go1.15.2",
"compiler": "gc",
"platform": "linux/amd64"
}
取れた.
せっかくなのでjq
で欲しい文字列を抜いてみる.
$ curl -s --insecure --cert ./client.crt --key ./client.key https://kubernetes.docker.internal:6443/version | jq '.gitVersion'
"v1.19.3"
やったぜ.kubectl
を使わずにcurl
でkube-apiserver
のバージョン情報を取得することができた.
ちなみにコードを探さなくても, /
をたたけば使えるエンドポイントの一覧が取得できた.
$ curl --insecure --cert ./client.crt --key ./client.key https://kubernetes.docker.internal:6443/
{
"paths": [
"/api",
"/api/v1",
"/apis",
"/apis/",
...,
"/version"
]
}
まあ今回は解決したのでヨシ!
おわり
kubectl
を使わずにcurl
で直接Kubernetes API
をたたいてバージョン情報を確認する方法がわかった.Kubernetes API
を呼び出して何かする処理を自分で0から実装しようとすると結構たいへんなので, kubectl
のコードを読んで参考にするのが良さそう.
やっぱりちゃんとコードを読むのは大事だと思った.
というかkubectl
が便利すぎる. 偉大.