自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ywq935的博客

专注于 容器/K8s/DevOps等领域

原创 《 Kubebuilder v2 使用指南 》-P1-总览篇

《 Kubebuilder v2 使用指南 》前言K8s内置的build-in 资源类型,可以组合使用以满足绝大部分场景的部署需求,更进一步地,对于追求更高自由度、有特殊需求的场景下,在kubernetes v1.7 后的版本开始支持CRD(CustomResourceDefinition),无需修改组件代码,即可通过CRD向APIServer注入自定义资源的方式,对内置资源进行上层封装,实现自定义环境部署和运行逻辑。APIServer会根据CRD的指定,自动生成CRD的restful路径,有关此路径的

2020-05-24 10:40:58 319

原创 Kubernetes源码学习-总篇

前言在熟悉kubernetes及常用组件、插件的管理使用后,总还觉得差了些什么,不够通透,是时候来读一读源码了,结合代码与实际使用场景来互相印证,有助于对kubernetes的理解更为透彻。这里将会分多篇介绍kubernetes各核心组件的工作模式、调度管理算法等。版本Kubernetes v1.14.3 ,最新部署的一套环境是此版本,代码版本保持一致,方便后续测试调试核心组件Sche...

2019-08-08 16:06:11 1976

原创 《 Kubebuilder v2 使用指南 》-P8-踩到的坑

前言一路下来踩了不少坑,有一些没有印象了,还有印象的就记录下来,想起来再补充.metadata.resourceVersion: Invalid value: 0x0: must be specified for an update对unit执行scale的时候报错:#~ kubectl scale unit unit-sample --replicas=2The unit "unit-sample" is invalid: metadata.resourceVersion: Invalid va

2020-05-24 10:47:27 300

原创 《 Kubebuilder v2 使用指南 》-P7-本地调试和发布Controller

本地调试和发布Controller前言前面几篇已经完成了初步的代码编写,但随后还需要 调试测试 --> 正式发布 到K8s集群内。这个步骤是官方文档内简笔带过的,极易带来困扰,写代码很难一气呵成,总会有error需要调试,但不可能每次为了调试一两行代码或加个打印输出,重复进行打镜像、推镜像、重启pod这一系列繁杂的操作,本篇专门讲述如何使用本地开发环境连接K8s集群进行调试,以及测试完毕后正式发布到K8s集群中运行。调试/测试众所周知,APIServer交互是需要TLS加密的,CRD cont

2020-05-24 10:46:50 185 4

原创 《 Kubebuilder v2 使用指南 》-P6-CRD Admission Webhook

CRD Admission Webhook前言前面的文章中,实现了Unit资源对象实例持久化之后的controller管理的过程。除此之外,Kubernetes额外支持了一些很有趣且实用的功能,例如经常被用在资源准入控制上的Adminssion Webhook,它是对APIServer接收准入请求的扩展。详情请参考官方文档:extensible-admission-controllers认识Adminssion Webhook什么是Adminssion Webhook?在官方文档里对的话来说就是

2020-05-24 10:46:06 103

原创 《 Kubebuilder v2 使用指南 》-P5-实现CRD控制逻辑

实现CRD控制逻辑前言上一篇已经设定了Unit所要实现的目标,完成了Unit结构体各子字段、ownResource字段的填充,为控制逻辑的实现做了基础铺垫。本篇主要解决和实现的控制逻辑:如何管理Unit下属的own Resources如何使Unit和own Resources生命周期绑定删除Unit资源前能否做一些自定义操作逐一来实现。管理own Resources如前文所说,一共设计了5种ownResource分别对应StatefulSet/Deployment/Ingress/Se

2020-05-24 10:44:13 171

原创 《 Kubebuilder v2 使用指南 》-P4-从零开始设计一个CRD

从零开始设计一个CRD前言经过前面的铺垫,相信现在对kubebuilder的工作模式已初具了解,那么从本篇开始,正式设计一个CRD。本文对于Unit的设计,是基于我的个人场景下的需求提炼出来的,不一定适合你,但着重点在于思路,希望能有帮助。面临的现状在我的场景下,应该也是大多数人的场景下,通常一个运行服务(姑且这么称呼),使用一系列build-in 类型资源进行组合,来保障运行和提供服务,例如,最常用的组合有:StatefulSet/Deployment/Ingress/Service/Ingres

