client-go基础用法之增删改查deployment

2023-11-01

1 创建clientSet

package clientset

import (
	"flag"
	log "github.com/sirupsen/logrus"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"os"
	"path/filepath"
)

func GetClientSet() (*kubernetes.Clientset, error) {
	var kubeConfig *string
	// 从当前系统环境中读取家目录,然后拼接config 路径
	// 或者直接给一个kube config的绝对路径字符串也可
	if home := 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()

	// uses the current context get restConfig
	config, err := clientcmd.BuildConfigFromFlags("", *kubeConfig)
	if err != nil {
		log.Panic(err)
	}

	// 创建clientSet
	clientSet, err := kubernetes.NewForConfig(config)
	if err != nil {
		return nil, err
	}
	return clientSet, nil
}

func HomeDir() string {
	// linux
	if h := os.Getenv("HOME"); h != "" {
		return h
	}
	// windows
	return os.Getenv("USERPROFILE")
}

2 获取pod信息

func GetPods(client *kubernetes.Clientset, ctx context.Context, namespace string) {
	// get pod
	pods, err := client.CoreV1().Pods(namespace).List(ctx, metaV1.ListOptions{})
	if err != nil {
		log.Panic(err)
	}
	fmt.Println("pod Name ===> ", pods.Items[0].Status.ContainerStatuses[0].Name)
	fmt.Println("pod Image ===> ", pods.Items[0].Status.ContainerStatuses[0].Image)
	fmt.Println("pod State ===> ", pods.Items[0].Status.ContainerStatuses[0].State.Running)
}

3 获取deployment信息

func GetDeploy(client *kubernetes.Clientset, ctx context.Context, deployName, namespace string) {
	// get deploy
	deployment, err := client.AppsV1().Deployments(namespace).Get(ctx, deployName, metaV1.GetOptions{})
	if err != nil {
		log.Println(err)
	}
	fmt.Println("deployment name ===> ", deployment.Name)
}

4 更新deployment副本数量

func UpdateDeployReplica(client *kubernetes.Clientset, ctx context.Context, deployName, namespace string, replicas int32) {
	// 1 方法一:更新deployment 副本数量
	deployment, err := client.AppsV1().Deployments(namespace).Get(ctx, deployName, metaV1.GetOptions{})
	if err != nil {
		log.Println(err)
	}
	// 设置副本数量
	deployment.Spec.Replicas = &replicas
	deployment, err = client.AppsV1().Deployments(namespace).Update(ctx, deployment, metaV1.UpdateOptions{})

	// 2 方法二:更新副本数量的另一种方法
	replica, err := client.AppsV1().Deployments(namespace).GetScale(ctx, deployName, metaV1.GetOptions{})
	replica.Spec.Replicas = replicas
	replica, err = client.AppsV1().Deployments(namespace).UpdateScale(ctx, deployName, replica, metaV1.UpdateOptions{})
	fmt.Println("replica name ====>", replica.Name)
}

5 更新deployment镜像

func UpdateDeployImage(client *kubernetes.Clientset, ctx context.Context, deployName, namespace, image string) {
	deployment, err := client.AppsV1().Deployments(namespace).Get(ctx, deployName, metaV1.GetOptions{})
	if err != nil {
		log.Println(err)
	}
	deployment.Spec.Template.Spec.Containers[0].Image = image
	deployment, err = client.AppsV1().Deployments(namespace).Update(ctx, deployment, metaV1.UpdateOptions{})
}

6 删除deployment

func DeleteDeploy(client *kubernetes.Clientset, ctx context.Context, deployName, namespace string) {
	// 删除deployment
	err := client.AppsV1().Deployments(namespace).Delete(ctx, deployName, metaV1.DeleteOptions{})
	if err != nil{
		log.Println(err)
	}
}

7 创建deployment和service

