自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(159)
  • 收藏
  • 关注

原创 【k8s调度】梳理调度相关知识与device plugin

比如,PodFitsHost 算法(负责的是,检查 Pod 的 nodeSelector 与 Node 的名字是否匹配),这种情况下,除非 Node 的名字发生变化,否则你即使删除再多的 Pod,抢占者也不可能调度成功。具体来说,在为某一对 Pod 和 Node 执行 Predicates 算法的时候,如果待检查的 Node 是一个即将被抢占的节点,即:调度队列里有 nominatedNodeName 字段值是该 Node 名字的 Pod 存在(可以称之为:“潜在的抢占者”)。

2024-03-25 17:31:25 888

原创 【k8s网络】梳理cni发展脉络

设备非专业术语作用Docker0网桥理解为二层交换机,处理包头为 mac 的数据包网络栈存储用于通信的网络设备和规则等(网卡、路由表、iptables规则等)一个 net namespace 可以简单理解为,一个主机–net=host,表示容器共享宿主机的网络栈(此时可理解为两个人共用一套设备),此时可提高通信效率,但可能会端口冲突veth pair网线用于联通不同的 net namespace,可以理解为连接两个主机间的网线。

2024-03-25 17:28:33 1146

原创 【K8S内外部版本】一文了解 Kubernetes 资源内部版本internal与外部版本v1等及Schema注册

以Pod资源代码定义为例,代码示例如下。

2024-03-05 11:03:41 1090

原创 【K8S类型系统】一文梳理 K8S 各类型概念之间的关系(GVK/GVR/Object/Schema/RestMapper)

Group 组、Version版本、Namespace 命名空间,这些都很容易理解,都是为了隔离,资源版本隔离(Group、Version)和用户资源隔离(Namespace)Kind 对象类型,如 Kind=Sh 对应 sh 类型文件,Kind=Doc 对应 doc 类型文件Resource 可以理解为 Kind 的含义补充,用于获取真正的资源对象;GVK 专注于类型定义,确定是哪种资源对象,GVR 专注于获取资源对象或对资源对象进行操作;

2024-03-01 17:18:07 973 1

原创 【git使用】常用的 git 撤销操作(restore、reset、revert)

注意坑新增文件是未被跟踪状态(untracked),也就是下面命令不会对此文件生效所以新增文件,需要先被 git 记录到,也就是 git add new-file之后执行这些操作,就会生效了# 丢弃工作区的修改(不包括对文件自身的操作,如添加文件、删除文件)# 将暂存区的修改重新放回工作区(包括对文件自身的操作,如添加文件、删除文件)# 撤销最新的 commit,将其改动放回到 工作区git reset HEAD~ # 或 git reset --mixed HEAD~ 都是同一个意思。

2024-01-04 17:18:26 821 1

转载 【git使用】深度理解 git merge合并的使用场景

因此对于 merge commit,只需要记录究竟是保留了 A 的改动还是 B 的改动即可,因此大多数情况下我们 merge commit 都是没有变更的,只是个记录。首先,关于 commit,我们可以理解为,每个 commit 会保留一个 pointer 指向它的 parent commit,并且一般我们的 commit 只有一个 parent。例如上面的例子,A 改成了 123,B 改成了 456,因此存在冲突,解决冲突的时候改成了 789,因此 merge commit 有了改动。

2024-01-04 16:26:05 252

原创 【git使用】了解三种git commit合并的使用场景(rebase、merge、cherry-pick)

在 dev 上开发了一段时间后要把 master 分支提交的新内容更新到 dev 分支,此时切换到 dev 分支,使用 git rebase master,等 dev 分支开发完成了之后,要合并到上游分支 master 上的时候,切换到 master 分支,使用 git merge dev。rebase的过程实际就是以当git 前最新的master的版本,再"拉"出一条分支作为当前最新的分支上,原先该分支上的改动就变成现在分支上的新的commit 了。上面的命令可以转移从 A 到 B 的所有提交。

2024-01-04 16:25:06 1222 1

原创 【git使用】历史commit的分割(git rebase和 git reset的联合使用)

因为每一个commit只会保存它的parent节点,并不知道它的下一个节点时什么。比方说在一次 commit 中,包含了两个编辑过的文件(A 和 B);commit 01, commit 02, commit 03 为最近的三次提交,是提交时的备注信息。可以配合不同的模式(–mixed, --soft, --hard)达到不同的效果。后,会列出 commit-B 之后的所有 commit,之后 vim 形式操作。该命令主要用于修改历史 commit,如历史 commit 的拆分,合并等。