2020-05-24 10:43:19 148

原创 《 Kubebuilder v2 使用指南 》-P3-认识Kubebuilder

认识Kubebuilder前言没有人会喜欢黑盒,在使用一个工具之前,我习惯于尽可能多地去了解它,不然用起来会觉得不踏实。Controller的工作流程已经很熟悉了,理解kubebuilder的源码应该也比较容易。因此,大概阅读了一下了kubebuilder的源码,本篇圈出其中几个重点,用以帮助理解和认识kubebuilder。概念名词下面几个概念名词非常的重要,文中会多次提及。Own ResourceCRD一般设计用作管理k8s内置的各类资源组合,用以实现自定义的部署和运行逻辑,是一种上层封装,

2020-05-24 10:42:27 260

原创 《 Kubebuilder v2 使用指南 》-P2-环境准备

环境准备Requirementsgo version v1.13+.docker version 17.03+.kubectl version v1.11.3+.kustomize v3.1.0+除了上面的工具和环境以外,需要有一套可连接的kubernetes环境,要求配置好kubectl config,以便能直连进行调试。由于Feature gates的 --CustomResourceWebhookConversion参数是在v1.15及以上的版本k8s才默认为true,为了避免版本导

2020-05-24 10:41:56 57

原创 kubeadm修改默认证书有效期,解决证书过期问题

kubeadm 修改默认证书有效期前言出于安全考虑,k8s 团队推荐定期更新版本,因此kubeadm生成的证书,有效期默认在代码中写死为1年,一旦证书过期,k8s集群将会崩溃,因此,续期 or 升级,成了一个一年一度必选题。但在生产环境中,每一次版本更新可能存在未知的风险,给已经稳定运行的集群带来诸多不确定性,而每年续期一次证书,对管理不太友好,频繁手动操作也可能会带来额外的风险。去年部署的1.14的集群,证书快要到期了,现在决定修改kubeadm的源码重新编译,将续期证书的有效期进行延长。本篇记载分析

2020-05-12 09:01:29 553

原创 Kubernetes源码学习-Controller-P5-StatefulSet Controller

P5-StatefulSet Controller前言在前面的几篇文章中,先对deployment controller进行了初步分析:Controller-P3-Deployment Controller严格来讲deployment的管理pod的逻辑是基于replicaSet来实现的,因此接下来结合replicaSet controller进行了深入:Controller-P3-Rep...

2020-04-08 20:59:38 203

原创 Kubernetes源码学习-Controller-P4-ReplicaSet-Controller

