使用 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.

广告
将在 10 秒后关闭
bannerAds