2024-01-04 16:23:16 1025

原创 【k8s源码分析-Apiserver-2】kube-apiserver 结构概览以及主体部分源码分析

假 设 所 有 的 认 证 器 都 被 启 用 , 当 客 户 端 发 送 请 求 到 kubeapiserver服务,该请求会进入Authentication Handler函数(处理认 证相关的Handler函数),在Authentication Handler函数中,会遍历已启用的认证器列表, 尝试执行每个认证器, 当有一个认证器返回 true时,则认证成功,否则继续尝试下一个认证器。当客户端发起一个请求,经过认证阶段时,只要有一个认证器通过,则认证成功。在客户端请求通过认证之后, 会来到授权阶段。

2023-12-25 17:01:01 1210

原创 【Kubernetes学习之连接集群】利用 kubeconfig 或 secret Token 连接 k8s 集群

serviceaccount的权限由集群中对应的rolebinding决定,官方文档:

2023-12-07 16:22:25 646

原创 【k8s源码分析-Apiserver-1】理解 apiserver 的结构(AggregatorServer、KubeAPIServer、ApiExtensionsServer)

Prometheus 项目与Kubernetes项目一样,也来自于 Google 的Borg体系,它的原型系统,叫作 BorgMon,是一个几乎与 Borg 同时诞生的内部监控系统。而 Prometheus 项目的发起原因也跟 Kubernetes 很类似,都是希望通过对用户更友好的方式,将 Google 内部系统的设计理念,传递给用户和开发者。作为一个监控系统,Prometheus 项目的作用和工作方式,其实可以用如下所示的一张官方示意图来解释。可以看到,Prometheus 项目工作的核心,是。

2023-12-06 16:11:43 169

原创 【Go学习之 go mod】gomod小白入门,在github上发布自己的项目(项目初始化、项目发布、项目版本升级等)

go mod init {项目名},不推荐随便命名项目名,这样不便于以后发布到 github,若本地使用的话可以随意命名项目名首先在 github 创建个 repo然后初始化go mod init {项目名}本地创建的项目不上传 github 的话,项目名随便指定若该项目需要上传 github,并需要后期 go get 下载的话,go mod init 一定要与 github 上存储仓库路径一致。

2023-11-19 11:28:09 1782

原创 【K8S device-plugin】以 vgpu 项目分析 device-plugin、Scheduler Extender Plugin、KubeSchedulerConfiguration 关系

注意此处,若没有 KubeSchedulerConfiguration 的声明配置,k8s 会认为这些(nvidia.com/gpumem、nvidia.com/gpucores)是资源设备,k8s 调度时候会进行寻找,发现所有节点上都没此资源设备配额(kubectl describe node nodeName 可以看到每个 node 的设备资源情况),导致该 pod 调度失败。首先创建个 device-plugin,注册 gpu 资源(nvidia.com/gpu)

2023-10-13 15:49:48 588

原创 【k8s 开发排错】k8s组件开发排错之pprof

组件,各种操作系统的安装方式见https://www.graphviz.org/download/#linux。UI分析工具使用起来相对比较麻烦,我们需要先导出文件,然后再使用。比如我们导出kube-scheduler的堆栈信息。然后就可以在浏览器上看到具体的堆栈信息图了。注意,这里需要在服务端安装。工具起服务进行分析。

2023-10-13 11:28:07 496

转载 【K8S源码之Scheduler—1SchedulingQueue三级调度队列】

从设计上三队列分别存储:活动队列、bakcoff队列、不可调度队列,其中backoff中会根据任务的失败来逐步递增重试时间(最长10s)、unschedulableQ队列则延迟60s通过后台定时任务分别将backoffQ队列、unschedulableQ队列来进行重试,加入到activeQ中,从而加快完成pod的失败重试调度。

2023-09-04 15:12:11 180

转载 【K8S源码之Scheduler—0概览】

scheduler extender是k8s对调度器的一种扩展机制,我们可以定义对应的extender,在对应资源的调度的时候,k8s会检查对应的资源,如果发现需要调用外部的extender,则将当前的调度数据发送给extender,然后汇总调度数据,决定最终的调度结果。当从apiserver感知到要调度的pod的时候,scheduler会根据pod的优先级,来讲其加入到内部的一个优先级队列中,后续调度的时候,会先获取优先级比较高的pod来进行优先满足调度。

