📅 2019-04-09
1.kubectl插件机制简介
#
kubectl插件机制在Kubernetes 1.14宣布稳定,进入GA状态。kubectl的插件机制就是希望允许开发者以独立的二进制形式发布自定义的kubectl子命令。
kubectl插件可以使用任意语言开发,如可以是一个bash、python的脚本,也可以是其他语言开发编译的二进制可执行文件,只要最终将脚本或二进制可执行文件以kubectl-
的前缀放到PATH
中即可。使用kubectl plugin list
可以在PATH
中查看有哪些插件。
...📅 2019-04-05
kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践。
...📅 2019-03-14
前面我们使用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功能的时候,就会用到第三方库了。
...📅 2019-03-13
Jenkins Shared Libraries是一种扩展Jenkins Pipeline的技术,通过编写Shared Libraries可以实现自定义的Steps,将流水线逻辑中重复或共通的部分进行抽象和封装。
实践中每个DevOps团队都应该通过维护一个或多个Shared Libraries项目再结合第三方的Jenkins插件定制团队自己的Jenkins流水线。
...📅 2019-03-12
Go Modules是Go 1.11引入的,为了解决Go项目的依赖问题。从go 1.16开始,go modules开始成为Go默认的包依赖管理工具。
go moudle是一组go package的集合
#
一个Go Module实际上是由一组Go的Package的集合。
构建Go Module的过程需要先确定依赖的其他Go Module的版本、编译包、将编译的目标文件链接到一起。
...📅 2019-03-08
Kubernetes集群内部是一套单独的网络,与外部网络相隔离,Kubernetes提供了NodePort、LoadBalancer、Ingress等方式用于将集群内部的Service暴露到集群外部,
但这些方式都更适用于将边缘服务暴露出去。例如,一个产品由很多微服务组成,这些微服务大多数都是内部服务,只有少数作为边缘服务需要暴露到集群外部供用户使用。
而开发人员是存在从Kubernetes外部访问和调试这些内部服务的需求的,尤其是针对测试环境的Kubernetes集群,这个需求更加必要。针对这个需求,有以下两种实现方式:
...📅 2019-02-12
三种多线程模型
#
操作系统的线程由内核的线程调度器负责调度,不同的编程语言对内核线程的封装不同,有以下三个模型:
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(轻量级的用户空间线程)。
...📅 2019-02-10
模拟枚举类型
#
go语言中虽然没有Java, C++等一些高级语言提供的枚举类型特性,但可以使用常量和iota来模拟。
例如:
1// BuildResult 构建结果
2type BuildResult int
3
4const (
5 // Success 成功
6 Success BuildResult = iota
7 // Fail 失败
8 Fail
9 // Abort 中断
10 Abort
11)
1var buildResult = Success
2println(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
:
...📅 2019-02-04
Spring Boot Gradle Plugin简介
#
Spring Boot Gradle Plugin提供了Gradle构建工具对Spring Boot的支持,使用它不仅可以完成Spring Boot项目的打包(executable jar or distribution tar)、运行,还可以使用spring-boot-dependencies
提供的依赖管理功能。
...📅 2019-02-03
Lombok其实和Spring Boot关系不太大,只是这个工具太好用了,这里也整理记录一下。
Lombok是一个Java库可以与Java IDE(ItelliJ IDEA、Eclipse)和构建工具(Gradle、Maven)集成,帮助开发人员消除臃肿的Java代码,尤其是对于Java POJO类,使用Lombok后将不再需要我们去编写getter、setter、equals、hashcode等方案,Lombok通过注解实现这一目标。
...