Go
文章平均质量分 82
钟大發
这个作者很懒,什么都没留下…
展开
-
Kubernetes开发(7)-实现一个简单的ingress- controller
今天来撸一个简单的ingress-controller, 用于了解ingress-controller的实现机制。完整的代码在 simple-ingress-controller基本逻辑ingress说的简单点就是url 和 service的对应关系,相当于nginx的upstream,而ingress-controller就是用来管理这些“upstream”的,可以理解为是个动态的反向代理。基于“动态反向代理”这个概念,实现一个简单的ingress-controller需要2部分,即 动态 + 反原创 2022-05-20 16:10:13 · 470 阅读 · 0 评论 -
Kubernetes开发(6)-MutatingAdmissionWebhook练手
之前写了一个简单的webhook 的tls server,并且写了一个简单的validate的api 用于实现资源的拦截。之前有提到webhook有两类,第二类就是mutatingadmissionwebhook,即对资源进行修改,仔细想想不会太意外,比如istio本质上不就是mutatingadmissionwebhook么,在启动的时候直接sidecar方式插入一个container,然后通过该container进行各类服务收集/治理,那练手的话可以自己插入一个redis 容器,模拟istio的side原创 2021-06-01 15:19:13 · 1182 阅读 · 0 评论 -
Kubernetes开发(5)-validateadmission练手
补充好基础知识后,上手实践才是最快的学习方法,所以先写一个validateadmission练练手。模拟一个生产需求,假设生产环境所有的deployment不允许单点,即副本数量不能少于2,如果少于2则不允许创建,且多个Kubernetes集群都有类似需求,那么这个场景用webhook实现就非常简单。先上一下自己写的demo地址webhook demo,可以对照查看思路之前有提过webhook的调用逻辑,结合当前场景,大致上是以下几个步骤:创建一个tls 的webserver, 做好路由,路由绑定原创 2021-06-01 15:18:28 · 602 阅读 · 3 评论 -
Kubernetes开发(4)-webhook 实现拦截请求
什么是webhookKubernetes 通过rbac进行权限控制,实现了哪些account对哪些资源具有哪些权限的控制,但它并不是万能的, 因为rbac控制的操作权限类型是有限的,需要再进行一些细化的权限管控就无从下手了,比如需要限制一些controller只能从制定的harbor进行image的下载,比如需要限制一些controller只能使用指定范围的端口号等,所幸Kubernetes在各个方面都可以进行一些自定义的开发,而webhook就是用来实现类似需求的。webhook官网介绍先看下官网的原创 2021-06-01 15:17:21 · 1931 阅读 · 0 评论 -
Kubernetes开发(3)-如何感知资源的实时变化
ClientSet的基本使用日常运维一般使用kubectl进行资源的查看,创建,销毁等,对接一些自动化运维平台的话可能需要通过一些其他方法,k8s官方提供的方式就是通过clientset进行操作,举个Goclient的例子, 当然其他语言也有类似的sdk封装,为了贴合源码,主要还是学习go的:package mainimport ( "flag" "fmt" "os" "path/filepath" "context" metav1 "k8s.io/apimachinery/pkg/原创 2021-05-14 17:26:41 · 780 阅读 · 4 评论 -
Kubernetes开发(2)—API 资源对象的串联过程
声明式API 与资源对象一般我们在k8s里声明一个新的资源对象,一般会先写一个声明式的yml, 里面对该资源进行描述/声明,最后apply/create一下进行资源的创建。apiVersion: batch/v1kind: Jobmetadata: name: demo namespace: default.......比如上面那个资源文件,就包含了资源的几个基本要素:资源类型(Resource): jobs(一般是kind的小写复数形式)资源组(Group):这里的batch就原创 2021-05-14 17:26:05 · 270 阅读 · 0 评论 -
Kubernetes开发(1)—环境以及代码目录结构
Big Picture环境Kubernetes 版本:v 1.19.7golang 版本:1.16.2(因为m1,不得不使用如此高版本的go…)目录结构.├── BUILD.bazel -> build/root/BUILD.root├── CHANGELOG├── CHANGELOG.md -> CHANGELOG/README.md├── CONTRIBUTING.md├── LICENSE├── LICENSES├── Makefile -> build/原创 2021-05-14 17:25:07 · 452 阅读 · 0 评论 -
腾讯蓝鲸笔试题
之前有次接到了腾讯小姐姐的电话,问我有没有兴趣参加蓝鲸devops的面试,在寒风中进行了45分钟的电话面之后,让我周末把笔试题做了,第一次笔试竟然在家做?有点意思啊,然后周末因为一些个人家庭原因思考了下没有参与后续的面试,但这道腾讯笔试题却花了一个下午简单做了下。题目设计并实现一个简单的存储资源分配系统实现一个服务,该服务可以接收用户端请求,为用户申请 MySQL 与 Redis 两类资源。分配给用户的资源实例必须是真实、可以连接使用的。用户可以通过接口查看分配给自己的资源配置信息。- 服务以 H.原创 2021-02-22 23:10:55 · 539 阅读 · 1 评论 -
golang实现热更新的常规方式
热更新去年写了一个Agent的程序,用于收集生产服务器的一些数据,以及对应的一些自动化操作等, 写完之后经常要修修改改加一些新功能, 产线服务器数量就很多, 导致了每次更新都是个大动作,目前的做法是通过puppet管理,新版本就往puppet上丢,等他自动重启即可,由此联想到了老东家游戏服务的热加载,所以看了一下golang的热加载实现。基本流程第一种方式, 文件主体更新golang服务进程运行时监听USR2信号进程收到USR2信号后, 下载新版本的客户端到本地fork子进程(启动新版本服原创 2021-02-02 09:57:15 · 9061 阅读 · 0 评论 -
calico源码分析-ipam(2)
Big Picturecalico 释放IP的逻辑相比分配IP的逻辑要简单很多,老样子,先画个图:然后看代码,从cmdDel开始看:func cmdDel(args *skel.CmdArgs) error { ...... handleID := utils.GetHandleID(conf.Name, args.ContainerID, epIDs.WEPName) ...... if err := calicoClient.IPAM().ReleaseByHandle(原创 2021-01-28 11:20:37 · 986 阅读 · 0 评论 -
calico源码分析-ipam(1)
背景生产要把网络插件换成calico,对于IP的分配方法有点存疑,花了2天看下了calico-ipam的源码,学习下calico的IP分配逻辑,对比生产环境,看看有没有明显的坑。calico比较突出的一点是可以指定单个pod的ip,也可以指定一个RS的网段,但实际用的比较少,首先不可能单个pod部署,一个rs指定一个ippool的意义并不是很大,所以主要看下自动分配的代码逻辑,代码其实不是很多,但几个概念挺绕的,根据目前的了解,简单画了一个流程图:IPAM的入口还是老三样,分IP 从cmdAdd开始原创 2021-01-27 14:47:44 · 2220 阅读 · 0 评论 -
golang 常见面试基础(2)
map的原理字典[map]:初始化: var amap map[string]string, 如果需要赋值,需要先make 一下testMap := make(map[string]string)Go中的字典是引用类型,但Golang中是没有引用传递的,均为值传递。这意味着传递的是数据的拷贝,所以map 也存在线程安全的问题底层结构是hmap,hmap 的结构体里有一个buckets,他是一个指针,指向了一个bucket的结构体,bucket可以看错一个链表,bucket 里存放着k&a.原创 2021-01-22 17:21:37 · 245 阅读 · 0 评论 -
golang 常见面试基础(1)
Big Picture开始记录下同事讨论/面试/论坛上有时候让我感到自信而又模糊,基础而又重要的一些问题。go语言切片和数组区别,go切片的原理:数组[array]:初始化后长度是固定的,无法修改其长度初始化: array := [5]int{1,2,3,4,5}/ array := […]int{1,2,3,4,5}Go中的数组是值类型切片[slices]: s :=[]int{1,2,3} / s := make([]int,len,cap)长度可变的"数组",可以原创 2021-01-20 18:08:40 · 351 阅读 · 0 评论 -
golang 限流控制
限流日常开发中,一般会遇到几种场景需要限流,比如有个api-server, 需要限制单个用户的调用频率,避免用户恶意刷接口或者突发大流量导致服务不可用等,这边记录几个常用的限流方法。并发控制简单的并发控制,用户的所有请求丢到一个channel里,再指定一个带缓冲区的channel为并发池,缓冲池的长度就是可以同时存在的协程数量,然后将执行完的任务根据需要直接返回或者丢到另外一个channel 里, 这样做的问题是如果任务太多,后面的任务会慢慢等待(因为channel阻塞机制),用户体验不是太好。原创 2021-01-14 16:27:23 · 1596 阅读 · 1 评论 -
K8S存储插件-FlexVolume && CSI
K8S的自定义存储插件和K8S的网络不太一样,K8S的网络只有CNI一种接口暴露方式,所有的网络实现基于第三方进行开发实现,但存储的内置实现就多达20多种,#K8S目前支持的插件类型#。但内置的往往不满足定制化的需求,所以和CNI 一样,K8S 也暴露了对外的存储接口,和CNI 一样,通过实现对应的接口方法,即可创建属于自己的存储插件,但和CNI 有点区别的是,K8S的存储插件的自定义实现方式,有FlexVolume 和 CSI 两种,两者的差别可以看做是新老功能的差异,但目前为止,FlexVolume原创 2020-12-22 17:49:15 · 3207 阅读 · 0 评论 -
prometheus sd(service discovery)学习
生产上线prometheus后遇到了一个监控覆盖度的问题,prometheus 是通过server端配置里的targets来获取监控对象的,targets的获取又是依赖discovery模块进行获取的,prometheus默认支持很多的discovery的模块,以2.19版本为例,他就支持了如下sd的方式: "github.com/prometheus/prometheus/discovery/azure" "github.com/prometheus/prometheus/discovery/cons原创 2020-11-05 00:02:28 · 1582 阅读 · 0 评论 -
CNI开发的基本套路
背景CNI 这东西搞容器的运维想必都不陌生,要知道,kubernetes的设计之初是不包含网络的,网络这玩意每家公司有每家公司自己的玩法,对各个公司来说,没有那种大一统的完美方案,只有最适合自己的方案,所以,kubernetes在设计的时候,没有设计统一的网络方案,只提供了统一的容器网络接口,Container Network Interface,也就是所谓的CNI。CNI 和 IPAM一般说的CNI都是包含IPAM的,但其实2个功能是分开实现的。CNI用于实现网络构建(network部分,网原创 2020-10-30 00:12:41 · 1212 阅读 · 0 评论 -
cobra golang好用的CLI工具
Cobra每个好的开源项目都会有很多好用的开源库的诞生,之前学openstack的时候就对openstack的oslo系列工具组用的非常多,现在学习k8s后发现同样在go下也有很多类似的开源库,比如Cobra 就是一个用来创建命令行的 golang 库,同时也是一个用于生成应用和命令行文件的程序, 包括docker,k8s 都用的类似方式去实现,用于实现CLI非常好用,我的理解他有点类似ope...原创 2020-03-06 11:25:47 · 799 阅读 · 0 评论