1
0

More than 3 years have passed since last update.

golangでk8sクラスターのDeploymentをscale

Last updated at Posted at 2019-12-09

題名の通り、golangでk8sクラスターのDeploymentをscaleさせます。

例えば定常運用(閉局)時に、以下のコードを改変してFaaSに登録しておけば1クリックでpodの数を0個にスケールさせることができます。(その場合FaaS用のService Accountをk8sクラスタに作成して権限を絞ったroleを作成/割り当てを行うことが望ましいかと思います)

まずはコードの依存関係です。

package main
import (
        "fmt"
        "net/http"
        "io/ioutil"
        "crypto/x509"
        "crypto/tls"
        "encoding/json"
        "strings"
)

以下、メイン関数です。
(以下コード中のAPIサーバーのエンドポイントの変数apiserver、証明書パスの変数crtpath、トークンの変数tokenについてはこちらを参照してください。リンク先で、それぞれAPISERVERCRTFILETOKEN変数で格納しています)

func main () {
        apiserver := "https://192.168.99.100:8443"
        //以下はネームスペースdefaultのデプロイメントnginx-deploymentをスケールさせる例
        namespa
        path := "/apis/apps/v1/namespaces/default/deployments/nginx-deployment/scale"
        endpoint := apiserver+path
        //scaleはPATCHメソッド
        method := "PATCH"
     //PATCH対象データ。
        data := `{"spec":{"replicas":3}}`
        //PATCH時のContent-Typeはapplication/strategic-merge-patch+json
        ctype := "application/strategic-merge-patch+json"
        //証明書のパス
        crtpath := "/Users/sota-n/.minikube/ca.crt"
        //SAトークン
        token := "xxx..."
        //リクエストに対するリターンとステータスコードを表示。
        respCode,respBody := request(endpoint,method,data,ctype,crtpath,token)
        fmt.Println(respCode)
        fmt.Println(respBody)
}

以下がリクエストを発行する関数です。
エラーハンドリングは全て省略しています。

//response bodyとステータスコードを返す関数。
func request (endpoint,method,data,ctype,crtpath,token string) (string,int) {
        //証明書読み取りと構成
        caCert, _ := ioutil.ReadFile(crtpath)

        caCertPool := x509.NewCertPool()
        caCertPool.AppendCertsFromPEM(caCert)

        //リクエスト構成
        req, _ := http.NewRequest(method, endpoint, strings.NewReader(data))
        req.Header.Set("Accept","application/json")
        req.Header.Set("Content-Type",ctype)
        req.Header.Set("Authorization","Bearer "+token)

        tr := &http.Transport{
                TLSClientConfig: &tls.Config{RootCAs: caCertPool,},
        }

        client := &http.Client{
                Transport: tr,
        }

        //リクエスト発行
        resp, _ := client.Do(req)
        defer resp.Body.Close()

        //レスポンス処理
        body, _ := ioutil.ReadAll(resp.Body) //"body" -> []uint8
        var val interface{}
        json.Unmarshal([]byte(body),&val)
        respBody,_ := json.MarshalIndent(val,"","  ")
        return string(respBody),resp.StatusCode
}

以上のコードをビルドして実行するかgo run <上のコード>.goを実行します。

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