通过golang访问kubernetes API

先决条件

    • 利用できるkubernetesクラスタがある(参考: GNU/Linuxにkindを使ってkubernetesをセットアップする)

 

    • goがインストールされている(参考: GNU/Linuxにgoenvでgolangをセットアップする)

go modulesが利用できる(go v1.13以降ならデフォルトで利用できる)

准备访问Kubernetes API的代码。

要访问Kubernetes API,使用client-go。在这种情况下,可以从头开始编写使用client-go的代码,但是使用kyaml2go能够为我们从yaml文件生成使用client-go的代码。它还会自动为我们生成繁琐的Kubernetes对象的代码。建议参考这些代码并根据client-go的参考资料进行修改和重用。

命名空间的yaml文件

apiVersion: v1
kind: Namespace
metadata:
  name: sample-namespace

使用kyaml2go生成的上述命名空间的创建代码。

// Auto-generated by kyaml2go - https://github.com/PrasadG193/kyaml2go
package main

import (
    "fmt"
    corev1 "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
    "os"
    "path/filepath"
)

func main() {
    // Create client
    var kubeconfig string
    kubeconfig, ok := os.LookupEnv("KUBECONFIG")
    if !ok {
        kubeconfig = filepath.Join(homedir.HomeDir(), ".kube", "config")
    }

    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        panic(err)
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err)
    }
    kubeclient := clientset.CoreV1().Namespaces()

    // Create resource object
    object := &corev1.Namespace{
        TypeMeta: metav1.TypeMeta{
            Kind:       "Namespace",
            APIVersion: "v1",
        },
        ObjectMeta: metav1.ObjectMeta{
            Name: "sample-namespace",
        },
        Spec: corev1.NamespaceSpec{},
    }

    // Manage resource
    _, err = kubeclient.Create(object)
    if err != nil {
        panic(err)
    }
    fmt.Println("Namespace Created successfully!")
}

准备一个用于存放源代码的目录,并在该目录中创建main.go文件,然后将之前的代码写入其中。

$ mkdir client-go-sample
$ cd client-go-sample
$ vi main.go

模块的安装和构建

直接使用go get无法正确解决依赖关系。你需要安装与所指定的Kubernetes版本相匹配的模块,如client-go。下面是针对Kubernetes版本为1.14.10的情况。如果Kubernetes版本比1.17更新,则标签的指定方式会有所不同。

$ go mod init client-go-sample
$ go get # エラーが出ますが、気にしなくて良いです。
$ go get k8s.io/client-go@kubernetes-1.14.10
$ go get k8s.io/api@kubernetes-1.14.10
$ go get k8s.io/apimachinery@kubernetes-1.14.10

我将进行编译并执行命令,以确认所希望的名称空间被创建。

$ go build
$ ./client-go-sample 
Namespace Created successfully!
$ kubectl get namespaces sample-namespace 
NAME               STATUS   AGE
sample-namespace   Active   22s
广告
将在 10 秒后关闭
bannerAds