LoginSignup
1
0

More than 3 years have passed since last update.

触り始めたので個人的な書き方のメモ

Posted at

編集中。

メモ

これはメモです。

ソース

まずはダーッとソースを貼る。公式の使い方を見つつ適当に切ったり貼ったり。
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)
}
1
0
1

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
1
0