P4-ReplicaSet Controller前言在上一篇文章中,对deployment controller的工作模式进行了详细地分析:[Controller-P3-Controller](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/controller/Kubernetes源码学习-Controller-P3-...

2020-03-24 19:42:27 98

原创 Kubernetes源码学习-Controller-P3-Controller分类与Deployment Controller

P3-Controller分类与Deployment Controller前言Controller部分的第一篇文章中,我们从cobra启动命令入口开始,进入到了多实例leader选举部分的代码,对leader选举流程做了详细地分析:Controller-P1-多实例leader选举接着在第二篇中,文字和图解简单描述了controller是如何结合client-go模块中的informer工...

2020-01-31 16:05:26 132

原创 Kubernetes源码学习-Controller-P2-Controller与client-go

病毒肆虐,阴雨连绵,门房紧闭,亲友不问,冷冷清清,甚是无趣。坐下写写代码,总结下过去一年所学,整理两篇文章,倒也算是乐得自在。盼疫情早日控制,春回大地,愿同胞们身体安康,祝新年快乐!P2-Controller与client-go前言Controller作为k8s的资源控制组件,必定要实时地监控对比资源的目标状态和当前状态,这其中会与apiserver产生大量的交互。在k8s中,k8s各个组件...

2020-01-26 14:15:18 136

原创 kubernetes挂载cephfs带来的mds卡顿问题及引入cephfs storageClass

kubernetes挂载cephfs带来的mds卡顿问题及引入cephfs storageClass前言前面的文章中,有写过如何在kubernets中组合pv/pvc,使用cephfs进行数据的持久化存储:cephfs 在kubernetes中的使用但是在经过一段时间的使用后,发现此方式意外地会造成ceph mds严重的性能问题,本文将介绍如何使用cephfs storageClass避免...

2020-01-06 08:45:08 675

原创 kubernetes 部署redis cluster

kubernetes 部署redis cluster前言Redis cluster的集群关系的维系,并非是依赖于ip的,而是依赖于cluster内部的唯一id, ip只在首次建立集群关系时连接彼此使用,不作为成员连接凭据,取而代之的是id。画外音:只要持有id,容器重启ip怎么变化都不会影响到维系redis cluster的成员关系。那么id怎么保存的呢?redis cluster在建立起来...

2020-01-03 18:10:32 306

原创 Etcd 和 kubernetes master的灾备与恢复

Etcd和kubernetes master的灾备与恢复背景说明问题:假设某台带有etcd的k8s master节点完全故障,彻底无法恢复方案:新启动一台主机,配置为故障master主机相同的ip和主机名,并尝试原地恢复,顶替原故障master节点Etcd恢复参考官方文档:https://github.com/etcd-io/etcd/blob/master/Documentation...

2020-01-01 17:42:15 214

原创 Kubernetes源码学习-Controller-P1-多实例leader选举

P1-多实例leader选举.md前言Kubernetes多master场景下,核心组件都是以一主多从的模式来运行的,在前面scheduler部分的文章中,并没有分析其主从选举及工作的流程,那么在本篇中,以controller为例,单独作一篇分析组件之间主从工作模式。入口如scheduler一样,controller的cmd启动也是借助的cobra,对cobra不了解可以回到前面的文章中查...

2019-12-10 19:23:43 138

原创 Kubernetes源码学习-Controller-总览篇

Controller源码分段阅读导航多实例leader选举Informer工作流程Deployment ControllerStafulSet Controller待补充概述kube-controller的作用引述首先依照惯例,贴两篇官方对   于controller的设计逻辑和运行机制的说明文档:https://github.com/kubernetes/communi...

2019-12-10 19:22:32 143

原创 Kubernetes各组件参数配置优化建议

Kubernetes各组件参数配置优化建议kubernetes虽然默认配置下已经足够可用满足常见的中小规模场景,但是若是将各组件参数、内核参数进行适当的调整,以达到更贴合使用场景的参数值,对集群运行的稳定性、故障切换能力等方面会有不小的提升。下面介绍一下各组件生产运行常做的一些参数调整。Kubelet参数配置kubelet在各个组件之中,作为唯一的分布在每个节点上的daemon控制程序,应该...

2019-11-18 16:16:02 773

原创 Golang并发模型

Golang并发模型前言Go实现了两种并发形式。第一种是大家普遍认知的:多线程共享内存,这是最常见的各语言中的多线程并发模型,go本身也支持。另外一种是Go语言特有的,也是Go语言推荐的CSP(communicating sequential processes)并发模型。Go语言提倡以通信的方式来共享内存,这句话相信看过一些go相关文档的同学一定不陌生:Do not communicate...

2019-09-25 18:04:31 182

原创 Kubernetes源码学习-Scheduler-P5-Pod优先级抢占调度

P5-Pod优先级抢占调度1. 前言前面的两篇文章中,已经讲过了调度pod的算法(predicate/priority),在kubernetes v1.8版本之后可以指定pod优先级(v1alpha1),若资源不足导致高优先级pod匹配失败,高优先级pod会转而将其驱逐,抢占低优先级pod的资源,那么本篇就从代码的层面展开看一看pod抢占部分的逻辑。2. 抢占调度入口在P1-入口篇中我们找...

2019-09-03 18:17:18 120

原创 Kubernetes源码学习-Scheduler-P4-Node优先级算法

P4-Node优先级算法前言在上一篇文档中,我们过了一遍node筛选算法:p3-Node筛选算法按调度规则设计,对筛选出的node,选择优先级最高的作为最终的fit node。那么本篇承接上一篇,进入下一步,看一看node优先级排序的过程。Tips: 本篇篇幅较长,因调度优选算法较为复杂,但请耐心结合本篇阅读源码,多看几次,一定会有收获。正文1. 优先级函数1.1 优先级函数入口...

2019-08-22 17:03:31 171

原创 hexo图片展示-blog图床迁移至七牛云

前言上一篇中,搭建好了hexo next主题的博客,将cxxn中的所有博客导出为md文档后再全部上传到hexo站内,但是有一个很大的问题:hexo本地图片无法显示,需要安装插件,然后以非md外链的格式插入图片,这使用起来相当不便且不通用,因此放弃插入本地图片的方案。导出的md中的图片外链有的是csdn站内的,有的是github仓库里的,为了保证md中的图片能在各平台都正常显示,了解到七牛云免费提...

2019-08-20 17:58:28 270

原创 Hexo+Github-pages: 免建站快速部署你的专属博客

前言C某某N博客的页面样式实在不敢恭维,广告不少,最厉害的在于写作积分还不能用于下载,近两年Hexo挺火的,结合github pages使用,纯md文档输出,自动生成简洁好看的web页面,建站的步骤都可以省略了,试用一番下来体验确实尚可,记录一下部署过程1. 创建github pages登录github,新建一个repo,repo名强制要求为username.github.io,其中user...

2019-08-20 16:54:52 184

原创 Kubernetes源码学习-Scheduler-总览篇

调度器总体设计调度器源码分段阅读目录调度器入口调度器框架Node筛选算法待补充概览首先列出官方md链接,讲解颇为生动:https://github.com/kubernetes/community/blob/master/contributors/devel/sig-scheduling/scheduler.md这里用结合自己阅读代码的理解做一下翻译。工作模...

2019-08-20 15:34:42 98

原创 Kubernetes源码学习-Scheduler-P3-Node筛选算法

P3-Node筛选算法前言在上一篇文档中,我们找到调度器筛选node的算法入口pkg/scheduler/core/generic_scheduler.go:162 Schedule()方法p2-调度器框架那么在本篇,由此Schedule()函数展开,看一看调度器的node筛选算法,优先级排序算法留作下一篇.正文Schedule()的筛选算法核心是findNodesThatFit()方...

2019-08-20 15:33:30 97

原创 Kubernetes源码学习-Scheduler-P2-调度器框架

调度器框架前言在上一篇文档中,我们找到了sheduler调度功能主逻辑的入口:P1-调度器入口篇那么在本篇,我们基于找到的入口,来进入调度器框架内部,看一看整体的逻辑流程,本篇先跳过调度的算法(Predicates断言选择、Priority优先级排序),只关注pkg/scheduler目录内的scheduler框架相关的逻辑流向,摸清scheduler框架本身的代码结构,调度算法留在后面的...

2019-08-20 15:31:41 115

原创 Kubernetes源码学习-Scheduler-P1-调度器入口篇

调度器入口前言本篇介绍scheduler的初始化相关逻辑入口之前入口函数是位于cmd/kube-scheduler/scheduler.go中的main()方法,调用的是app.NewSchedulerCommand()方法,跳转至此方法,可以看到函数上方的注释:// NewSchedulerCommand creates a *cobra.Command object with def...

2019-08-20 15:11:39 130

原创 golang算法练习:排序

需求排序操作,列举常见的几种排序模型:冒泡、选择、插入、快排备注:需求和运行输出结果均已在代码中注释冒泡代码:package mainimport "fmt"/*思路:从第一个元素开始循环,与其相邻的元素两两比较,若左边元素大于右边元素,则两者互换位置,保持右边的元素比左边元素大的排序原则分两层循环,外层循环的成员是所有元素,内层循环是成员右边的元素*/func ma...

2019-07-22 17:34:13 121

原创 golang算法练习:单链表/双链表/环形链表

需求链表,常见且非常灵活的数据模型,可定制性强,可根据需求调整满足不同的使用需求,如FIFO\LIFO,快速查找等,这里分别列举基础的单向链表和双向链表增删改查操作单向链表代码package mainimport ( "errors" "fmt")type Node struct { id int name string next *Node}type Sin...

2019-07-18 17:42:53 320

原创 golang算法练习:基于array的队列实现

需求队列,很常用的FIFO(先入先出)数据模型,下面尝试使用golang的array数据结构来实现队列模型简单队列代码:package mainimport ( "fmt")type SingleQueue struct { Cap int `json:cap` // 容量 Arr [5]int `json:arr` // 成员数组 Head int ...

2019-07-18 17:30:58 226

原创 k8s(十六): VXLAN和Flannel

前言目前k8s中比较常用的cni有calico、flannel、kube-router等,个人比较熟悉的是kube-router的bgp纯直通方案,flannel则是另一款使用较多的比较简单易用的方案,这里着重了解一下flannel的vxlan这一常用模式VXLAN在了解flannel之前,有必要掌握vxlan的基础知识。首先来看看vxlan协议的报文封装格式:说明:vxlan,给数据...

2019-07-17 16:57:41 1159

原创 k8s(十五)、Kubernetes v1.14多master集群部署

前言距离上一次搭1.9版本,已经过去一年了,这一年时间里,kubernetes已经迭代到了v1.14.3版本了,为了体验新版本的特性,今天来搭建最新版的集群,部署步骤与之前的一致,CNI kube-router经过了线上一年的验证,这里继续沿用kube-router的bgp直通网络方案。具体步骤与之前的v1.9版本几乎完全一致,本篇只列出差异部分,详情可参考此前的文章:k8s(一)、 1.9...

2019-06-18 09:51:04 1467

原创 linux TCP连接失败(不回复SYN,ACK)问题分析

问题现象在某一台服务器无法访问另一台服务器的https服务,telnet检测端口发现端口无法连接:[root@020113 ~]# telnet 192.168.5.27 443Trying 192.168.5.27...问题分析第一步:网络检查同网段其他主机访问服务端是正常的,因此网络问题可以排除第二步:查看防火墙步骤略,这里检查双方iptables规则均无问题第三步:抓包...

2019-06-10 16:52:33 1830

原创 Golang基础学习: Struct和Json

前言结构体是将多个任意类型的命名变量组合在一起的聚合数据类型,通过结构体,可以多维度/方面的聚合逻辑数据,形成一个整体,其中的这些命名变量叫做结构体的成员。Struct声明:// 声明一个结构体类型type Employee struct { ID int Name string Address string DoB string Pos...

2019-05-03 15:38:49 649

原创 Golang基础学习: array和slice对比和使用

前言在golang中,常见的序列型数据类型有array和slice这两种,但array因为其固定长度的限制,在实际使用中用得不多,slice则更为常用。下面简单介绍和对比一下这两种相似却又有很多差异的数据类型。Array:概念:在golang中,数组由相同类型的元素组成的具有固定长度的一种序列型复合数据类型。声明和使用:package mainimport "fmt"/*数组...

2019-04-27 12:09:29 85

原创 k8s踩坑(三)、kubeadm证书/etcd证书过期处理

故障现象使用kubeadm部署的集群,在运行了一年之后今天,出现k8s api无法调取的现象,使用kubectl命令获取资源均返回如下报错:Unable to connect to the server: x509: certificate has expired or is not yet valid故障排查查看apiserver.crt证书的签署日期和过期日期:root@9027:...

2019-03-08 17:47:36 12686 9

原创 Python子线程异常捕获 & Python自定义优化线程池

前言虽然CPython因为GIL的存在导致多线程的并发计算能力大打折扣,但是在i/o密集型的场景时,使用多线程还是能带来效率上的飞跃。近期在使用多线程时遇到了主线程无法捕获子线程抛出的异常问题,这里记录一下解决的办法。需求将某一指定目录下所有的文件(包含子目录下的文件)中所有被$[]$字符包裹起来的变量替换成指定的值,这是一个典型的io密集的场景,因此考虑使用多线程提升效率原demode...

2019-01-21 16:37:13 1976

原创 Kubernetes踩坑(二): Service IP(LVS)间断性TCP连接故障排查

问题阶段(一):用户反应某个redis使用卡顿,连接该redis服务使用的是svc代理,即ipvs snat的方式,ipvsadm -L发现,VIP收到的6379端口的数据包,会以rr的方式分别转发到pod的80 6379端口上,相当于会有50%的丢包,不卡才怪:# ipvsadm | grep -2 10.108.152.210TCP 10.108.152.210:6379 rr -...

2018-12-11 11:49:16 3684

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