それもそう
これも大した話ではないんだけど勉強になったのでメモ.
まとめ
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が便利すぎる. 偉大.
おまけ

