当前位置: 首页 > news >正文

[k8s源码]2.CURD deployment

加载kubernetes配置

使用 clientcmd方法,是通过"k8s.io/client-go/tools/clientcmd"包加载的。这个函数返回的是config和error两个值。可以看到返回的config是一个指针变量。

func clientcmd.BuildConfigFromFlags(masterUrl string, kubeconfigPath string) (*rest.Config, error)

config,err := clientcmd.BuildConfigFromFlags("", "C:/Users/gx/.kube/config")
if err != nil {panic(err.Error())}
创建kubernetes客户端

func kubernetes.NewForConfig(c *rest.Config) (*kubernetes.Clientset, error)

这里的err被重新赋值,而传入的config是一个指针变量。

deployment 是一个appsv1变量,因此使用appsv1 方法来获取用于与 Kubernetes AppsV1 API 交互的客户端。这样可以轻松地对 Kubernetes 中的 Apps 资源(如 Deployment、StatefulSet 等)进行操作。

clientset, err := clientset.NewForConfig(config) 
if err != nil {panic(err.Error())
}
deploymentClientset := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
编写要创建的deployment 

指针允许不同的结构体实例共享相同的数据。在Kubernetes中,多个Pod可能需要共享相同的标签选择器配置。通过指针可以实现这一点。所以这里的deployment和LabelSelector是指针。这里的container和port是切片类型的数据。

deployment := &appsv1.Deployment{ObjectMeta: metav1.ObjectMeta{Name: "demo-deployment",},Spec: appsv1:DeploymentSpec{Replicas: 3,Selector: &metav1.LabelSelector{MatchLabels: map[string]string{"app": "demo",}},},Template: apiv1.PodTemplateSpec{ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{"app":"demo",}},},spec: apiv1.PodSpec{Containers:[]apiv1.Container{{Name: "web",Image: "nginx:1.12",Ports: []apiv1.ContainerPort{{Name: "http",Protocol: apiv1.ProtocolTCP,ContainerPort: 80,}},},},},},},
}

另一种编写方式,更加简洁,但是可能存在安全性和规范性的问题

deployment := &unstructured.Unstructured{Object: map[string]interface{}{"apiVersion": "apps/v1","kind":       "Deployment","metadata": map[string]interface{}{"name": "demo-deployment",},"spec": map[string]interface{}{"replicas": 2,"selector": map[string]interface{}{"matchLabels": map[string]interface{}{"app": "demo",},},"template": map[string]interface{}{"metadata": map[string]interface{}{"labels": map[string]interface{}{"app": "demo",},},"spec": map[string]interface{}{"containers": []map[string]interface{}{{"name":  "web","image": "nginx:1.12","ports": []map[string]interface{}{{"name":          "http","protocol":      "TCP","containerPort": 80,},},},},},},},},
}
 创建deployment

func (v1.DeploymentInterface) Create(ctx context.Context, deployment *appsv1.Deployment, opts metav1.CreateOptions) (*appsv1.Deployment, error)

在 Go 语言中,context.TODO() 是 context 包中的一个函数调用,它返回一个空的 Context 对象。Context 在 Go 中用于控制并发时的取消操作、超时控制、截止时间等,可以有效地管理并传递请求范围的值。context.TODO() 表示一个“空”的 Context,通常用作临时占位符或者当你尚未确定使用哪种具体的 Context 类型时的默认选择。

metav1.CreateOptions{} 是用于在创建资源时传递额外选项的结构体。可以通过metav1.CreateOptions{} 提供一些创建过程中需要的配置信息,例如:

  1. DryRun: 设置为 true 可以模拟创建操作,而不会实际创建资源。
  2. FieldManager: 设置创建资源的管理者的名称,用于标识谁在进行这次创建操作。
  3. Labels: 设置资源的标签,用于对资源进行分类和组织。
  4. PropagationPolicy: 设置删除资源时的传播策略,影响关联资源的删除行为。
createOptions := metav1.CreateOptions{DryRun:       []string{"All"}, // 模拟创建,不实际创建资源FieldManager: "my-controller", // 设置创建资源的管理者Labels: map[string]string{"app": "demo",},// 可以根据需要添加其他选项
}deploymentsClient.Create(context.TODO(), deployment, createOptions)

具体在我们的代码里面,用以下命令创建deployment

result, err := deploymentsClient.Create(context.TODO(), deployment, metav1.CreateOptions{})if err != nil {panic(err)}fmt.Printf("Created deployment %q.\n", result.GetObjectMeta().GetName())
更新deployment

