青蛙小白
#Kubernetes

kubectl plugin插件机制初体验之krew

1.kubectl插件机制简介 kubectl插件机制在Kubernetes 1.14宣布稳定,进入GA状态。kubectl的插件机制就是希望允许开发者以独立的二进制形式发布自定义的kubectl子命令。 kubectl插件可以使用任意语言开发,如可以是一个bash、python的脚本,也可以是其他语言开发编译的二进制可执行文件,只要最终将脚本或二进制可执行文件以kubectl-的前缀放到PATH中即可。使用kubectl plugin list可以在PATH中查看有哪些插件。

#Jenkins

Jenkins Shared Libraries教程(二): 使用第三方库编写自己的库

前面我们使用gradle初始化了Jenkins Shared Libraries的开发框架,本篇将介绍在src目录下使用第三方库开发我们自己的库。 在src目录下开发自己的库的需求是肯定存在的,我们在var目录中编写自定义Step时会用到Jenkins及其众多插件目前提供的各式各样的Pipeline Step,但有些需求是这些Step无法提供的。例如,在进行构建容器镜像之前我们可能需要访问Harbor(一个Docker镜像仓库)的API获取一些额外的信息,或者访问其他配置纹理系统的Restful API获取信息,这就需要我们的Shared Libraries中提供HTTP Client的功能,显然这个功能可以放到src目录下,而我们不会白手起家,在src目录下编写这个HTTP Client功能的时候,就会用到第三方库了。

使用OpenVPN将Kubernetes集群网络暴露给本地开发网络

Kubernetes集群内部是一套单独的网络,与外部网络相隔离,Kubernetes提供了NodePort、LoadBalancer、Ingress等方式用于将集群内部的Service暴露到集群外部, 但这些方式都更适用于将边缘服务暴露出去。例如,一个产品由很多微服务组成,这些微服务大多数都是内部服务,只有少数作为边缘服务需要暴露到集群外部供用户使用。 而开发人员是存在从Kubernetes外部访问和调试这些内部服务的需求的,尤其是针对测试环境的Kubernetes集群,这个需求更加必要。针对这个需求,有以下两种实现方式:

#Go

Goroutine调度器学习笔记

三种多线程模型 操作系统的线程由内核的线程调度器负责调度,不同的编程语言对内核线程的封装不同,有以下三个模型: N:1模型: N个用户空间线程运行在1个内核空间线程上。优点是上下文切换快,缺点是无法有效利用多核特性。 在该模型下,线程管理由用户空间的线程库进行,因此上下文切换效率高,但如果某个用户线程执行阻塞系统调用(syscall),其他用户线程也将会阻塞。因为任一时间只能有一个内核空间线程访问内核,所以多个用户线程也就无法并行运行在多核系统上。 由于无法有效利用系统多核特性,所以现在几乎没有编程语言使用这个模型。 1:1模型: 1个用户空间线程运行在1个内核空间线程上。每次调度都要在用户态和内核态之间切换,因此该模型的缺点是上下文切换很慢,而且每创建一个用户线程就需要创建一个内核线程,因此可以创建的用户线程数量也会受限制。 在该模型下,一个用户线程执行阻塞系统调用时,能够允许其他用户线程继续执行,多个用户线程也可以并行的运行在多核系统上。使用此模型的编程语言有Java。 M:N模型: 多个用户空间线程运行在多个内核空间线程上。M:N模型综合了N:1和1:1模型的优点,多路复用多个用户空间线程到一定数量的内核空间线程。这种模型的缺点是调度实现起来十分复杂。Go采用的这种模型,用户空间线程在Go中对应的是Goroutine。 Goroutine调度器和G-M-P模型 在Go中用户线程的调度和生命周期管理都是用户层面的,由Go语言自己实现,不依赖OS系统调用,减少系统资源消耗。 Go实现了一个自己的运行时调度器用于调度Goroutine(轻量级的用户空间线程)。

#Go

Go语言使用常量和iota模拟枚举类型

模拟枚举类型 go语言中虽然没有Java, C++等一些高级语言提供的枚举类型特性,但可以使用常量和iota来模拟。 例如: // BuildResult 构建结果 type BuildResult int const ( // Success 成功 Success BuildResult = iota // Fail 失败 Fail // Abort 中断 Abort ) var buildResult = Success println(buildResult) // 0 使用go generate和stringer生成String() string函数 为了打印枚举类型值具体的字符串标识,可以使用https://godoc.org/golang.org/x/tools/cmd/stringer工具并结合go generate为枚举类型生成func (t T) String() string函数。这样枚举类型就实现了fmt.Stringer接口。具体的实现方式是在枚举类型BuildResult的定义上加上注释//go:generate stringer -type=BuildResult: