自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 node-exporter源码解析(一)

node-exporter无疑是监控主机资源的最常用的一个exporter,通过阅读exporter的源代码,对了解node-exporter的指标详来源情有很大的帮助,它就是通过go语言读取linux上的相关文件,并把它封装成prometheus相关指标以http暴露出去,我们就可以通过prometheus抓取指标了,我本着学习go语言和了解指标的来历的初心向大家分享我阅读源码的过程,现在就让我们开始吧。我们就从collector下的collector.go文件开始解析,因为它定义了这个注册函数。

2024-04-10 15:25:59 761

原创 k8s管理系统

k8s

2023-09-21 21:58:46 143

原创 理解cicd工具tekton

from:当 Task 的 Inputs 依赖于上一个 Task 的 Outputs 时,可以通过 from 参数来指定runAfter:当 Task 间没有资源依赖,但需要使一个 Task 在另外一个 Task 之后运行的话,可以使用 runAfter 来指定。上面是针对产物需要进行传递的情况下,对于目前例子而言,由于只需要一个 Task,虽然指定了 Inputs 和 Outputs,但并没有另一个 Task 来引用这些结果。在 Tekton 中,DAG(有向无环图)的功能是原生支持的。

2023-07-08 22:04:04 179

原创 jenkins+kubernetes构建CICD

3.使用deployment安装jenkins。使用service代理jenkins外部访问。配置连接harbor,我们先安装harbor。配置jenkins连接kubernetes。jenkins安装Sonarqube插件。使用docker安装Sonarqube。1.clusterrole绑定。配置pod template。回滚的pipeline。结合Sonarqube。编写pipeline。

2023-07-04 19:36:12 262

原创 prometheus监控(二)

为什么prometheus天然适合监控kubernetes指标分析容器基础资源指标 | kubelet 内置cadvisor metrics接口 | 查看容器cpu、mem利用率等 |k8s_sd node级别直接访问node_ip| k8s资源指标 通过coredns访问k8s服务组件指标| 服务组件 metrics接口 | 查看apiserver 、scheduler、etc、coredns请求延迟等 | k8s_sd endpoint级别部署在pod中业务埋点指标| pod 的metrics

2023-06-23 17:34:52 1815

原创 prometheus监控(一)

1.mysql和mysql-exporter在一个pod里在mysql授权mysql-exporter在prometheus创建job在grafana中导入模板blackbox_exporter:blackbox_exporter是Prometheus 官方提供的 exporter 之一,可以提供 http、dns、tcp、icmp 的监控数据采集,blackbox_exporter 可用于以下监测:HTTP 测试: 定义Request Header信息、判断 Http status/Htt

2023-06-23 09:17:18 428

原创 理解kubernetes调度

默认调度器的抢占过程: 确定要发生抢占 -> 调度器将所有节点信息复制一份,开始模拟抢占 -> 检查副本里的每一个节点,然后从该节点上逐个删除低优先级Pod,直到满足抢占者能运行 -> 找到一个能运行抢占者Pod的node -> 记录下这个Node名字和被删除Pod的列表 -> 模拟抢占结束 -> 开始真正抢占 -> 删除被抢占者的Pod,将抢占者调度到Node上。K8s的资源分为两类,一类是可压缩资源(compressible resources),比如CPU,也就是当资源不足的时候Pod不会退出。

2023-06-15 10:53:15 63

原创 了解service和dns

但是,当你访问这条 A 记录的时候,它返回的是所有被代理的 Pod 的 IP 地址的集合。可以看到,这个目的地址和端口,正是被代理 Pod 的 IP 地址和端口,一直以来,基于 iptables 的 Service 实现,都是制约 Kubernetes 项目承载更多量级的 Pod 的主要障碍,而 IPVS 模式的 Service,就是解决这个问题的一个行之有效的方法,IPVS 模式的工作原理,其实跟 iptables 模式类似。而作为对这个事件的响应,它就会在宿主机上创建这样一条 iptables 规则。

2023-06-14 18:37:18 204

