自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 02-operator 二次开发背景

通用型 controller: 这种场景和 kubernetes 内置的类似,主要解决特定通用类型应用的管理Operator: 该场景用于解决一个特定应用的自动化管理通用型 controller 往往是 kubernetes 平台侧用户,如各大云厂商和 kubernetes 服务提供商,Operator 则是各种软件服务提供商, 他们设计时面向单一应用,很多开源的应用的 operator 可以在 operator hub 中获取。

2024-07-27 15:22:14 325

原创 01-controller-runtime

Operator 是 Kubernetes 用来拓展其 API 的一种开发范式(Pattern),其核心是定义若干的自定义资源及其对应的资源控制器,当这些资源发生变化时其对应的控制器对变化进行调解(Reconcile),最终使得实际状态与预期状态达成一致。K8s-sigs 推出的是一个用于构建 Operator 应用的框架,和一样都依赖了,提供了高级 API 和抽象,让开发者更直观地编写操作逻辑,并提供用于快速启动新项目的脚手架和代码生成工具。

2024-07-27 15:21:21 398

原创 02- 当你运行 kubectl create deployment 命令时发生了什么

几秒后,你将看到三个 Nginx Pod 分布在集群工作节点上。这相当神奇,但它背后究竟发生了什么?几秒后,你将看到三个 Nginx Pod 分布在集群工作节点上。这相当神奇,但它背后究竟发生了什么?Kubernetes 是一个神奇的框架,它通过用户友好(user-friendly)的 API 处理跨基础架构的 Workload 部署。通过简单的抽象隐藏了背后的复杂性。但是,为了充分理解它为我们提供的价值,我们需要理解它的原理。

2024-07-27 15:17:56 411

原创 01-调试开发k8s

虽然通过 Docker 构建可能更简单,但有时在本地电脑工作进行开发更好。下面的详细信息概述了在 Linux、Windows 和 macOS 上构建的硬件和软件要求。学习 k8s 源码的第一步就是在本机搭建开发环境,下面我会教大家如何搭建,我的本机为 mac 电脑 m1 芯片, 参考链接如下。官方 release 是使用 Docker 容器构建的。请注意,所有脚本都必须从 Kubernetes 根目录运行。执行完毕后你在项目下 _output 目录下能够看到编译好的二进制。

2024-07-27 15:16:50 373

原创 4.12 statefulset controller分析

statefulset是Kubernetes提供的管理有状态应用的对象,而deployment用于管理无状态应用。有状态的pod与无状态的pod不一样的是,有状态的pod有时候需要通过其主机名来定位,而无状态的不需要,因为无状态的pod每个都是一样的,随机选一个就行,但对于有状态的来说,每一个pod都不一样,通常希望操作的是特定的某一个。statefulset适用于需要以下特点的应用:(1)稳定的网络标志(主机名):Pod重新调度后其PodName和HostName不变;

2024-07-27 15:12:32 323

原创 4.11 endpointSlice controller

总的来说,跟其他的控制器的逻辑是差不多的,都是先监听相关资源的事件,然后调谐。从上面的代码我们也不难看出,endpointslice 有个特点就是,默认情况下,每个 slice 都是满 100 个条目就 new 一个新的切片,把每个切片的容量都控制在 100 个条目以内。我们看完 endpointslice ,该控制器具有新增,更新和删除 slices 的功能,但是我们还发现源码里头还有 endpointslicemirroring 控制器。

2024-07-27 15:11:14 333

原创 4.10 endpoint controller

EndpointSubset 是一组具有公共端口集的地址,扩展的端点集是 Addresses (Pod IP 地址) 和 Ports (Service 名称和端口号) 的笛卡尔积。控制器对象的初始化工作,并返回一个实例化对象,控制器对象同时订阅了 Service, Pod, EndPoint 三种资源的变更事件。控制器操作的核心方法,通过方法的命名,可以知道 EndPoint 主要关注的对象是 Service。控制器对象,该对象是实现 Endpoints 功能的核心对象。对象,然后进行对应的操作。

