定制开发kubernetes流程
概述
本文介绍如何对kubernetes进行二次开发,仓库如何管理,git分支如何管理,怎样利用CI去编译与发布以及如何给社区贡献代码等,结合实际例子,望对大家有所帮助。
开发环境构建
Fork
把github.com/kubernetes/kubernetes 项目fork到自己的仓库
Clone到本地
git clone https://github.com/<your-username>/kubernetes
设置remote
git remote add upstream https://github.com/kubernetes/kubernetes.git
git remote set-url --push upstream no-pushing
注意此时你的本地仓库就有了两个远程仓库,一个叫upstream(社区仓库) 一个叫origin(你fork的)
代码同步
当社区仓库代码更新时,我们希望与之同步,那么:
git pull upstream master # 先同步到本地
git push # push 到origin
你修改了代码希望同步给社区,那么PR即可
分支管理
假设我们要定制一个功能,比如我之前做的对kubelet进行lxcfs增强,而我们线上又运行了多个版本的k8s,我们希望这个特性几个版本都可以加上,而且未来k8s发布新版本时同样能merge进去这功能。
要做到这个git里的两个命令非常重要:
- git cherry-pick 能指定merge特定的变更
- git rebase 通常我用来合并多个commit, 虽然cherry-pick也支持多个commit,但是多了容易混乱
首先从master分支HEAD切出一个分支,我们有所的功能开发在这个分支上进行,如我做了c1 c2两次commit。
然后希望把这个功能merge到2.0版本中,我们先从2.0的tag切一个分支出来,然后在这个分之上去cherry-pick c1 c2即可,非常简单方便,其它版本需要此功能同理。
这里注意,如果不用cherry-pick 直接merge的话,因为2.0版本之后还有很多次变更,会产生大量冲突。
CI编译与发布
笔者比较喜欢drone,所以编译与发布都是用的drone,安利个drone免费公有服务非常好用
由于k8s各个版本可能需要的golang版本都不太一样,所以最方便的还是在容器中进行构建,但并不是随便一个golang的镜像都可以进行构建,因为k8s还需要拷贝代码,生成代码等依赖了一些小工具,我这里提供了一个官方的编译镜像:fanux/kube-build:v1.12.1-2
发布时用了drone一个非常方便的插件:plugins/github-release, 可以直接把二进制文件放到github的release pages里
.drone.yml 长这样:
kind: pipeline
name: default
workspace:
base: /go
path: src/k8s.io/kubernetes # 要注意工作目录一定要写这个
steps:
- name: build # 编译,名字随便写
image: fanux/kube-build:v1.12.1-2
environment:
GO111MODULE: on # 启动go mod
commands:
- make generated_files UPDATE_API_KNOWN_VIOLATIONS=true # 这个是一个known api校验,不加编译可能会报错
- KUBE_GIT_TREE_STATE="clean" KUBE_GIT_VERSION=v1.14.0 KUBE_BUILD_PLATFORMS=linux/amd64 make all WHAT=cmd/kubelet GOFLAGS=-v # 几个环境变量特别重要,如不加clean编译出来版本号就会加dirty后缀,需要加版本号不然很多时候无法正常工作,加构建平台,这样无需编译多个bin文件加快编译速度,WHAT里指定需要编译什么代码,大部分情况无需编译有所组件
- ls _output/bin/ # 这里能看到编译后的二进制文件
- name: publish
image: plugins/github-release
settings:
api_key:
from_secret: git-release-token
files: _output/bin/kubelet # 把上一步二进制文件放到release page中
title: ${DRONE_TAG} # 使用你打的tag作为标题
note: Note.md # 指定一个文件说明你release中干了啥
when:
event: tag
这样提交代码后刷刷抖音等结果即可。。
实践案例
k8s kubeadm默认证书的时间是一年,我希望延长到99年,这样就需要定制化开发,那么问题来了,因为版本众多,是不是需要每个版本都去改一下,那太麻烦了,正确的做法如下:
从master切出一个分支
git checkout -b kubeadm
修改代码并commit
commit 6d16c60ca5ce8858feeabca7a3a18d59e642ac3f (HEAD -> kubeadm)
Author: fanux <fhtjob@hotmail.com>
Date: Mon Mar 18 20:26:08 2019 +0800
kubeadm with long cert
commit 364b18cb9ef1e8da2cf09f33d0fd8042de6b327e (upstream/master, origin/master, origin/HEAD, master)
可以看到我们commit了一次,现在只需要把6d16c60ca这个变化merge到各版本即可
merge到1.13.4版本中
git checkout -b v1.13.4 v1.13.4
git cherry-pick 6d16c60ca5c
注意 这次commit如果修改了相同文件的行还是可能会冲突的,需要手动解决一下冲突
解决完冲突commit即可
➜ kubernetes git:(v1.13.4) ✗ git add .
➜ kubernetes git:(v1.13.4) ✗ git commit -m "v1.13.4-cert"
[v1.13.4 1bd2e627f5] v1.13.4-cert
Date: Mon Mar 18 20:26:08 2019 +0800
4 files changed, 42 insertions(+), 3 deletions(-)
create mode 100644 .drone.yml
create mode 100644 Note.md
➜ kubernetes git:(v1.13.4) git tag v1.13.4-cert
➜ kubernetes git:(v1.13.4) git push --tags
其它注意事项
要PR给社区的话需要CLA认证一下, 不然你的PR社区是不管的。
CI加的一些文件如.drone.yml dockerfile等与实际功能的添加最好分开,方便PR时只PR实际需要的代码。
其它组件与apiserver scheduler可以CI直接打成docker镜像,drone很灵活,不要用死了
扫码关注sealyun
探讨可加QQ群:98488045
定制开发kubernetes流程的更多相关文章
- 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司
一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...
- 使用SharePoint Designer定制开发员工工作日志系统实例!
昨天已介绍了一篇<使用SharePoint Designer定制开发专家库系统实例!>,今天继续来介绍使用SharePoint Designer定制开发员工工作日志系统实例,主要功能包括填 ...
- 【OpenStack】OpenStack系列14之Dashboard定制开发
django概述 参考资料:http://blog.javachen.com/2014/01/11/how-to-create-a-django-site.html http://djangobook ...
- 甘特图生产排程(APS)定制开发
高速开发完毕APS的数据可视化.订单展示.资源调度.智能排程等差点儿所有功能模块. 自己主动智能排程功能 提供专业需求分析师及开发团队,按需开发"全自己主动智能排程"这一APS的主 ...
- 使用SharePoint Designer定制开发专家库系统实例!
将近大半年都没有更新博客了,趁这段时间不忙,后续会继续分享一些技术和实际应用.对于Sharepoint的定制开发有很多种方式,对于一般的应用系统,可以使用Sharepoint本身自带的功能,如列表作为 ...
- EClipse开发NDK流程
EClipse开发NDK流程(现在studio也在2.2之后支持了非常简单,只要创建项目的时候勾选c++支持就可以了) 什么情况下使用ndk,1.保护代码,java很容易反编译,c/c++反汇编比 ...
- 不可或缺的企业OA面临问题,以及解决建议 软件定制开发 森普演示平台
---恢复内容开始--- 随着信息时代的来临,企业管理也相应的信息化,各种管理软件相继而出,各行各业的信息化有过成功,也有过失败(注:是以该项目是否达到用户的预期目标而言).据统计在信息化失败的案例中 ...
- 模拟IC芯片设计开发的流程
模拟IC芯片设计开发的流程 IC的设计,模拟和数字, 还有混合IC, 在设计方法, 注意点, 工具等有明显的区别, 我主要以模拟无线接收IC系统设计为例说明. 一个IC芯片的设计开发大致包括如下步骤. ...
- git开发部署流程
git的分支操作 https://blog.csdn.net/QH_JAVA/article/details/77853605 Git 开发部署流程 采用业界成熟方案 Git Flow 分支方式进行开 ...
随机推荐
- Charles抓包工具_基本功能
一. 安装及破解 1. 安装: 下载地址:http://www.charlesproxy.com/download/,然后进行安装: 2. 破解: 将补丁文件charles.jar复制到安装目录并替换 ...
- 半小时学会V语言
半小时学会V语言 1. V语言简介 V是一个静态类型.编译型的编程语言,目标是构建可维护软件.与Go语言相似,并受Oberon,Rust和Swift语言影响.V语言非常简单,只需要半小时就能学会这门语 ...
- Python中的函数及函数参数的使用
函数:一个工具,随调随用 降级代码冗余 增加代码的复用性,提高开发效率,为了不成为cv战士 提高程序扩展性 函数有两个阶段:定义阶段,调用阶段. 定义时:只检查函数体内代码语法,不执行函数体内代码. ...
- 浅说——状压DP
第一次没认真听,没听懂.(有点难) 第二次才搞懂,主要位运算太烦了!!! 位运算基础知识: 名称 符号 规则 按位与 & 全一则一,否则为零 按位或 | 有一则一,否则为零 按位取反 ~ 是零 ...
- 使Toast弹出不重叠的封装
一.问题 在频繁弹出toast的时候,弹出后出现延迟重叠的现象. 二.解决 Toast通常由makeTextT()方法实例化,如何不想要toast弹出时重叠,那么只需在应用中保持一个Toast对象即可 ...
- 玲珑OJ 1082:XJT Loves Boggle(爆搜)
http://www.ifrog.cc/acm/problem/1082 题意:给出的单词要在3*3矩阵里面相邻连续(相邻包括对角),如果不行就输出0,如果可行就输出对应长度的分数. 思路:爆搜,但是 ...
- Dokcer基础使用总结(Dockerfile、Compose、Swarm)
Dokcer基础 查看Linux版本 uname -r 查看Linux详尽信息 cat /etc/*elease CentOS Linux release (Core) NAME="Cent ...
- TPL DataFlow .Net 数据流组件,了解一下
回顾上文 作为单体程序,依赖的第三方服务虽不多,但是2C的程序还是有不少内容可讲: 作为一个常规互联网系统,无外乎就是接受请求.处理请求,输出响应. 由于业务渐渐增长,数据处理的过程会越来越复杂和冗长 ...
- NioEventLoopGroup初始化
本文是我对Netty的NioEventLoopGroup及NioEventLoop初始化工作的源码阅读笔记, 如下图,是Netty的Reactor线程模型图,本文描述NioEventLoopGroup ...
- Linux 文件系统的基本结构
Linux文件系统为一个倒置的树状结构,所有文件或文件夹均包含在一个根目录/中. Linux系统严格区分大小写所以在Linux中:一个名为“A”的文件夹和一个名为“a”的文件夹是不同的两个文件夹,这点 ...