func CreateDeploy(client *kubernetes.Clientset, ctx context.Context, namespace string) {
	var replicas int32 = 3
	var targetPort int32 = 80
	intString := intstr.IntOrString{
		IntVal: targetPort,
	}
	deployment := &appV1.Deployment{
		ObjectMeta: metaV1.ObjectMeta{
			Name: "nginx",
			Labels: map[string]string{
				"app": "nginx",
			},
			Namespace: namespace,
		},
		Spec: appV1.DeploymentSpec{
			Replicas: &replicas,
			Selector: &metaV1.LabelSelector{
				MatchLabels: map[string]string{
					"app": "nginx",
				},
			},
			Template: coreV1.PodTemplateSpec{
				ObjectMeta: metaV1.ObjectMeta{
					Name: "nginx",
					Labels: map[string]string{
						"app": "nginx",
					},
				},
				Spec: coreV1.PodSpec{
					Containers: []coreV1.Container{
						{
							Name: "nginx",
							Image: "nginx:1.16.1",
							Ports: []coreV1.ContainerPort{
								{
									Name: "http",
									Protocol: coreV1.ProtocolTCP,
									ContainerPort: 80,
								},
							},
						},
					},
				},
			},
		},
	}
	service := &coreV1.Service{
		ObjectMeta: metaV1.ObjectMeta{
			Name: "nginx",
			Labels: map[string]string{
				"app": "nginx",
			},
			Namespace: namespace,
		},
		Spec: coreV1.ServiceSpec{
			Type: coreV1.ServiceTypeNodePort,
			Ports: []coreV1.ServicePort{
				{
					Name: "nginx",
					Port: 80,
					TargetPort: intString,
					NodePort: 30088,
					Protocol: coreV1.ProtocolTCP,
				},
			},
			Selector: map[string]string{
				"app": "nginx",
			},
		},
	}

	deployment, err := client.AppsV1().Deployments(namespace).Create(ctx, deployment, metaV1.CreateOptions{})
	if err != nil {
		log.Println("err ===> ", err)
	}
	service, err = client.CoreV1().Services(namespace).Create(ctx, service, metaV1.CreateOptions{})
}

8 main 函数

package main

import (
	"client-go/clientset"
	"context"
	"fmt"
	log "github.com/sirupsen/logrus"
	appV1 "k8s.io/api/apps/v1"
	coreV1 "k8s.io/api/core/v1"
	metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/util/intstr"
	"k8s.io/client-go/kubernetes"
)

func main() {
	deployName := "myapp-deploy"
	namespace := "default"
	//image := "nginx:1.15-alpine"
	var replicas int32 = 2

	ctx := context.Background()
	// get the clientset
	client, err := clientset.GetClientSet()
	if err != nil {
		log.Panic(err)
	}

	GetPods(client, ctx, namespace)
	GetDeploy(client, ctx, deployName, namespace)
	//DeleteDeploy(client, ctx, deployName, namespace)
	//UpdateDeployImage(client, ctx, deployName, namespace, image)
	UpdateDeployReplica(client, ctx, deployName, namespace, replicas)

	CreateDeploy(client, ctx, namespace)
}

有关client-go的详细说明参考文章:client-go的使用及源码分析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

client-go基础用法之增删改查deployment 的相关文章