2024-07-27 15:09:10 338

原创 4.9 Kubernetes Service

Service 被抽象为一组或多组 Pod 的静态 IP 地址 (也可以将 Service 看作是一个代理),任何到达 Service 的请求都会被转发到属于该服务背后的某个 Pod 中的应用。与 Service 紧密关联的两个概念是 Pod 和 EndPoint, 其中,Pod 是 Kubernetes 中应用运行的最小单位,而 EndPoint 是 Service 指向的实际地址,定义了 Service 所指向的具体 Pod 的 IP 地址和端口。

2024-07-27 15:08:07 240

原创 4.8 replicaset controller 03

expectations记录了replicaset对象在某一次调谐中期望创建/删除的pod数量,pod创建/删除完成后,该期望数会相应的减少,当期望创建/删除的pod数量小于等于0时,说明上一次调谐中期望创建/删除的pod数量已经达到,调用方法返回true。根据前面的分析,在replicaset controller对replicaset对象进行调谐操作时,首先会调用方法,返回true且replicaset对象的deletetimestamp为空,才会调用。

2024-07-26 14:38:10 922

原创 4.7 replicaset controller 02

想系统学习k8s源码,云原生的可以加:mkjnnmreplicaset controller分析分为3大块进行,分别是:(1)replicaset controller初始化和启动分析;(2)replicaset controller核心处理逻辑分析;(3)replicaset controller expectations机制分析。本篇进行replicaset controller核心处理逻辑分析。

2024-07-26 14:34:55 1739

原创 4.6 replicaset controller

replicaset controller是kube-controller-manager组件中众多控制器中的一个,是 replicaset 资源对象的控制器,其通过对replicaset、pod 2种资源的监听,当这2种资源发生变化时会触发 replicaset controller 对相应的replicaset对象进行调谐操作,从而完成replicaset期望副本数的调谐,当实际pod的数量未达到预期时创建pod,当实际pod的数量超过预期时删除pod。

2024-07-26 14:32:17 808

原创 4.5 deployment controller 03

想系统学习k8s源码,云原生的可以加:mkjnnm下面来分析一下dc.sync方法,以下两种情况下,都会调用dc.sync,然后直接return:(1)判断deployment的属性值是否为true,是则调用dc.sync做处理,调用完成后直接return;(2)先调用,检查deployment对象是否处于scaling状态,是则调用dc.sync做处理,调用完成后直接return。deployment的为true时代表该deployment处于暂停状态,false则代表处于正常状态。

2024-07-26 14:30:16 764

原创 4.4 deployment controller 02

对集群中与deployment对象相同命名空间下的所有replicaset对象做处理,若发现匹配但没有关联 deployment 的 replicaset 则通过设置 ownerReferences 字段与 deployment 关联,已关联但不匹配的则删除对应的 ownerReferences,最后获取返回集群中与 Deployment 关联匹配的 ReplicaSet对象列表;,根据deployment 所属的 replicaset 对象,重新计算出 deployment 对象的。

2024-07-26 14:20:48 923

原创 4.3 deployment controller 01

想系统学习k8s源码,云原生的可以加:mkjnnmDeployment Controller 是 Kube-Controller-Manager 中最常用的 Controller 之一管理 Deployment 资源。而 Deployment 的本质就是通过管理 ReplicaSet 和 Pod 在 Kubernetes 集群中部署Workload。

2024-07-26 14:18:37 722

原创 4.2 controller-manager 代码

想系统学习k8s源码,云原生的可以加:mkjnnm。

2024-07-25 16:39:34 389

原创 4.1 controller-manager 介绍

想系统学习k8s源码,云原生的可以加:mkjnnm。

2024-07-25 16:38:04 369

原创 08-sharedProcessor

想系统学习k8s源码,云原生的可以加:mkjnnm。

2024-07-25 16:31:21 477

原创 07-workqueue

排队指数算法将相同元素的排队数作为指数,排队数增大,速率限制呈指数级增长,但其最大值不会超过maxDelay。