原创 理解kubernetes网络插件工作原理

第一类叫做main插件,它是用来创建具体网络设备的二进制文件,比如bridge,第二类是ipam负责分配ip地址的二进制文件,比如dhcp,第三类是cni插件,比如calico,tuning是一个通过sysctl调整网络设备参数的二进制文件,portmap是一个通过iptables配置端口映射的二进制文件,bandwidth是用来限流的,我们在安装好比如calico之后会生成对应的cni配置文件,它其实也是一个configmap。最后,CNI bridge 插件会为 CNI 网桥添加 IP 地址。

2023-06-14 14:07:19 114

原创 理解容器网络(一)

在实际传递数据的过程中在网络不同层次都有linu内核netfilter工作,容器想ping通另一个主机,先到达docker0网卡,然后根据宿主机上的路由规则到达另一台主机,前提是本身这两台主机都能互相通,容器之间的跨主机通信是如何实现的呢,我们可以通过软件的方式,创建一个整个集群公用的网桥,然后把集群里的所有容器都连接到这个网桥上,这种技术叫做overlay network 如图所示。当172.17.0.2ping172.17.0.3的时候我们看一下0.2的路由规则。

2023-06-14 11:10:05 37

原创 了解pv,pvc,storageclass(一)

关于pv的两阶段处理流程是独立与kubelet主控制循环的,第一阶段的attach是由volume controller负责维护的,这个控制循环的名字是attachDetachController,就是不断检查每一个pod对应的pv,和这个pod所在宿主机之间的挂载情况,从而决定是否对pv进行attach操作,第二个阶段的mount操作,必须发生在pod对应的宿主机上,所以它是kubelet组件的一部分,它叫做volumemanagerReconciler,它是独立的一个goroutine。

2023-06-13 17:58:24 247

原创 了解kubelet(一)

syncloop主要从apiserver监听更新动作,它下面有很多的podworker去处理这些动作,syncpod就是去调谐这些动作,其中的computePodaction会去计算当前pod是什么状态,你如果去创建一个pod,它会看当前有没有这个pod,relist通过pod cache这种形式收集pod的状态信息,把这些信息上报给apiserver。做个小练习,吧容器运行时换成containerd。下面是kubelet架构图。

2023-06-12 14:31:49 283

原创 kubernetes控制器(一)

一个控制器每次需要获取对象的时候都要访问 APIServer,这会给系统带来很高的负载,Informers 的内存缓存就是来解决这个问题的,此外 Informers 还可以几乎实时的监控对象的变化,而不需要轮询请求,这样就可以保证客户端的缓存数据和服务端的数据一致,就可以大大降低 APIServer 的压力了。这是因为我们首先通过 Informer 注册了事件处理程序,这样当我们启动 Informer 的时候首先会将集群的全量 Deployment 数据同步到本地的缓存中,会触发。下面我们就分析这个图。

2023-06-05 23:05:21 182

转载 了解kube-scheduler(三)

len(pod.Spec.NodeName) = 0,那么这个 Pod 没有被调度过或者是此前调度过但是调度失败的(用户修改了 Pod 的配置导致 Pod 发生变化,又被 kube-scheduler 感知到了),如果是没有调度过的 Pod 那么直接加入到 activeQ,如果是调度失败的 Pod 则根据上述规则判断是加入 backoffQ 还是 activeQ。从上面的情况,我们可以看到,集群内有事件发生变化,是可以加速调度失败的Pod被重新调度的进程的。

2023-06-05 12:20:40 78

转载 了解kube scheduler(二)

kube scheduler的调度过程是有一个个的扩展点组成的,调度阶段包括sort,filter,score,reserve,permit,绑定阶段包括bind,每个扩展点又有很多的调度插件组成,在sort阶段,待调度的pod都会放在activeQ对列中,这是一个基于堆实现的优先级对列,因为我们可以给pod设置优先级,比如加上priorityclass字段,不加这个字段,会根据pod创建的先后顺序调度,filter有三个扩展点prefilter,filter,postfilter,