2023-09-04 10:59:16 77

转载 【K8S源码之Pod漂移-转载】k8s驱逐篇(7)-kube-controller-manager驱逐-taintManager源码分析

的主要功能为:当某个node被打上NoExecute污点后,其上面的pod如果不能容忍该污点,则将会驱逐这些pod,而新建的pod也需要容忍该污点才能调度到该node上;通过kcm启动参数来确定是否启动true时启动(启动参数默认值为truekcm启动参数,默认值true,配合共同作用,两者均为true,才会开启污点驱逐;的主要功能为:当某个node被打上NoExecute污点后,其上面的pod如果不能容忍该污点,则将会驱逐这些pod,而新建的pod也需要容忍该污点才能调度到该node上;

2023-08-18 18:10:42 129

转载 【K8S源码之Pod漂移-转载】k8s驱逐篇(6)-kube-controller-manager驱逐-NodeLifecycleController源码分析

k8s v1.16版本中已经分为了与,本文主要介绍。主要功能有:(1)定期检查node的心跳上报,某个node间隔一定时间都没有心跳上报时,更新node的值为false或unknown,开启了污点驱逐的情况下,给该node添加NoExecute的污点;(2)当污点驱逐未开启时,当node的值为false或unknown且已经持续了一段时间(该时间可配置)时,对该node上的pod做驱逐(删除)操作;(3)当污点驱逐开启时,node上有NoExecute。

2023-08-18 18:08:49 292

转载 【K8S源码之Pod漂移-转载】k8s驱逐篇(5)-kube-controller-manager驱逐

kube-controller-manager驱逐主要依靠以及其中的;

2023-08-18 18:06:57 124

转载 【K8S源码之Pod漂移-转载】k8s 污点驱逐详解-源码分析

go复制代码// Controller is the controller that manages node's life cycle.// taintManager监听节点的Taint/Toleration变化,用于驱逐pod// 监听pod// 返回secondary-node-eviction-rate参数值。就是根据集群是否为大集群,如果是大集群,返回secondary-node-eviction-rate,否则返回0// 返回evictionLimiterQPS参数。

2023-08-18 18:04:44 186

原创 【K8S源码之Pod漂移】整体概况分析 controller-manager 中的 nodelifecycle controller(Pod的驱逐)

有的话,进行 Pod 的逐个驱逐,检查 Pod 是否有该 Taint 的 toleration,有的话,就根据 toleration 设置 pod 的定时删除;zonePodEvictor 后续用于该 zone 中失联的 Node,用于 Node 级别驱逐(就是驱逐 Node 上所有 Pod,并设置为 evicted 状态,此部分参见)每个 zone 有不同数量的 Node,根据该 zone 中 Node 失联数量的占比,设置不同的驱逐速率。TainManager 的驱逐逻辑,看代码不难理解,大概说明。

2023-08-18 18:02:00 1169

原创 【容器文件系统】了解容器 overlay 文件系统和 /var/lib/docker/overlay2下目录的作用

在讲 overlay2 之前,我们需要先简单了解下什么是 rootfs:rootfs 也叫根文件系统,是 Linux 使用的最基本的文件系统,是内核启动时挂载的第一个文件系统,提供了根目录,根文件系统包含了系统启动时所必须的目录和关键性文件,以及使其他文件系统得以挂载所必要的文件。在根目录下有根文件系统的各个目录,例如 /bin、/etc、/mnt 等,再将其他分区挂载到 /mnt,/mnt 目录下就有了这个分区的各个目录和文件。

2023-04-28 17:01:11 5572 2

原创 【K8S之调度器流程和扩展2】KubeSchedulerConfiguration配置与使用 —— 控制各个调度器扩展点

检查节点是否拥有 Pod 请求的所有资源。:检查 Pod 指定的节点名称与当前节点是否匹配。:调度 Pod 时,选择资源使用更为均衡的节点。:检查挂载到节点上的卷是否满足卷提供程序的限制。:检查节点是否有请求的卷,或是否可以绑定请求的。:检查 Pod 请求的端口在节点上是否可用。:检查节点是否满足 AWS EBS 卷限制。:检查该节点是否满足 GCP-PD 卷限制。:检查该节点是否满足 Azure 卷限制。:检查该节点是否满足 CSI 卷限制。:检查请求的卷是否在任何区域都满足。

2023-04-14 11:21:49 1282 2

原创 【Linux 命令】xargs 将输入转为命令参数(可用于变换参数多次执行同一命令)

xargs命令的作用,是将标准输入转为命令行参数。上面的代码将管道左侧的标准输入,转为命令行参数,传给第二个echo命令。xargs命令的格式如下。真正执行的命令,紧跟在xargs后面,接受xargs传来的参数。xargs的作用在于,大多数命令(比如rmmkdirls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。上面的代码等同于。如果不加xargs就会报错,提示mkdir缺少操作参数。

2023-03-20 16:48:02 1161

转载 【Linux命令-转载】nohup 和 & 绝配(让命令在后台执行)

nohup 的作用可以将程序以忽略挂起信号(SIGHUP)的方式运行。常见的用法是和 & 命令一同使用,将命令放置到后台运行,即使终端挂掉,进程会忽略挂起信号,继续运行。将程序放到后台运行,一般有两种方式:(1)command &:后台运行,关掉终端会停止运行。(2)nohup command & :后台运行,关掉终端也会继续运行。「注意:」(1)如果使用nohup执行程序未显示进行标准输出重定向,则标准输出默认重定向当前工作目录的 nohup.out 文件中。

2023-03-17 11:32:44 422

转载 【容器运行时-转载】从 Linux 进程的角度看 Docker

以上的所有内容,就是为 Docker 原理准备的基本内容。总结一下,有 Linux 进程的 fork、exec、task_struct 以及 namespace。下面,我们会来介绍 Linux 进程与 Docker 的关系。

2023-03-06 11:14:36 464

转载 【容器运行时-转载】k8s 1.20 后 containerd 的变化(containerd-shim父进程为1号进程)

这件事困扰了我很久,现在终于有时间来一探究竟了。Kubernetes 自从 1.20 版废除对 dockershim 的支持,改用作为默认的容器运行时。我们使用ps我们会发现了一个奇怪的现象,containerd 进程是由 PID 1 号进程 systemd 托管,所以 containerd 进程的父进程 ID(PPID)毫无疑问就是 1;

2023-03-06 11:10:55 541

转载 【容器运行时-转载】为什么需要 containerd

可以看出,在容器技术逐步标准化后,containerd 在相关的技术栈中将占据非常重要的地位,containerd 提供的核心服务很可能成为底层管理容器的标准。届时,更上层的容器化应用平台将直接使用 containerd 提供的基础服务。Containerd小尝containerd。

2023-03-06 11:08:33 410

转载 【容器运行时-转载】RunC 是什么?

RunC 作为标准化容器运行时的一个实现目前已经被 docker 内置为默认的容器运行时。相信随着 runC 自身的成熟和完善会有越来越多的大厂把 runC 作为默认的容器运行时。OCI和runc容器标准化和dockerOCI标准和runC原理解读。

2023-03-06 11:07:22 877

原创 【容器运行时】一文理解 OCI、runc、containerd、docker、shim进程、cri、kubelet 之间的关系

方法 https://github.com/containerd/containerd/blob/v1.4.3/runtime/v2/runc/v2/service.go#L174-L286。结合源码 https://github.com/containerd/containerd/blob/v1.4.3/runtime/v2/shim/shim.go#L221-L229。可以看出,containerd是containerd-shim的父进程,contaienrd-shim是容器进程的父进程。

2023-03-06 11:02:15 2794 2

原创 【 K8s 源码之调度学习】Pod 间亲和性和反亲和性的源码分析

问题 —— 为什么不梳理 【现存哪些 Pod】 喜欢【新 Pod】?这部分就是,将节点的得分进行累计计算,返回此符合条件的节点的得分数。这部分主要看 processExistingPod 函数。—— 因此才考虑这么详细。

2023-02-24 16:48:22 818 1

原创 【 K8S 调度系列】理解 Pod 间的亲和性与反亲和性

这里的 topologyKey 对应的是 Node 上的标签的 Key(没有Value),可以看出,其实 topologyKey 就是用于筛选 Node 的。这里指定“同一位置” 是通过 topologyKey 来定义的,topologyKey 对应的值是 node 上的一个标签名称,比如各别节点zone=A标签,各别节点有zone=B标签,pod affinity topologyKey定义为zone,那么调度pod的时候就会围绕着A拓扑,B拓扑来调度,而相同拓扑下的node就为“同一位置”。

2023-02-20 17:21:46 1471 2

原创 【容器基础之三大基石】Cgroups、Namespace、Rootfs 保障容器的隔离性、一致性和高性能

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

2023-02-07 17:51:33 1474

转载 【K8S 之调度器详解】调度器的config、预选、优选、批调度都是什么?

尽可能地将 workload 平均到不同的节点,减少单个节点宕机造成的损失可扩展性。随着集群规模的增加,怎么保证调度器不会成为性能的瓶颈高可用。调度器能做组成集群,任何一个调度器出现问题,不会影响整个集群的调度灵活性。不同的用户有不同的调度需求,一个优秀的调度器还要允许用户能配置不同的调度算法资源合理和高效利用。调度器应该尽可能地提高集群的资源利用率,防止资源的浪费一般来说,我们有4种扩展 Kubernetes 调度器的方法。

2023-02-03 15:39:44 889

原创 【K8S之调度器流程和扩展】如何给 scheduler 添加扩展插件、关闭默认插件、创建多个 scheduler?

如果我们要实现自己的插件,必须向调度框架注册插件并完成配置,另外还必须实现扩展点接口,对应的扩展点接口我们可以在源码。

2023-02-02 18:19:01 2783 10

原创 【授权与认证】Dex 与 LDAP、OIDC

为了检索的需要添加了 BIN(二进制数据)、CIS(忽略大小写)、CES(大小写敏感)、TEL(电话型)等语法(Syntax)。但目录一般只执行简单的更新(写)操作,不支持批量更新所需要的事务处理功能;可以把Dex当作一个轻量级的认证的代理入口(portal),应用APP只需要通过与Dex交互,由Dex负责与后端的上游认证服务器交互,从而屏蔽了后端认证服务器的协议差异。目录信息树可以类比我们的**「磁盘文件系统目录树」**,上面的定义是官方定义,理解起来,DIT 就是指像文件系统一样的目录结构树。

2023-01-30 18:06:33 1010

原创 【授权与认证】OAuth 2.0 和 OIDC 的异同点

OIDC 协议定义的名词和 OAuth 2.0 协议定义的稍微有些出入:OpenID Provider ,简称 OP :相当于 OAuth 2.0 中的授权服务器,除了负责颁发 Access Token ,还会颁发 ID Token。例如 IDaaS 就是一个 OP。Relying Party ,简称 RP :代指 OAuth 2.0 中的客户端。End User ,简称 EU :即用户。最后, OIDC 的授权流程与 OAuth 2.0 是一样的,

2023-01-30 17:58:02 2583 1

原创 【Docker rwm权限】docker 的创建设备文件权限 m(mknod)

我们的linux操作系统跟外部设备(如磁盘、光盘等)的通信都是通过设备文件进行的,应用程序可以打开、关闭、读写这些设备文件,从而对设备进行读写,这种操作就像读写普通的文件一样easy。默认的seccomp配置文件将根据所选的功能进行调整,以允许使用功能所允许的功能,所以从Docker1.12之后的版本,不应该对此进行调整。时,将允许Docker容器访问宿主机上的所有设备,并在AppArmor或SELinux中设置一些配置,使容器内的进程可以与容器外运行的进程几乎一样权限来访问宿主机。对功能进行细粒度控制。

2023-01-06 14:25:44 1645

原创 Go 易错点之协程(中间函数退出不会导致调用的 goroutine 退出)

【代码】Go 易错点之协程(中间函数退出不会导致调用的 goroutine 退出)

2023-01-05 18:18:43 222

原创 Go 易错点值 Sort 自定义属性排序

Golang之Sort包对于不同结构体,实现 Sort 包规定的几个方法,便可以按照自己想要的【属性】自行排序package main import("fmt" "sort") // sort.Sort 自定义排序 // 首先要自定义类型 // 之后要实现自定义排序 需要实现三个方法 Len 返回长度 Less 比较(升序还是降序) Swap 交换 type arrTest [ ] int func main() {

2023-01-05 18:17:04 212

空空如也

空空如也

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

TA关注的人

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