2024-07-25 16:28:07 805

原创 05-Indexer

想系统学习k8s源码,云原生的可以加:mkjnnmIndexer 是一个索引缓存,用于缓存 Reflector 从 Kube-apiserver List/Watch到的资源对象,可以理解是一个带索引查询的内存型存储。下面通过走读源码的形式来了解 Indexer 的原理,本篇基于 k8s.io/client-go v0.30.0 源码讲解。

2024-07-25 16:25:57 516

原创 04-Reflector

/ name 标识这个反射器的名称,默认为 文件:行数(比如reflector.go:125)= "" && RV!

2024-07-25 16:22:38 839

原创 03-写一个控制器

想系统学习k8s源码,云原生的可以加:mkjnnminformer 设计之初是为了更好的写 controller,本章我们来手写一个 controller,下图是官方推荐的编程模式:2.给控制器添加Run方法启动控制器前要先启动 informer 并等待同步完成,然后起携程调用 runworker 方法。3.实现 runworker方法在 runWorker 方法中,我们一直调用 processNextItem 方法,这个方法会从 queue 中取出资源的 key,调用 syncToStdout 处

2024-07-25 16:14:20 369

原创 02-Informer

想系统学习k8s源码,云原生的可以加:mkjnnm。

2024-07-25 16:06:00 649

原创 06-DeltaFIFO

想系统学习k8s源码,云原生的可以加:mkjnnmDeltaFIFO本质上是一个先进先出的队列,有数据的生产者和消费者,其中生产者是Reflector调用的Add方法,消费者是Controller调用的Pop方法。从 DeltaFIFO 数据结构来看,里头存储着 map[obj key]Deltas 和 object queue。Delta 装有对象数据及对象的变化类型。其中 DeltaType 就是资源变化的类型, 比如 Add、Update 等;

2024-07-25 14:21:04 599

原创 01-client-go

v1.x.y0ps: k8s 发布v1.30.0 版本时,client-go 会同步发布两个版本 v0.30.0 (推荐使用)和 kubernetes-1.30.0。

2024-07-25 14:10:52 1864

原创 replicaset controller 源码分析一

replicaset controller是kube-controller-manager组件中众多控制器中的一个,是 replicaset 资源对象的控制器,其通过对replicaset、pod 2种资源的监听,当这2种资源发生变化时会触发 replicaset controller 对相应的replicaset对象进行调谐操作,从而完成replicaset期望副本数的调谐,当实际pod的数量未达到预期时创建pod,当实际pod的数量超过预期时删除pod。

2024-07-17 18:55:53 1780 1

原创 chrome 插件开发-01

现在,当单击扩展的操作图标(工具栏图标)时,扩展会显示一个弹出窗口。键,用于声明 Chrome 应用作扩展程序操作图标的图片,以及单击扩展程序的操作图标时要在弹出窗口中显示的 HTML 页面。您将创建一个“Hello World”示例,在本地加载扩展,查找日志,并浏览其他建议。或者,点击 Chrome 菜单,将鼠标悬停在“更多工具”上,然后选择“扩展程序”。当用户单击扩展工具栏图标时,此扩展将显示“Hello Extensions”。或者,单击“扩展”菜单拼图按钮,然后选择菜单底部的“管理扩展”。

2023-12-11 16:59:38 70

原创 使用github action 构建镜像并上传到github registry

对于专用容器镜像,我仍将使用 Azure 容器注册表,但出于示例目的,对镜像进行身份验证并将其推送到 GHCR 似乎是可行的方法。在 GitHub 中,我们可以在 GitHub Actions 工作流文件中构建 docker 镜像并将其推送到 GHCR,并私下或公开提供这些镜像(我将公开我的镜像作为我的示例)。在这篇文章中,我们讨论了 GHCR 是什么,我们如何使用 GitHub Actions 对图像进行身份验证并将图像推送到它,然后公开这些图像。现在,默认情况下,当我们发布包时,可见性将是私有的。

2023-12-09 11:17:32 345

原创 了解github actions