retry.RetryOnConflict 函数是一个用于处理在更新资源时可能遇到的冲突的函数。在更新资源时,可能会因为多个并发请求同时修改资源而产生冲突。RetryOnConflict 函数会帮助你处理这种情况,使用指数退避策略(exponential backoff)来避免频繁地向 API 服务器发送请求,从而减少对 API 服务器的负载和提高更新成功的几率。

func retry.RetryOnConflict(backoff wait.Backoff, fn func() error) error

func (v1.DeploymentInterface) Update(ctx context.Context, deployment *appsv1.Deployment, opts metav1.UpdateOptions) (*appsv1.Deployment, error)

retry这个函数来源于包:"k8s.io/client-go/util/retry"

retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {// Retrieve the latest version of Deployment before attempting update// RetryOnConflict uses exponential backoff to avoid exhausting the apiserverresult, getErr := deploymentsClient.Get(context.TODO(), "demo-deployment", metav1.GetOptions{})if getErr != nil {panic(fmt.Errorf("Failed to get latest version of Deployment: %v", getErr))}result.Spec.Replicas = int32Ptr(1)                           // reduce replica countresult.Spec.Template.Spec.Containers[0].Image = "nginx:1.13" // change nginx version_, updateErr := deploymentsClient.Update(context.TODO(), result, metav1.UpdateOptions{})return updateErr})if retryErr != nil {panic(fmt.Errorf("Update failed: %v", retryErr))}fmt.Println("Updated deployment...")
 列举deployments
fmt.Printf("Listing deployments in namespace %q:\n", apiv1.NamespaceDefault)list, err := deploymentsClient.List(context.TODO(), metav1.ListOptions{})if err != nil {panic(err)}for _, d := range list.Items {fmt.Printf(" * %s (%d replicas)\n", d.Name, *d.Spec.Replicas)}
删除deployment
deletePolicy := metav1.DeletePropagationForegroundif err := deploymentsClient.Delete(context.TODO(), "demo-deployment", metav1.DeleteOptions{PropagationPolicy: &deletePolicy,}); err != nil {panic(err)}fmt.Println("Deleted deployment.")
}

相关文章:

[k8s源码]2.CURD deployment

