IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Go实现kubectl apply操作 -> 正文阅读

[系统运维]Go实现kubectl apply操作

package main

import (
	"bytes"
	"context"
	"fmt"
	"io"

	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
	"k8s.io/apimachinery/pkg/runtime"
	"k8s.io/apimachinery/pkg/runtime/schema"
	syaml "k8s.io/apimachinery/pkg/runtime/serializer/yaml"
	"k8s.io/apimachinery/pkg/types"
	"k8s.io/apimachinery/pkg/util/yaml"

	"k8s.io/client-go/dynamic"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/restmapper"
	"k8s.io/client-go/tools/clientcmd"

	restclient "k8s.io/client-go/rest"

	sigyaml "sigs.k8s.io/yaml"

)
var s = `
apiVersion: v1
kind: Service
metadata:
  annotations:
    meta.helm.sh/release-name: sentry-project
    meta.helm.sh/release-namespace: helm-sentry
  labels:
    app: sentry-project
    app.kubernetes.io/managed-by: Helm
    heritage: Helm
    release: sentry-project
  name: sentry-project-web
  #namespace: helm-sentry
spec:
  ports:
  - name: sentry
    port: 9000
    protocol: TCP
    targetPort: 9000
  selector:
    app: sentry-project
    role: web
  type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    meta.helm.sh/release-name: sentry-project
    meta.helm.sh/release-namespace: helm-sentry
  labels:
    app: sentry-project
    app.kubernetes.io/managed-by: Helm
    chart: sentry-12.0.0
    heritage: Helm
    release: sentry-project
  name: sentry-project-relay
spec:
  ports:
  - name: sentry-relay
    port: 3000
    protocol: TCP
    targetPort: 3000
  selector:
    app: sentry-project
    role: relay
  type: ClusterIP
`

var (
	config    *restclient.Config
	clientSet *kubernetes.Clientset
	dynameicclient dynamic.Interface
)

type ApplyYaml struct {
	applyYaml string
	namespace string
	applyErr map[string]error
}


func init() {
	var err error
	config, err = clientcmd.BuildConfigFromFlags("", "/Users/qushuaibo/.kube/config")
	if err != nil {
		panic(err)
	}

	clientSet ,err = kubernetes.NewForConfig(config)
	if err != nil {
		panic(err)
	}

	dynameicclient,err  = dynamic.NewForConfig(config)
	if err != nil {
		panic(err)
	}
}


func NewApplyYaml(y ,ns string) *ApplyYaml {
	return &ApplyYaml{
		applyYaml: s,
		namespace: ns,
		applyErr: map[string]error{},
	}
}

func main() {
	apply := NewApplyYaml(s,"default")
	apply.CreateOrUpdateFromYaml()
	for k,v := range apply.applyErr {
		fmt.Println(k,v)
	}
}


func (y *ApplyYaml) CreateOrUpdateFromYaml()  {
	//序列化为yaml
	d := yaml.NewYAMLOrJSONDecoder(bytes.NewBufferString(y.applyYaml), 4096)

	for {

		var (
			rawObj runtime.RawExtension
		)

		err := d.Decode(&rawObj)
		if err == io.EOF {
			break
		}
		if err != nil {
			y.applyErr["decode"] = fmt.Errorf("decode is err %v", err)
			continue
		}

		obj, _, err := syaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, nil)
		if err != nil {
			y.applyErr["decode"] =  fmt.Errorf("rawobj is err%v", err)
			continue
		}

		unstructuredMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
		if err != nil {
			y.applyErr["decode"] = fmt.Errorf("tounstructured is err %v", err)
			continue
		}

		unstructureObj := &unstructured.Unstructured{Object: unstructuredMap}
		gvr, err := y.GtGVR(unstructureObj.GroupVersionKind())
		if err != nil {
			y.applyErr[unstructureObj.GetName()] = fmt.Errorf("get gvr is false %v",err)
			continue
		}

		unstructuredYaml, err := sigyaml.Marshal(unstructureObj)
		if err != nil {
			y.applyErr[unstructureObj.GetName()] =  fmt.Errorf("unable to marshal resource as yaml: %w", err)
			continue
		}

		if y.namespace != "" && unstructureObj.GetNamespace() != "" &&  y.namespace != unstructureObj.GetNamespace(){
			y.applyErr[unstructureObj.GetName()] = fmt.Errorf("the namespace from the provided object %v does not match the namespace %v",y.namespace,unstructureObj.GetNamespace())
			continue
		}


		if y.namespace == "" && unstructureObj.GetNamespace() ==  "" {
			unstructureObj.SetNamespace("default" )
		}


		_, err = dynameicclient.Resource(gvr).Namespace(y.namespace).Get(context.Background(), unstructureObj.GetName(), metav1.GetOptions{})
		if err != nil {
			_, createErr := dynameicclient.Resource(gvr).Namespace(y.namespace).Create(context.Background(), unstructureObj, metav1.CreateOptions{})
			if createErr != nil {
				y.applyErr[unstructureObj.GetName()] = fmt.Errorf("create err is :%v",createErr)
				continue
			}
			fmt.Printf("create %v   %v \n",unstructureObj.GetKind(),unstructureObj.GetName())
			continue
		}

		force := true

		_, err = dynameicclient.Resource(gvr).
			Namespace(unstructureObj.GetNamespace()).
			Patch(context.Background(),
				unstructureObj.GetName(),
				types.ApplyPatchType,
				unstructuredYaml, metav1.PatchOptions{
					FieldManager: unstructureObj.GetName(),
					Force:        &force,
				})


		if err != nil {
			y.applyErr[unstructureObj.GetName()] = fmt.Errorf("unable to patch resource: %w", err)
			continue
		}
	}

	return
}


func (y *ApplyYaml) GtGVR(gvk schema.GroupVersionKind) (schema.GroupVersionResource, error) {

	gr, err := restmapper.GetAPIGroupResources(clientSet)
	if err != nil {
		return schema.GroupVersionResource{}, err
	}

	mapper := restmapper.NewDiscoveryRESTMapper(gr)

	mapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version)
	if err != nil {
		return schema.GroupVersionResource{}, err
	}

	return mapping.Resource, nil
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:37:43  更:2022-03-17 22:40:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 1:33:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码