每个作业都将在其自己的虚拟机运行程序或容器内运行,并具有一个或多个步骤,这些步骤可以运行您定义的脚本或运行操作,该操作是可重复使用的扩展,可以简化工作流。例如,您可以使用一个工作流来生成和测试拉取请求,另一个工作流用于在每次创建发布时部署应用程序,以及另一个工作流,用于在每次有人打开新问题时添加标签。工作流由签入存储库的 YAML 文件定义,并在存储库中的事件触发时运行,也可以手动触发或按定义的计划触发。可选 - 从工作流生成的工作流运行的名称,该名称将显示在存储库的“操作”选项卡上的工作流运行列表中。

2023-12-09 10:44:21 80

原创 5分钟快速入门github action

每次将代码推送到分支时,都会触发您刚刚添加的示例工作流程,并向您展示 GitHub Actions 如何处理仓库的内容。每次将代码推送到分支时,都会触发您刚刚添加的示例工作流程,并向您展示 GitHub Actions 如何处理仓库的内容。从工作流运行列表中,单击要查看的运行的名称,在本例中为“USERNAME 正在测试 GitHub Actions”。从工作流运行列表中,单击要查看的运行的名称,在本例中为“USERNAME 正在测试 GitHub Actions”。

2023-12-09 10:10:47 223

原创 k8s调度器

当 Pod 是已经运行的时候,也不会被删除(evicted)。存在危险的用户 Pod (比如fork bomb),在调度到某个 node 上以后,会因为打开文件句柄过多导致 node 宕机,Pod 会被 evict 到其他节点,再对其他节点造成伤害,依次循环会导致整个 cluster 所有节点不可用。Kubernetes 调度 Pod 时,会判断当前节点正在运行的 Pod 的 CPU Request 的总和,再加上当前调度Pod 的 CPU request,计算其是否超过节点的 CPU 的可分配资源。

2023-12-08 20:17:21 310

原创 发布你自己的 terraform provider

terraform registry 会验证你的仓库是否名称符合 terraform-provider-xx , 会验证 release 页面有发布过制品,符合条件后会在你的github上创建一个 webhooks,当你发布更新后,会通知 terraform 同时更新。重要提示:为了能够被 Terraform 注册表检测到,GitHub 上的所有提供程序存储库都必须匹配模式 terraform-provider-{NAME} ,并且存储库必须是公共的。生成签名版本时使用的 GPG 密钥。

2023-12-08 15:46:48 78

原创 用Golang释放你的编程技能:入门指南

欢迎来到本篇文章的第二部分,我们将介绍Golang(Go语言)的基本概念和特点。Golang是一种开源的静态类型编程语言,由Google设计和开发。它具有简洁、高效、可靠的特点,适用于构建各种类型的应用程序。与其他编程语言相比,Golang具有许多独特的特性。首先,它具有强大的并发编程能力,可以充分利用多核处理器的优势,并实现高效的并发执行。其次,Golang拥有简单直观的语法,易于学习和使用。它提供了丰富的标准库和工具,使开发人员能够快速构建高质量的软件。

2023-12-07 21:58:45 169

原创 对开源商业化的思考

我找了另外一个很高 star 数的项目,同样也是一个月的区间,没有 Pull Request 的合并,只解决了一个 issue,基本是休眠状态了。如果选择了休眠的项目,那么在遇到问题的时候,你只有靠自己来解决,无法从社区得到有效的支持,这显然不是我们想要的。我以实习生的身份加入 OpenIM,在短短的六个月,负责过 OpenIM 社区的运营,开发,测试,运维,自动化 等等工作,提了 上百个 PR ,也提了 上百个 issue。在全球化的今天,开源不仅是关于代码的分享,更是一种文化和思想的交流。

2023-12-07 14:03:34 64

原创 如何在 Git 中推送空提交?

