通过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