惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
云风的 BLOG
云风的 BLOG
小众软件
小众软件
雷峰网
雷峰网
博客园 - 【当耐特】
V
V2EX
WordPress大学
WordPress大学
IT之家
IT之家
Last Week in AI
Last Week in AI
罗磊的独立博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
The Cloudflare Blog
Jina AI
Jina AI
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19)
Jenkins X 不是 Jenkins ,而是一个技术栈
微信公众号 · 2020-08-16 · via 陈少文的网站

1. Jenkins X 简介

Jenkins 依靠庞大的插件生态,占据了目前大部分的企业级 CICD 引擎的份额。但在云原生时代,Jenkins 也暴露出很多的问题,单点服务、磁盘存储、内存占用等。

Jenkins X 围绕 Kubernetes,提供了一种更适合云原生时代的 DevOps 方式。Jenkins X 不是 Jenkins 的发行版本,准确来说,Jenkins X 是一个应用发布部署的技术栈。

在研发方面,通过 jx 命令,开发者可以新建仓库、生成应用脚手架、运行流水线、发布部署,最终运行在 Kubernetes 上。Jenkins X 给开发者提供了非常一致的开发体验。

在部署方面,通过 Terraform 提供的能力,可以在主流云厂商上直接创建集群。除此,Jenkins X Environment 还提供了对多环境的支持,通过定义环境之间的升级规则,各个环境上的应用可以很方便地进行发布、回滚、迁移。Jenkins X 给运维人员带来了极大便利。

一句话,Jenkins X 是面向云原生的一站式 DevOps 技术栈。

2. 架构和原理

设计架构:

概念模型:

上面两张图来自 Jenkins X 官网,通过这两张图可以很快了解 Jenkins X 在做什么,想做什么。Jenkins X 针对的是多环境多版本的多人团队,提供基于 Kubernetes 的应用开发、部署服务。

下面这张图提供了相关组件的概览:

GitOps - 通过 Git 提交变更、使用 PR 进行授权的资源管理思想。

数据存储 - Git Repo。GitOps 驱动着 Jenkins X 。Jenkins X 对基础设施、配置、应用的所有变更,都记录在 Git Repo 中。当有 Git 事件发生时,触发 Jenkins X 执行。Jenkins X 只需要关注 Webhook 事件,仅当有 Git 事件发生时,才会动态创建 Pod 执行相应动作。

事件驱动 - Prow/Lighthouse 。Kubernetes 使用 Prow 用于 ChatOps ,通过标签语义,可以驱动研发流程。但 Prow 严重依赖于 Github ,很难对其他 SCM 进行扩展,为此产生了 Lighthouse 项目。

应用开发 - Draft/Skaffold 。针对开发者,在 Kubernetes 上开发云原生应用的工具。通过 Draft/Skaffold 完成对应用的初始化、部署,开发者可以很方便地迭代应用代码,在本地或远程 Kubernetes 集群中进行验证。

发布管理 - Helm 。一款对 Kubernetes 应用进行管理的工具,类似 CentOS 上的 Yum ,Ubuntu 上的 Apt 。使用 Helm 可以实现对应用的部署、升级、回退、删除操作。

流程编排 - Jenkins/Tekton/Knative 。Tekton 通过 Kubernetes CRD 定义流水线的 CICD 系统。在旧的版本中,可以使用 Jenkins 作为编排引擎,但是 Jenkins X 从今年 3 月份开始已经转向 Tekton 。Tekton 是 Knative 的 build-pipeline 项目前身。Knative 提供了对任务的处理和管理能力。

包管理仓库 - Nexus 。支持许多主流的软件包格式,Docker、npm、Yum、Maven 等。

3. 在 Kubernetes 上安装 Jenkins X

通过 jx create cluster 命令,使用 Terraform 可以直接创建集群,将集群作为配置信息进行管理。

最新的 Jenkins X (2.1.132)推荐使用 jx boot 命令进行安装,支持 GKE,EKS ,其他 Kubernetes 需要自行检查兼容性。这里是 Jenkins X on Kubernetes 兼容性对照表。我在自建的集群上尝试了下,坑还比较多,可以再等等,或者给社区提交 PR 。下面使用 jx install 命令进行安装。

