事前条件
- 利用できるkubernetesクラスタがある(参考: GNU/Linuxにkindを使ってkubernetesをセットアップする)
- goがインストールされている(参考: GNU/Linuxにgoenvでgolangをセットアップする)
- go modulesが利用できる(go v1.13以降ならデフォルトで利用できる)
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