簡介、創建deployment有多種方式,如引用創建編排好的yaml文件,然后直接創建,或者在代碼內寫好需要的文件再進行創建,本文將都舉例進行
1、引用本地的yaml文件進行創建,並且更新replicas
package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"path/filepath"
v1 "k8s.io/api/apps/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
yaml "k8s.io/apimachinery/pkg/util/yaml"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
func main() {
// create the clientset
clientset := K8sClient()
var (
err error
data []byte
deployment =&v1.Deployment{}
replicas int32
)
//讀取yaml
if data, err = ioutil.ReadFile("C:/Users/72088854/go/src/config"); err != nil {
fmt.Print(err)
}
//yaml轉json
if data, err = yaml.ToJSON(data); err != nil {
return
}
//json轉struct
if err = json.Unmarshal(data, deployment); err != nil {
return
}
deploymentName := deployment.ObjectMeta.Name
//定義副本的數量
replicas = 4
deployment.Spec.Replicas = &replicas
fmt.Println(deploymentName)
if _, err = clientset.AppsV1().Deployments("default").Get(context.TODO(),deploymentName, metav1.GetOptions{}); err !=nil {
if !errors.IsNotFound(err) {
fmt.Println(err)
return
}
//如果不存在則創建deployment
if _, err = clientset.AppsV1().Deployments("default").Create(context.TODO(), deployment, metav1.CreateOptions{}); err != nil {
fmt.Println(err)
return
}
} else {
//如果存在則更新deployement
if _, err = clientset.AppsV1().Deployments("default").Update(context.TODO(), deployment,metav1.UpdateOptions{}); err != nil {
fmt.Println(err)
return
}
}
fmt.Println("create成功!!!")
}
2、代碼內書寫yaml進行創建
package main
import (
"context"
"flag"
"fmt"
"path/filepath"
v1 "k8s.io/api/apps/v1"
apiv1 "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"
)
func main() {
// create the clientset
clientset := K8sClient()
var (
err error
deploys =&v1.Deployment{}
)
//json轉struct
deployment := &v1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: "vc-web",
},
Spec: v1.DeploymentSpec{
Replicas: int32Ptr(2),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": "vc-web",
},
},
Template: apiv1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": "vc-web",
"version": "V1",
},
},
Spec: apiv1.PodSpec{
Containers: []apiv1.Container{
{
Name: "vc-web",
Image: "nginx:1.13.5-alpine",
ImagePullPolicy: "IfNotPresent",
Ports: []apiv1.ContainerPort{
{
Name: "http",
Protocol: apiv1.ProtocolTCP,
ContainerPort: 80,
},
},
},
},
},
},
},
}
cluster := deployment.ObjectMeta.ClusterName
namespace := deployment.ObjectMeta.Namespace
deploymentName := deployment.ObjectMeta.Name
fmt.Println("hello",deploymentName)
if deployment, err = clientset.AppsV1().Deployments(apiv1.NamespaceDefault).Create(context.TODO(), deployment, metav1.CreateOptions{}); err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("create成功!!!")
fmt.Println(cluster, namespace, deploymentName)
}
func int32Ptr(i int32) *int32 {
return &i
}
func K8sClient() *kubernetes.Clientset {
// 使用當前上下文環境
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
// 根據指定的 config 創建一個新的 clientSet
clientSet, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
return clientSet
}