Tekton 问题排查和 github 社区

Tekton 问题排查和 github 社区

Tekton 是一个 kubernetes 源生的 CICD 工具,本质上是 kubernetes Operator 的一种实现方式。使用了基于角色的访问控制 ( Role-based access control,RBAC ) 的一种以角色为基础的访问控制模型 ,和自定义资源(CustomResourceDefinition,CRD)允许对Kubernetes API 的扩展。

基本原理

[root@node1 ~]# kubectl get pod -n tekton-pipelines
NAME                                          READY   STATUS    RESTARTS   AGE
tekton-dashboard-68d675b654-gj66x             1/1     Running   1          17d
tekton-pipelines-controller-d69766ddd-q4zw9   1/1     Running   1          19d
tekton-pipelines-webhook-64b4998468-wrwq9     1/1     Running   0          4d1h

在这里 的 pod 也就是之前说的 Operator 的概念。dashboard 应该不会用上,应该直接操作 k8s API 就可以了。controller 用来监听上述CRD的事件,执行Tekton的各种CI/CD逻辑,一个webhook用于触发后创建CRD资源。

Tekton 中自定义了几种 CRD ,分别可以对应 jenkins 里面的一些对象

Tekton jenkins 描述
PipelineResource Build with Parameters 也就是需要传入的参数
Pipeline Pipeline 也就是一个流水线,流水线中定义的变量就是PipelineResource 传入的参数,通过改变变量来运行不同的 Pipeline,流水线中可以定义多个不同的阶段
PipelineRun 执行一次Pipeline 相当于执行一次流水线
Task Pipeline 的 Stage 也就是流水线的一个阶段的定义,重新在一个新的 pod 里执行
TaskRun 执行一次Pipeline 的其中一个 Stage 一般而言会执行一次流水线,也可以单独执行流水线的某个阶段

排查问题

本周,在使用 Tekton 的时候,遇到了一个严重的问题。也就是在使用 Tekton 的 pipelineRun 的时候,会突然创建出一堆无用的 PVC 。而这些 PVC 自动地绑定了 PV 资源,造成了一些影响。

经过 google 和 github 的搜索,我发现了有人在一个 issues 中提到了类似的问题,和我遇到的问题大致相似。

Tekton Creates PVC unnecessarily if volumes are defined

太长不看系列,基本来说就是在第一次关闭这个 issues 之后,发现问题并没有解决,又重新打开了这个 issues 。然后在一个新的 issues 里进行了讨论

Pipeline Resources Redesign

之后在这个 PR 提交并修复了这个问题

Only make a PVC for a PipelineRun if we need to

如果看相关提交,可以看见是加入了一个判断参数,修复了这个问题

而这次 PR 合并的日期是 2019年 11 月 13 日,然后我发现我使用的 tekton 版本在这个时间点之前,然后就升级了一下 tekton 版本,解决了这个问题。

github 贡献

顺带一提,如何对 github 上的开源项目贡献

一般来说,不同的社区的贡献规则是大同小异的,具体的需要看各社区的文档

以 kubernetes 社区为例

https://kubernetes.io/zh/docs/contribute/start/

太长不看系列

事实上,一般来说,如果发现了大型项目的代码存在 bug 或问题,应该先 fork 一份到自己仓库,拉出一个专门的分支,或者直接用 master 也行 ,然后 commit 提交代码,给原项目提出 PR

需要注意的是 礼貌沟通和认真阐述问题是一切贡献的前提,特别是这种国际化的项目,一定要用英语交流 (即使是国人的项目,之前我提 issues ,也是可以看出对方是中国人,但是也用英语交流)

提交之后,一般会再讨论一下,然后就是 review 过程了

这里写一下常用的交流命令

这个时候就会有人来 review 代码

这里可以看到相关的人

https://github.com/kubernetes/kubernetes/blob/master/.github/OWNERS

然后就是投票了,不同的社区设置不一样,有的需要一个人同意,有的需要多人同意(之前我就有一次特别尴尬的 PR ,我看到项目的创始人同意了我的 PR,然后我就把这个 PR 关了,事实上代码并没有合并进去,那个项目需要多人同意才行,我就重新打开了这个 PR ,然后等另外个人同意了,代码才合并了进去)

review 正式通过了,代码就合并进去了,一般来说 reviewer 会打出 /lgtm

如果合并代码经过讨论有需要修改的地方,这个时候可以需要保持仍然是一个 commit 提交,但是补充代码需要再做一次 commit 提交,需要将这两次 commit 合并,需要使用 git 命令

git rebase -i HEAD~2

将两次 commit 合并,这里会打开一个 vi 界面

pick 3ca6ec3   'commit desc...'

pick 1b40566   'commit desc...'

除了第一个 pick ,将后面的 pick 改成 squash , 合并2个以上的 commit 同理

git push -f

push 后,新的提交就在原有的 PR 上 force push 过去了,没必要开一个新 PR