3.1 安装要求

  • Kubernetes 版本 > 1.8
1
2
3
4
kubectl version

Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.13", GitCommit:"39a145ca3413079bcb9c80846488786fed5fe1cb", GitTreeState:"clean", BuildDate:"2020-07-15T16:18:19Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.13", GitCommit:"39a145ca3413079bcb9c80846488786fed5fe1cb", GitTreeState:"clean", BuildDate:"2020-07-15T16:10:14Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
  • 确认开启 RBAC
1
2
3
kubectl cluster-info dump | grep authorization-mode

                            "--authorization-mode=Node,RBAC",
  • 配置有默认的 Storage Class
1
2
3
4
kubectl get sc

NAME              PROVISIONER        AGE
local (default)   openebs.io/local   2m
  • 集群 Master 节点 CPU 最少 4 C

3.2 安装 jx、Git 客户端

  • 安装 Jenkins X 客户端

这里没有使用 2.x 的版本,而是使用的最后一个 1.x 版本。在后面的文档中,我会继续关注相关的演变。

1
2
curl -L https://github.com/jenkins-x/jx/releases/download/v1.3.1119/jx-linux-amd64.tar.gz | tar xzv
mv jx /usr/local/bin

查看版本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
jx version

NAME               VERSION
jx                 1.3.1119
jenkins x platform 2.0.2375
Kubernetes cluster v1.16.13
kubectl            v1.16.13
helm client        v2.16.10+gbceca24
helm server        v2.16.10+gbceca24
git                git version 2.24.1
Operating System   CentOS Linux release 7.6.1810 (Core)
  • 安装 Git 2.x

如果使用 Git 1.x 的版本,可能会遇到类似下面的错误:

1
FATAL: initialise build packs failed: there was a problem ensuring the branch master has tracking info: git output: error: pathspec 'master' did not match any file(s) known to git.: failed to run 'git checkout master' command in directory '/root/.jx/draft/packs/github.com/jenkins-x-buildpacks/jenkins-x-kubernetes', output: 'error

解决办法是,进入提示目录,手工拉取。

1
2
cd /root/.jx/draft/packs/github.com/jenkins-x-buildpacks/jenkins-x-kubernetes
git pull

更好的方法是,升级 Git 的版本至 2.x ,下面以 CentOS 7 为例:

1
2
3
4
5
6
yum remove git*
yum -y install https://packages.endpoint.com/rhel/7/os/x86_64/endpoint-repo-1.7-1.x86_64.rpm
yum install -y git
git version

git version 2.24.1

3.3 测试集群是否满足要求

在安装完 jx 命令之后,可以使用下面的命令进行检测:

大约需要运行几十分钟,运行下面的命令可以看到最终的执行结果:

最后删掉相关负载:

3.4 安装 Jenkins X 服务端

Jenkins X 内置的服务组件依赖 Ingress ,可以根据文档 使用 Helm 安装 Ingress 提前安装。

  • 开始安装

接着会有一系列交互:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
? Cloud Provider kubernetes
...
> [x]  helm
  [x]  kubectl
...
? Please enter the name you wish to use with git:  shaowenchen
? Please enter the email address you wish to use with git:  mail@chenshaowen.com
...
? Would you like wait and resolve this address to an IP address and use it for the domain? Yes
...
? Domain dev.chenshaowen.com
...
? github.com username: shaowenchen
...
Please click this URL and generate a token
https://github.com/settings/tokens/new?scopes=repo,read:user,read:org,user:email,write:repo_hook,delete_repo

? API Token: *****************************************
? Select Jenkins installation type: Serverless Jenkins
? Pick default workload build pack:  Kubernetes Workloads: Automated CI+CD with GitOps Promotion
Jenkins X installation completed successfully
INFO[0094]

	********************************************************

	     NOTE: Your admin password is: Sr5!8LZz!QfMD84KBZWR

	********************************************************
  • 设置 Ingress Controller

如果使用 Jenkins X 提供的 Ingress Controller 则需要提供 LB 或者手工增加 externalIPs 。下面将 externalIPs 设置为机器 eth0 的 IP ,绑定 EIP 之后,将域名解析到 EIP 即可访问服务。

1
2
3
4
5
kubectl -n kube-system edit svc jxing-nginx-ingress-controller