随机推荐

  • 混淆矩阵 Confusion Matrix

    混淆矩阵定义 机器学习中总结分类模型预测结果的分析表 以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准并进行汇总 矩阵的行表示真实值 矩阵的列表示预测值 分类评估指标中定义的一些符号含义 如下 1 TP True P
  • Java从json串中获取某个值

    Java从json串中获取某个值 java对象是不能直接传输 只有json对象 转成字符串 可以进行传输 故 传输中都是json进行的 接收到json数据之后 java在进行解析转换成为字符串 且json适用于很多语言之间的传输 json本
  • Redis应用(1)——生成全局唯一标识ID

    1 概述 在实际项目中 根据不同的业务逻辑需要生成唯一的标识id 如购买商品生成的订单号 尽管这个标识id功能非常的简单 但是如果不能成功的生成唯一标识id 那将会影响后续的业务逻辑 我们可以使用数据库去生成唯一标识id 但是其性能受到数据
  • [C++]实现顺序表和单链表

    顺序表 include
  • services in OS implementations

    As a structuring principle we identify three categories of services in OS implementations hardware services user service
  • html打印页面demo,Window.print()打印整个网站中的部分内容,打印后,原网页保持不变...

    想要达到打印整个网站中的部分内容且完成打印后原网页保持不变的效果 搜到以下资料 window print打印指定网页区域的方法 JavaScript页面打印 只打印指定部分 JS打印指定页面且去样式后的内容 window print 都能达
  • oracle 11g open_cursors 修改,修改open_cursors和session_cached_cursors的参数值

    用oracle 的ADDM生产了报告 其中建议修改open cursors和session cached cursors的参数值 如 FINDING 3 15 impact 1673 seconds Soft parsing of SQL
  • 修改springboot依赖jar包默认版本

    有两种方法 一 用idea开发工具可以直接改 但是不治本 eclipse导入后又恢复了 eclipse无法改 二 直接使用maven版本管理标签
  • 大厂经典Docker面试题整理汇总

    1 什么是 Docker Docker是一个容器化平台 它以容器的形式将你的应用程序及所有的依赖项打包在一起 以确保你的应用程序在任何环境中无缝运行 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级 可移植的容器中 然后发布到
  • 海外社交平台(Facebook Twitter WhatsApp)的分享

    海外的社交平台没有像Mob一样的集成sdk 各有各的sdk 掉进几次坑里 在此记录一下 三个平台都可以同时分享图片 链接 文字 Facebook facebook分享的图片需是来自网络的图片url sdk注释 Set the URL of
  • 华为机试:蛇形矩阵#include<iostream>using namespace std;int main(){ int N; while(cin>>N) {

    一 题目 描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形 例如 当输入5时 应该输出的三角形为 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 请注意本题含有多组样例输入 输入描述 输入正整数N N不大
  • 【VS调试】1.0-本地代码附加到软件进程进行调试(VS2019)

    本地代码附加到软件进程进行调试 当运行的exe程序调用了某个dll 想要调试dll中的代码 则可按照以下两个步骤 将需要调试的代码项目附加到已运行的程序即可在代码项目中进行打断点等代码调试工作 调试 gt 附加到进程 2 选择本地代码 并搜
  • Cobalt Strike从入门到精通之用户驱动攻击包

    https www bilibili com video BV1P64y1f7e1 p 5 Cobalt Strike 用户驱动攻击包 Attack Packages HTML Application 首先打开Attack gt Packa
  • python王者归来—学习笔记(20)

    继续第十六章 正则表达式 一 正则表达式特殊字符 我们知道 d代表的是数字字符 也就是从0 9的阿拉伯数字 如果使用管道 的观念 d相当于是下列正则表达式 0 1 2 3 4 5 6 7 8 9 正则表达式的特殊字符说明如下 import
  • 十、Spring Boot 安全管理(3)

    本章概要 高级配置 10 3 高级配置 10 3 1 角色继承 10 2 节中定义了三种角色 但是这三种角色之间不具备任何关系 一般来说角色之间是有关系的 例如 ROLE admin 一般既具有 admin 权限 又具有 user 权限 那
  • bat脚本——提取多个文件夹到指定路径

    本文将使用windows下的批处理 bat 脚本实现文件复制的一些功能 核心内容在于创建bat脚本 dir和xcopy等命令的使用 xcopy和dir命令使用说明 windows系统下打开命令提示符 cmd 输入以下命令可以查看dir和xc
  • python把txt变成list,并且写入xslx文件

    需求 1 把txt文件的内容变成list 2 然后写入excel中 txt文件内容 IP txt 192 168 199 201 4C8G 200G 192 168 199 202 4C8G 200G 192 168 199 203 4C8
  • NOIP2020南开之役——退役之战

    文章目录 一 关于过程 1 考前准备 2 考时过程 2 考后搞心态 二 我的感想 谢谢 一 关于过程 1 考前准备 我认为 在这一方面 我已经尽力了 考前一周我是天天中午去机房刷题 总结 没有半点划水 并且每天晚自习我拼了命地做作业 总是第
  • pacemaker命令小记

    pacemaker一些命令及解释 crm help crm configure show 查看配置 crm mon version 查看版本 crm configure primitive ClusterIP ocf heartbeat I
  • client-go基础用法之增删改查deployment

    文章目录 1 创建clientSet 2 获取pod信息 3 获取deployment信息 4 更新deployment副本数量 5 更新deployment镜像 6 删除deployment 7 创建deployment和service