加载kubernetes配置 使用 clientcmd方法,是通过"k8s.io/client-go/tools/clientcmd"包加载的。这个函数返回的是config和error两个值。可以看到返回的config是一个指针变量。 func clientcmd.BuildConfigFromFlags(masterUrl string, kubeconfigPath str…...

使用base64通用文件上传

编写一个上传文件的组件 tuku,点击图片上传后使用FileReader异步读取文件的内容&#xff0c;读取完成后获得文件名和base64码&#xff0c;调用后端uploadApi,传入姓名和base64文件信息&#xff0c;后端存入nginx中&#xff0c;用于访问 tuku.ts组件代码&#xff1a; <templa…...

Python深度学习

python深度学习&#xff0c;python代码定制&#xff0c; 可做创新点 创新思路 代码改进跑通 深度学习 Python代跑时间序列预测 分析 代码编写 python编程 深度学习算法 自然语言处理 神经网络跑通指导 爬虫调试代做 项目指导 定制帮做 改进 提升 创新 优化 Python Matlab C…...

django报错(三):No crontab program或got an unexpected keyword argument ‘user’

Crontab是linux系统上的定时管理模块&#xff0c;简单配置&#xff0c;灵活使用。但是要在windows使用必须借助Cygwin等虚拟工具&#xff0c;否则会报错“No crontab program”。如下图&#xff1a; python-crontab是其提供了python模块对crontab的访问&#xff0c;即可以通过p…...

数据库(创建数据库和表)

目录 一&#xff1a;创建数据库 二&#xff1a;创建表 2.1&#xff1a;创建employees表 2.2&#xff1a;创建orders表 2.3&#xff1a;创建invoices表 一&#xff1a;创建数据库 mysql> create database mydb6_product; Query OK, 1 row affected (0.01 sec) mysql&g…...

Log4j的原理及应用详解(一)

本系列文章简介&#xff1a; 在软件开发的广阔领域中&#xff0c;日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程&#xff0c;还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂&#xff0c;对日志管理的需求也日…...

ubuntu系统Docker常用命令

1.查看docker是否开机启动 sudo systemctl list-unit-files | grep enable|grep docker 2.设置开机启动 sudo systemctl enable docker 3.关闭docker开机启动 sudo systemctl disable docker 4.开启docker服务 sudo service docker start 5.关闭docker服务 sudo servi…...

韦东山嵌入式linux系列-驱动设计的思想(面向对象/分层/分离)

1 面向对象 字符设备驱动程序抽象出一个 file_operations 结构体&#xff1b; 我们写的程序针对硬件部分抽象出 led_operations 结构体。 2 分层 上下分层&#xff0c;比如我们前面写的 LED 驱动程序就分为 2 层&#xff1a; ① 上层实现硬件无关的操作&#xff0c;比如注册…...

0/1背包

0/1背包 背包问题是DP最经典的类型之一&#xff0c;而0/1背包是最经典最基础的背包问题。 背包体积为 V V V&#xff0c; n n n种物品&#xff0c;每种物品只有1个&#xff0c;第 i i i种物品对应体积为 c i c_i ci​&#xff0c;价值为 w i w_i wi​&#xff0c;怎样装填能使…...

Linux的进程和权限的基本命令

目录 基本命令 man find date cal du ln exit grep 基本命令-帮助查询&#xff1a; wc cat more less head tail echo alias unalias 基本命令-进程管理&#xff1a; ps kill top 操作系统负载查看 用户分类&#xff1a; 程序用户 普通用户&#x…...

鼠标录制工具怎么挑选?9款电脑鼠标录制工具分享(2024)

你知道鼠标录制工具吗&#xff1f;鼠标录制工具通过记录和回放用户的操作&#xff0c;帮助自动化重复性任务&#xff0c;提高工作效率和精确性。它可以帮助用户简化很多繁琐的操作步骤&#xff0c;非常适合运用在电脑自动化任务、游戏自动化中&#xff0c;给大家整理了2024年9款…...

C1W4.LAB.Vector manipulation+Hash functions and multiplanes

理论课&#xff1a;C1W4.Machine Translation and Document Search 文章目录 Python 中的矢量操作Transforming vectorsExample 1Example 2 Frobenius Norm Hash functions and multiplanesBasic Hash tablesPlanesHash Function with multiple planesRandom PlanesDocument v…...

YOLOv8改进 | 检测头 | 融合渐进特征金字塔的检测头【AFPN4】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…...

数据采集监控平台:挖掘数据价值 高效高速生产!

在当今数字化的时代&#xff0c;数据已成为企业非常宝贵的资产之一。然而&#xff0c;要充分发挥数据的潜力&#xff0c;离不开一个强大的数据采集监控平台&#xff0c;尤其是生产制造行业。它不仅是数据的收集者&#xff0c;更是洞察生产的智慧之眼&#xff0c;高效高速处理产…...

【算法笔记自学】第 9 章 提高篇(3)——数据结构专题(2)

9.1树与二叉树 #include <cstdio>int main() {int n, m;scanf("%d%d", &n, &m);printf(n m 1 ? "Yes" : "No");return 0; } 9.2二叉树的遍历 #include <cstdio> #include <vector> using namespace std;const int…...

Objective-C 中字符串的保存位置

在 Objective-C 中&#xff0c;字符串常量和动态创建的字符串&#xff08;例如通过 stringWithFormat:、initWithString: 等方法创建的字符串&#xff09;在内存中保存的位置一样么 &#xff1f; 在 Objective-C 中&#xff0c;字符串常量和动态创建的字符串在内存中的保存位置…...

git 想要创建一个新的本地分支并检出远程分支的内容

如果你想要创建一个新的本地分支并检出远程分支的内容&#xff1a; git checkout -b feature-branch origin/feature-branch feature-branch 是你在本地创建的新分支名&#xff0c;origin/feature-branch 是远程分支的引用。 根据你检出的远程分支的名字而定 不知道名称的时…...

C语言学习笔记[24]:循环语句while②

getchar()的使用场景 int main() {char password[20] {0};printf("请输入密码&#xff1a;");//输入 123456 后回车scanf("%s", passwoed);//数组名本身就是数组地址printf("请确认密码&#xff1a;Y/N");int ch getchar();if(Y ch)printf(&…...

安全运营概述

安全运营概述 概述安全运营的工作对内安全运营工作对外安全运营工作品牌建设 概述 安全是一个过程&#xff0c;安全是靠运营出来的&#xff0c;公司会不断的有新业务的变更&#xff0c;新产品的发布&#xff0c;新版本的升级&#xff0c;技术架构的升级&#xff0c;底层系统的…...

spring-cloud和spring-cloud-alibaba的关系

首先Spring Cloud 是什么&#xff1f; Spring Cloud是一系列框架的有序集合&#xff0c;它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发。Spring Cloud提供了微服务架构开发所需的多种组件和工具&#xff0c;如服务发现注册、配置中心、消息总线、负载均…...

3步实现HTML到Word的智能转换:html-to-docx技术深度解析

3步实现HTML到Word的智能转换&#xff1a;html-to-docx技术深度解析 【免费下载链接】html-to-docx HTML to DOCX converter 项目地址: https://gitcode.com/gh_mirrors/ht/html-to-docx 你是否曾遇到过这样的场景&#xff1f;精心设计的网页报告需要转换为Word文档进行…...

从Markdown到可执行规范:Tessl Framework初探与“规范即源代码”的实践思考

从Markdown到可执行规范&#xff1a;Tessl Framework初探与“规范即源代码”的实践思考 当代码行数不再是衡量开发效率的唯一标准&#xff0c;一种全新的编程范式正在悄然兴起。想象一下&#xff0c;开发者不再需要直接编写实现细节&#xff0c;而是专注于用结构化的自然语言描…...

UI设计入门指南——Figma新手必备操作全解析

1. Figma入门&#xff1a;从零到第一个设计稿 第一次打开Figma时&#xff0c;很多人会被满屏的英文界面和复杂工具栏吓到。其实我刚接触时也一样&#xff0c;但现在回头看&#xff0c;掌握基础操作只需要30分钟。Figma作为目前最流行的UI设计工具&#xff0c;最大的优势就是零门…...

FDTD_进阶指南:2D/3D材料建模与材料库深度解析

1. FDTD仿真中的材料建模基础 第一次接触FDTD仿真时&#xff0c;我被材料建模这个环节卡住了整整一周。当时想模拟一个简单的硅基光子晶体&#xff0c;结果连介电常数设置都搞不明白。后来才发现&#xff0c;材料建模是FDTD仿真的基石&#xff0c;就像盖房子要先打好地基一样。…...

WinForm项目中的并发控制

引言 在编写WinForm应用程序时,处理并发问题是一个常见的挑战,尤其是在涉及数据库操作的场景中。本文将讨论如何在C#的WinForm项目中,通过SQL数据库的操作来避免并发问题,并介绍一种使用原子操作的解决方案。 问题描述 假设有一个WinForm项目,其中包含一个功能模块,需…...

Wireshark抓包实战:用一道CTF题彻底搞懂IP分片与UDP重组

Wireshark抓包实战&#xff1a;用一道CTF题彻底搞懂IP分片与UDP重组 在网络安全竞赛中&#xff0c;一个看似简单的UDP传输任务可能隐藏着协议层面的精妙设计。去年CyBRICS赛事中的lx100题目就完美诠释了这一点——参赛者需要从相机传输的UDP流量中提取图片&#xff0c;而真正的…...

FASTDDS-Python 实战:从零构建分布式通信环境

1. 为什么选择Fast DDS-Python&#xff1f; 在物联网和机器人系统中&#xff0c;设备间的实时通信是个硬需求。想象一下&#xff0c;你正在开发一个智能仓储机器人系统&#xff0c;需要让多台机器人在复杂环境中协同工作。这时候&#xff0c;传统的HTTP请求-响应模式就显得力不…...

从零到一:NS2网络模拟器实战部署与场景构建指南

1. NS2网络模拟器入门指南 第一次接触NS2的朋友可能会被这个老牌网络模拟器的配置过程吓到。我刚开始用的时候&#xff0c;光是解决依赖问题就折腾了两天。不过别担心&#xff0c;跟着我的步骤走&#xff0c;你可以在半小时内完成基础环境搭建。 NS2本质上是一个离散事件网络模…...

告别手动爆肝:用AiScan-N自动化你的CTF Web漏洞测试(SQL注入/文件上传实战)

智能渗透测试革命&#xff1a;AiScan-N在CTF中的实战应用与效率跃升 当凌晨三点的CTF比赛进入白热化阶段&#xff0c;你的眼皮开始打架&#xff0c;而对手却像永动机般不断提交flag——这种场景下&#xff0c;传统手动渗透测试的局限性暴露无遗。我曾亲眼见证一位资深红队成员…...

03 MongoDB文档的各种增加、更新、删除操作总结

更多内容请见: 《深入掌握MongoDB数据库》 - 专栏介绍和目录 一. 插入文档 注意: 在 MongoDB 中,直接插入内容会自动创建集合! 1.1 使用insert()方法 语法格式: db.COLLECTION_NAME.insert(document) 说明: 若插入的数据主键已经存在,则会抛 org.springframework.dao.Du…...