spec:
  externalIPs:
  - 192.168.13.74
  • 查看服务
1
2
3
4
5
6
kubectl get ingress -n jx

NAME              HOSTS                                    ADDRESS         PORTS   AGE
chartmuseum       chartmuseum.jx.dev.chenshaowen.com       192.168.13.74   80      2m
docker-registry   docker-registry.jx.dev.chenshaowen.com   192.168.13.74   80      2m
nexus             nexus.jx.dev.chenshaowen.com             192.168.13.74   80      2m

如果没有可控的公网域名,在安装过程中,可以选择 nip.io 提供的域名,通过本地配置 hosts 进行访问:

1
2
3
x.x.x.x chartmuseum.jx.192.168.13.74.nip.io
x.x.x.x docker-registry.jx.192.168.13.74.nip.io
x.x.x.x nexus.jx.192.168.13.74.nip.io

3.6 安装插件

Jenkins X 通过 Helm Chart 管理插件和应用,在 jenkinx-x/jx 仓库中可以查看已经集成的插件。通过 jx 命令,可以很方便地安装相关的插件,下面是部分插件列表。

  • ambassador - Create an ambassador addon
  • anchore - Create the Anchore addon for verifying container images
  • environment - Create an Environment Controller to handle webhooks and promote changes from GitOps
  • flagger - Create the Flagger addon for Canary deployments
  • gitea - Create a Gitea addon for hosting Git repositories
  • gloo - Create a Gloo and Knative Serve addon for creating serverless applications
  • ingress - Create an Ingress Controller to expose services outside of your remote Staging/Production cluster
  • istio - Create the Istio addon for service mesh
  • kubeless - Create a kubeless addon for hosting Git repositories
  • owasp-zap - Create the OWASP Zed Attack Proxy addon for dynamic security checks against running apps
  • pipeline-events - Create the pipeline events addon
  • prometheus - Creates a prometheus addon
  • prow - Create a Prow addon

这里安装 Prow 用于 ChatOps

1
jx create addon prow -n jx
1
2
3
4
5
6
7
8
9
kubectl get ingress -n jx

NAME                HOSTS                                      ADDRESS         PORTS   AGE
chartmuseum         chartmuseum.jx.dev.chenshaowen.com         192.168.13.74   80      2m
deck                deck.jx.dev.chenshaowen.com                192.168.13.74   80      2m
docker-registry     docker-registry.jx.dev.chenshaowen.com     192.168.13.74   80      2m
hook                hook.jx.dev.chenshaowen.com                192.168.13.74   80      2m
nexus               nexus.jx.dev.chenshaowen.com               192.168.13.74   80      2m
tide                tide.jx.dev.chenshaowen.com                192.168.13.74   80      2m

3.5 卸载 Jenkins X

1
2
jx uninstall
rm -rf /root/.jx

4. Jenkins X 使用

4.1 环境管理

  • 查看环境
1
2
3
4
5
6
jx get env

NAME       LABEL       KIND        PROMOTE NAMESPACE     ORDER CLUSTER SOURCE                                                             REF PR
dev        Development Development Never   jx            0
staging    Staging     Permanent   Auto    jx-staging    100           https://github.com/shaowenchen/environment-antdisco-staging.git
production Production  Permanent   Manual  jx-production 200           https://github.com/shaowenchen/environment-antdisco-production.git

Jenkins X 在 Git Repo 中对基础设置进行存储,通过 PR 进行修改管理。

  • 删除环境
  • 创建环境

4.2 应用开发

  • 创建应用
1
2
3
4
5
6
7
8
jx create quickstart

? Do you wish to use shaowenchen as the Git user name? Yes
? Which organisation do you want to use? shaowenchen
? Enter the new repository name:  jx-quickstart-demo
? select the quickstart you wish to create jx-quickstart-demo
INFO[0035] Pushed Git repository to https://github.com/shaowenchen/jx-quickstart-demo
INFO[0051] Creating GitHub webhook for shaowenchen/jx-quickstart-demo for url http://hook.jx.dev.chenshaowen.com/hook

也可以直接从线上或者本地导入应用

1
jx import --url https://github.com/shaowenchen/jx-quickstart-demo.git

在页面上可以看到初始化的仓库和 Webhook 配置信息。

5. 参考