題名の通り、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
についてはこちらを参照してください。リンク先で、それぞれAPISERVER
、CRTFILE
、TOKEN
変数で格納しています)
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
を実行します。