LoginSignup
4
3

More than 3 years have passed since last update.

golangでkubernetes APIにアクセスする

Last updated at Posted at 2020-05-05

事前条件

Kubernetes APIにアクセスするコードを用意する

Kubernetes APIにアクセスするにはclient-goを使います。この場合client-goを使うコードを1から書いてもよいですが、kyaml2goを使うと、yamlファイルからclient-goを利用するコードを生成してくれます。書くのが面倒なkubernetesのオブジェクトのコードも自動的に生成してくれます。これらのコードを参考にclient-goのリファレンスを参考にコードを修正したりして、再利用するとよいと思います。

namespaceのyaml

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

kyaml2goで生成された上記namespaceをcreateするコード

// 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

ビルドして、コマンドを実行してみます。意図したnamespaceが作成されることが確認できます。

$ go build
$ ./client-go-sample 
Namespace Created successfully!
$ kubectl get namespaces sample-namespace 
NAME               STATUS   AGE
sample-namespace   Active   22s
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3