使用 Kubernetes 的 Go API 客户端库直接操作 Kubernetes
2016/11/15 10:15 添加补充
这篇文章介绍了包含在kubernetes/kubernetes仓库中的客户端库,但在今年8月或9月,API客户端被单独剥离成为一个新的仓库。
如果未来需要制作任何工具,使用 client-go 是一个不错的选择。
所以,请您在阅读时注意到以下内容是在 client-go 还不存在的时代首次发布的。
追加内容已完成
似乎这个并不为人所知,但是 Kubernetes 有一个官方的 Go 语言 API 客户端库。kubectl 也是使用这个库实现的。
尽管kubectl非常强大,但在实际运用中,其多功能性有时会产生负面影响。因此,我们希望创建一种包装kubectl使其更易使用的工具,但从其他语言中调用kubectl作为子命令并不是理想的做法。我们应该使用API库在本地级别上操作Kubernetes。
突然的示例程式
というわけで、Pod の名前一覧を表示するだけのサンプルコードです。
package main
import (
"fmt"
"os"
"k8s.io/kubernetes/pkg/api"
client "k8s.io/kubernetes/pkg/client/unversioned"
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
)
func newKubeClient() (*client.Client, error) {
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
loadingRules.ExplicitPath = clientcmd.RecommendedHomeFile
loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, &clientcmd.ConfigOverrides{})
clientConfig, err := loader.ClientConfig()
if err != nil {
return nil, err
}
kubeClient, err := client.New(clientConfig)
if err != nil {
return nil, err
}
return kubeClient, nil
}
func main() {
kubeClient, err := newKubeClient()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
pods, err := kubeClient.Pods(api.NamespaceDefault).List(api.ListOptions{})
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
for _, pod := range pods.Items {
fmt.Println(pod.Name)
}
}
输出的结果如下所示。
$ go run listpods.go
hello-world-e2d3x
wordpress-mysql-488205646-t6v4k
ちなみに kubectl get pods だとこうなります。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-e2d3x 1/1 Running 0 8d
wordpress-mysql-488205646-t6v4k 1/1 Running 0 8d
コード解説
API クライアントインスタンスの作成
最初に、ローカルのコンフィグファイルを読み込みます。
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
loadingRules.ExplicitPath = clientcmd.RecommendedHomeFile
clientConfig, err := loader.ClientConfig()
if err != nil {
return nil, err
}
kubeClient, err := client.New(clientConfig)
if err != nil {
return nil, err
}
loadingRules.ExplicitPath にコンフィグファイルのパスを指定します。定数 RecommendedHomeFile は ~/.kube/config を指しています。kubectl がデフォルトで見に行くパスですね。
kubectl –kubeconfig /path/to/kubecfg のようにパスを明示的に指定したい場合は、
loadingRules.ExplicitPath = /path/to/kubecfg
只要将该路径赋值即可。
调用 API
kubeClient.リソース.操作 の形になっています。
pods, err := kubeClient.Pods(api.NamespaceDefault).List(api.ListOptions{})
まず Pods や Secrets のように操作対象リソースを指定します。引数には Namespace を指定します。自分で指定することもできますが、api.NamespaceDefault や api.NamespaceSystem のように定数も用意されてます。
続いて操作内容を指定します。名前を指定して Pod を取得するなら Get(name) ですし、全部の Pod を撮りたいなら List() です。
输出已获取的 Pod 列表的内容
for _, pod := range pods.Items {
fmt.Println(pod.Name)
}
实际的数组存储在pods.Items中,而不是pods。
请注意
k8s.io/kubernetes是Kubernetes的核心存储库,因此如果想要导入API客户端,则需要下载Kubernetes的源代码(包括依赖存储库如docker/docker等)。由于总共有几百兆字节大小,所以如果像使用Godeps那样将供应商包含在存储库中,则需注意。建议使用glide。
最後
通过使用 Kubernetes 的 Go API 客户端库,介绍了一种直接从 Go 语言中操作 Kubernetes 的方法。只要掌握了写法,对于任何资源或操作,我认为都可以相对简单地实现。
最近我使用这个库创建了一个名为 k8sec 的工具。k8sec 是一个类似 Heroku config 的命令行工具,可以以 k8sec set key1=val1 key2=val2 的形式来管理 Kubernetes 的 Secret。请一并查看并使用。
参考
-
- https://godoc.org/k8s.io/kubernetes/pkg/api
https://godoc.org/k8s.io/kubernetes/pkg/client/unversioned
ライブラリのドキュメントです。ただ、実装するときはエディタ補完や godef を駆使していくほうがやりやすいです(個人の感想です)
kubernetes/client-libraries.md at master · kubernetes/kubernetes
API クライアントライブラリ一覧。Go 以外の言語は有志が作成したものです。
How can I create a simple client app with the Kubernetes Go library? – Stack Overflow
timoreimann/kubernetes-goclient-example: An example implementation of a Golang client for Kubernetes.