然而,除非不需要太多,否则我们应该养成编写提交消息的习惯,因为它可以帮助其他团队成员理解提交的上下文以及该提交存在于历史中的原因。它用于创建存储库在特定时间点的状态快照,这可以帮助您跟踪和查看 Git 存储库的历史记录,直到进行特定提交时为止。为了将新的提交推送到远程存储库,始终需要在本地存储库中进行代码更改,但是 Git 不允许您在本地没有代码变更的情况下进行提交。空提交是没有任何更改的提交。通常,Git 不允许您进行没有消息的提交,并且要将新提交推送到远程存储库,您需要在本地对项目进行代码更改。

2023-12-06 15:24:11 395

原创 软件工程师+技术UP主,一个月翻倍的收入秘籍

在数字化时代,结合软件工程师和技术UP主的身份,我成功地实现了数字游民的生活方式,不仅在技术领域获得了认可,还通过写文章、在B站和抖音等平台分享视频,实现了收入翻倍工作自由的目标。不怕尝试新的领域,学会在竞争中寻找机会,在赚钱的过程中保持对生活的热情和享受。我在 知乎 上完善了个人资料,创建了专业的个人网站,展示了我的项目和技能。这不仅增加了我在软件工程领域的可见性,还为我后来的UP主生涯奠定了基础。通过在B站和其他视频平台上开设技术教学频道,我开始分享自己的编程经验、解决问题的方法以及对新技术的研究。

2023-12-05 15:43:07 44

原创 如何写好技术文章并变现

一年来,我的社区人数已达上千,结识了许多志同道合的小伙伴,共同成长,不仅提高了技术水平,还获得了升职加薪的美好机会,创作的收益也达到了几十万!写文章和做笔记不一样,做笔记是对知识的梳理归纳加上自己的理解,但是写文章是教导他人,通过广泛的阅读和大量的研究,才能获取全面、准确的信息,确保文章的内容是可靠和有说服力的。对于一些人来说,早上可能是头脑最清晰的时候,而对于其他人来说,晚上可能更适合。通过撰写技术文章,工程师对知识和经验进行整理和总结,这有助于加深他们对主题的理解,并可能揭示他们自己对问题的新见解。

2023-12-03 18:26:58 77

原创 构建go镜像

将 go.mod and go.sum 文件复制到您的项目目录中,由于您使用了 WORKDIR ,该目录是映像中的当前目录 /app ( ./ )。现在,您已经在要构建的 Docker 映像中拥有模块文件,也可以使用该命令在该命令中运行该 RUN 命令 go mod download。该命令将代码编译成一个二进制文件,该二进制文件被命名 docker-gs-ping 并位于您正在构建的映像的文件系统的根目录中。通常,一旦你下载了一个用 Go 编写的项目,你要做的第一件事就是安装编译它所需的模块。

2023-12-03 17:10:00 59

原创 上下文多阶段跨平台构建【docker构建进阶】

Docker Build 是 Docker Engine 最常用的功能之一。每当您创建镜像时,您都在使用 Docker Build。构建是软件开发生命周期的关键部分,允许您打包和捆绑代码并将其运送到任何地方。Docker Build 不仅仅是一个构建镜像的命令,也不仅仅是打包代码。它是一个完整的工具和功能生态系统,不仅支持常见的工作流任务,还为更复杂和高级的场景提供支持。

2023-12-03 14:27:42 94

原创 将 go 代码打包成 docker 镜像

在本教程中,你将生成一个容器映像。该映像包括运行应用程序所需的一切:编译的应用程序二进制文件、运行时、库以及应用程序所需的所有其他资源。

2023-12-01 16:52:02 300

原创 terraform provider 实战开发

上节课我们实现了如何读取数据,添加client,这节课我们来学习实现日志;在本教程中,您将在提供程序中实现日志消息,并从日志输出中筛选特殊值。然后,您将管理日志输出,以便在执行 Terraform 时查看这些日志语句。Add log messages. 添加日志消息。Add structured log fields.添加结构化日志字段。Add log filtering. 添加日志筛选。

2023-11-30 17:43:54 226

c++模板友元函数 友元类

关于c+模板之友元类友元函数的实例化,图形界面之矩形。

2015-04-11

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除