2023-06-05 12:07:51 100

原创 了解kube-scheduler

调度器与apiserver采用watch连接,对那些nodename为空的进行调度,调度要考虑很多东西,公平度调度,如何让资源高效利用,pod的QoS,affinity和anti-affinity,调度器分为两个阶段,predicte就是过滤不符合条件的节点,priority就是优先级排序,选择优先级最高的节点。优先调度上匹配nodeaffinity的节点上,优先调度到匹配tainttoleration的节点上,检查pod是否可以调度到内存紧张的节点。下面看看podaffinity。

2023-06-04 10:04:45 35

原创 使用go添加认证证书

上篇我们手动添加证书很麻烦,这次我们自动生成证书,并用client-go创建mutatingwebhookconfigurations,validatingwebhookconfigurations。基于rbac的initcontainer创建证书,跟主容器共享一个目录,使用deployment部署。

2023-06-03 18:20:03 198

原创 开发apiserver实现一个容器镜像白名单的 K8S 准入控制器

在这一步之前需要创建secret,接着需要创建validatingwebhookconfigurations,mutatingwebhookconfigurations。我们使用go编写validate和mutate。我们把认证作为pod运行在集群中。dockerfile如下。

2023-06-03 11:51:14 169

原创 了解apiserver(二)

kubernetes支持更细粒度的限流当时,称谓APF(api priority and fairness),不同的请求划分成了不同的优先级,每个优先级有对应不同的flow,每个flow又对应很多queueset,就是避免某个请求持续对apiserver影响造成其他请求的访问。apiserver中的每个group内的资源在apiserver连接etcd的时候公用连接,这个是可以调的,我们也可以自定义apiserver然后通过apiserver aggregate加入到主apiserver。

2023-06-01 22:25:31 109

原创 了解apiserver(一)

• 需要API Server启动时配置–basic-auth-file=SOMEFILE,文件格式为csv,每行至少三列password, user, uid,后面是可选的group password,user,uid,"group1,group2,group3”在证书认证时,其CN域用作用户名,而组织机构域则用作group名。• --authentication-token-webhook-config-file 指向一个配置文件,其中描述 何访问远程的 Webhook 服务。默认时长为 2 分钟。

2023-06-01 18:26:52 359

原创 了解etcd(三)

不涉及磁盘IO,若节点内存不够,可能导致缺页中断,引起延时抖动,服务性能下降,当db文件过大后,boltdb本身连续空闲页的申请,释放,存储都会存在一定的开销,db文件过大后,count only,limit,大包查询等expensive request对集群稳定性也有很大影响,db过大对快照也有很大的影响。下面我们了解一下etcd中的压缩机制。

2023-05-31 11:34:00 419

原创 了解etcd(二)

Lease 的核心是 TTL,当 Lease 的 TTL 过期时,它会自动删除其关联的 key-value 数据。首先是 Lease 创建及续期。etcd在选举投票的时候,当follower收到来自candidater的请求后,它会看candidater的数据至少和自己的一样新,它的任期号大于自己的任期号,并且自己没有投票给其他人,follower变成candidater后自己的任期会加1,当leader坏掉以后,恢复之后不会获得集群leader地位,是因为自身的数据是落后其他节点的。

2023-05-30 20:37:29 120

原创 深入了解etc(一)

kvserver向raft模块提交提案会有一个7秒的超时时间,超过时间会报,requests timeed out 所有的写请求都会先到leader处理,etcdserver从raft模块获得消息后,会通过广播告诉其他节点,把信息写入到wal日志,它包含,crc校验码,data wal记录内容,和type wal记录类型,raft中的input结构包含下面信息,term是任期号,index是日志条目的索引,单调递增,然后是type可以是普通日志,和集群配置变更日志,data里面是提案的内容。

2023-05-30 14:49:48 54

原创 了解etcd

