編集中。
メモ
これはメモです。
ソース
まずはダーッとソースを貼る。公式の使い方を見つつ適当に切ったり貼ったり。
gitとかで差分管理しながらやればいいんだろうけど、そういうの苦手。メモを大枠でどかっと載せて、あとから分解していこう作戦。気が向いたら更新。
package gcp
import (
"context"
"crypto/tls"
"crypto/x509"
"encoding/base64"
"fmt"
"net/http"
"k8s.io/client-go/rest"
"k8s.io/client-go/kubernetes"
// istioはやりたいことに合わせてどれをimportするか変える
// 一覧:https://godoc.org/istio.io/client-go/pkg/clientset
// kubernatesと同じでclientsetから一通りのクライアント(とバージョンの組み合わせ)が取れる
istio "istio.io/client-go/pkg/clientset/versioned"
"golang.org/x/build/kubernetes"
"google.golang.org/api/container/v1"
)
// SetupRestConfig returns an kube rest config.
func SetupRestConfig(cluster container.Cluster) (rest.Config, error) {
// Decode certs
// Base64で加工してあるからもとに戻す
decode := func(which string, cert string) []byte {
if err != nil {
return nil
}
s, decErr := base64.StdEncoding.DecodeString(cert)
if decErr != nil {
err = fmt.Errorf("error decoding %s cert: %v", which, decErr)
}
return []byte(s)
}
clientCert := decode("client cert", cluster.MasterAuth.ClientCertificate)
clientKey := decode("client key", cluster.MasterAuth.ClientKey)
caCert := decode("cluster cert", cluster.MasterAuth.ClusterCaCertificate)
if err != nil {
return nil, err
}
return rest.Config {
Host: cluster.Endpoint,
TLSClientConfig {
// 検証スキップフラグ
// Insecure: true
// サーバー名はよくわからないこんな感じでいけるだろうか
ServerName: cluster.Endpoint,
CertData: clientCert,
KeyData: clientKey,
CAData: caCert,
}
}
}
// GetCluster クラスター情報の取得
func GetCluster(ctx context.Context, name string, project string, zone string) (container.Cluster, error) {
containerService, err := container.New()
if err != nil {
return nil, fmt.Errorf("could not create client for Google Container Engine: %v", err)
}
return containerService.Projects.Zones.Clusters.Get(project, zone, name).Context(ctx).Do()
}
// NewKubernatesClient kubernatesのclientsetを作って返す
func NewKubernatesClientset(ctx context.Context, cluster string, project string , zone string) (*kubernates.Clientset, error) {
cluster, err := GetCluster(ctx, cluster, project, zone)
if err != nil {
return nil, err
}
config, err := SetupRestConfig(cluster)
if err != nil {
return nil, err
}
return kubernetes.NewForConfig(config)
}
// NewIstioNetworkClient
// 以下を見ながら適当に使いたいものを引っ張ってくる
// https://godoc.org/istio.io/client-go
func NewIstioClientset(ctx context.Context, cluster string, project string , zone string) (*istio.Clientset, error) {
cluster, err := GetCluster(ctx, cluster, project, zone)
if err != nil {
return nil, err
}
config, err := SetupRestConfig(cluster)
if err != nil {
return nil, err
}
return istio.NewForConfig(config)
}