zoukankan      html  css  js  c++  java
  • client-go开发k8s:创建deployment

    简介、创建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
    }
  • 相关阅读:
    刷面经笔记2019.02.11
    刷面经笔记2019.02.10
    刷面经笔记2019.02.09
    刷面经笔记2019.02.07
    刷面经笔记2019.02.05
    刷面经笔记2019.01.31
    刷面经笔记2019.01.30
    刷面经笔记2019.01.28
    头条2020届实习生笔试题
    金s办公软件web前端笔试题
  • 原文地址:https://www.cnblogs.com/wuchangblog/p/14208555.html
Copyright © 2011-2022 走看看