它的安全性是通过log一致性保持的,失效的leader有可能会成为新的leader,新的leader会包含前一个commit log,wal日志,wal日志是一个二进制的文件,他有很多字段,第一个是type,有两种一种是0 表示正常,一种是1表示的是有变更,第二个字段是term,他随着leader变化而增加,第三个是index,然后是data,下图是etcd存储,watch,和过期机制。这样的话,key的设置是有前提的,需要知道这个key当前的具体情况才可以对其设置。件,当这些条件满足后,才能赋值成功。

2023-05-29 23:15:58 61

原创 了解kubernetes API

这时候,Pilot 通过调节这两 Pod 里的 Envoy 容器的配置,从而将 90% 的流量分配给旧版本的应用,将 10% 的流量分配给新版本应用,并且,还可以在后续的过程中随时调整。这样,一个典型的“灰度发布”的场景就完成了。istio通过一种 Dynamic Admission Control 的admission的热插拔的方式无感的向apiserver传递增加envoy容器的配置,而 Initializer 的控制器,不断获取到的“实际状态”,就是用户新创建的 Pod。

2023-05-29 19:26:29 56 1

原创 kubernetes 核心控制器理解

比如,每个 Pod 的 hostname、名字等都是不同的、携带了编号的。所以,我们就在 Job 对象的 spec.backoffLimit 字段里定义了重试次数4(即,backoffLimit=4),而这个字段的默认值是 6,在 Job 的 API 对象里,有一个 spec.activeDeadlineSeconds 字段可以设置最长运行时间,在 Job 对象中,负责并行控制的参数有两个:spec.parallelism,它定义的是一个 Job 在任意时间最多可以启动多少个 Pod 同时运行;

2023-05-29 11:36:58 64 1

原创 kubernetes pod api对象了解

像很多httpserver的开发一样我们需要注册路由,APIHandler用来注册路由,对于对apiserver的访问都需要认证,它时用AuthN来做的,然后它会做速率限制,用Rate Limit来做,他还有日志记录模块,是Auditing,然后就是授权AuthZ,kubernetes被广泛使用的是RBAC,apiServer还支持Aggregater,就是你可以定义自己校验准则,那么准入控制怎么理解?Secret 最典型的使用场景,莫过于存放数据库的 Credential 信息,比如下面这个例子。

2023-05-27 23:16:09 159

原创 pod存在的意义

所以如果我们想设计一个网络插件我们只需要关心infa容器的network namespace有关,所以在应用容器化的时候,一个很关键的做法是如何把一些具有亲密性的容器放在一个pod里,比如war包与Java应用,日志收集的例子,他们都使用了initcontainer,也就是常说的sidecar,sidecar 指的就是我们可以在一个 Pod 中,启动一个辅助容器,来完成一些独立于主进程(主容器)之外的工作。所以pod具有一下特性。

2023-05-26 14:11:45 78 1

原创 二进制安装高可用的kubernetes集群

二进制安装kubernetes,nginx+keepalived实现高可用

2023-05-25 23:29:53 430 1

原创 kuadm安装kubernetes的原理讲解

kubeadm原理理解

2023-05-25 14:14:19 82 1

原创 为什么我们要在dockerfile中使用tini

使用tini进程管理工具,回收容器里的僵尸进程

2023-05-25 11:15:45 1086

转载 docker架构梳理

docker架构梳理

2023-05-25 09:30:07 279

原创 docker只是一个进程(二)

而 rootfs 的最上层是一个可读写层,它以 Copy-on-Write 的方式存放任何对只读层的修改,容器声明的 Volume 的挂载点,也出现在这一层。这种方式就是linux的bind mount,他的工作原理是inode的替换过程,而且挂载的内容也不会被docker commit掉,这是因为commit时发声在宿主机空间的,在我们使用-v参数指定挂载的时候,宿主机就会准备好这个目录,然后挂载到容器内,由于mount namespace 所以宿主机内的挂载目录里内容是空的。

2023-05-24 21:27:25 70 1

原创 docker只是一个进程

理解docker容器

2023-05-23 22:33:27 348 2

空空如也

空空如也

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

TA关注的人

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