如何在 Kubernetes 上配置 Jenkins?

百家 作者:CSDN 2020-06-28 15:43:03


作者 |?Sudip Sengupta

译者 | 火火酱,责编 | Carol

封图 | CSDN 下载自视觉中国


在本文中,我们将一起完成在Kubernetes上配置Jenkins的工作。作为一款被广泛使用的开源CI服务器,Jenkins提供了数百个插件,能够为我们项目的构建、部署和自动化提供有力支持。

接下来,我们将:

1.使用minikube创建一个Kubernetes集群(这步不是必须的,如果你已经有Kubernetes集群了的话,可以跳过这一步)。
2.为Jenkins创建命名空间和持久卷。
3.使用Helm安装Jenkins。
4.设置并运行pipeline,对一个简单的web应用程序进行测试。
先决条件
1.Docker。有关安装Docker的详细信息,请参阅下方“Docker安装”页面。
https://docs.docker.com/get-docker/
2.Kubernetes集群。如果没有运行中的Kubernetes集群的话,请参阅章节“使用minikube创建Kubernetes集群”
3.HelmCLI。可以按照下方链接中的步骤安装Helm CLI。
https://helm.sh/docs/intro/install/?ref=hackernoon.com


用minikube创建一个Kubernetes集群(可选)



Minikube是一款在计算机上创建单节点Kubernetes集群的工具。如果没有Kubernetes集群的话,可以按照以下步骤进行创建:


1.??安装minikube?:请参照下方“ Install minikube”页面中的步骤进行安装。https://kubernetes.io/docs/tasks/tools/install-minikube/?ref=hackernoon.com

2.??安装kubectl:请参照下方“Install and Set Up kubectl ”页面中的步骤进行安装。

https://kubernetes.io/docs/tasks/tools/install-kubectl/?ref=hackernoon.com

3.??然后就可以输入以下命令,创建minikube集群

minikube?start
??minikube?v1.5.2?on?Darwin?10.15.2
??Automatically?selected?the?'hyperkit'?driver?(alternates:?[virtualbox])
??Creating?hyperkit?VM?(CPUs=2,?Memory=2000MB,?Disk=20000MB)?...
??Preparing?Kubernetes?v1.16.2?on?Docker?'18.09.9'?...
??Pulling?images?...
??Launching?Kubernetes?...
??Waiting?for:?apiserver
??Done!?kubectl?is?now?configured?to?use?"minikube"


4. ?创建完集群后,可以输入以下代码来验证其状态:
minikube?status

如果一切顺利的话,应该会看到:

host:?Running
kubelet:?Running
apiserver:?Running
kubeconfig:?Configured


我们还可以通过使用内置的Kubernetes用户界面来了解集群概况:运行以下命令:

minikube?dashboard
Verifying?dashboard?health?...
??Launching?proxy?...
??Verifying?proxy?health?...
??Opening?http://127.0.0.1:56993/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/?in?your?default?browser...


打开的网页中包含了Kubernetes集群的状态信息:

? ? ? ?

我们还可以使用仪表盘(dashboard)与Kubernetes集群进行交互。但是,这就有点超纲了。如果想要了解更多如何使用Kubernetes仪表盘创建或修改Kubernetes资源的信息,可以看看下方“ Web UI (Dashboard)”链接。

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/?ref=hackernoon.com


为Jenkins做好准备


按照以下步骤设置Jenkins:

  • 创建一个命名空间,从而在Kubernetes集群中将Jenkins与其他部署分离开。

  • 创建PersistentVolume以存储Jenkins数据,方便我们在重新启动时保留数据。

按照以下步骤为Jenkins设置好部署环境:

1. 运行以下命令,创建一个名为jenkins-namespace.yaml的文件:


apiVersion:?v1
kind:?Namespace
metadata:
??name:?jenkins

2. 输入以下命令以规范应用:

kubectl?apply?-f?jenkins-namespace.yaml
namespace/jenkins?created

3. 将以下代码粘贴到jenkins-volume.yaml文件中:

apiVersion:?v1
kind:?PersistentVolume
metadata:
??name:?jenkins-pv
??namespace:?jenkins
spec:
??storageClassName:?jenkins-pv
??accessModes:
????-?ReadWriteOnce
??capacity:
????storage:?10Gi
??persistentVolumeReclaimPolicy:?Retain
??hostPath:
????path:?/data/jenkins-volume/


4.输入以下命令以规范应用:
kubectl?apply?-f?jenkins.volume.yaml


需要注意的是,hostPath使用节点/data/jenkins-volume/来模拟附属网络存储。这种方法只适合于开发和测试阶段。在生产阶段,需要提供网络资源(如Google Compute Engine持久盘,或Amazon Elastic Block Store卷)。


安装Jenkins


Jenkins部署通常由一个主节点和一个或多个代理节点(可选)组成。Jenkins是一个依赖于多个组件的复杂应用程序,我们可以通过Helm来简化Jenkins部署。
(Helm:https://helm.sh/?ref=hackernoon.com)
Helm是Kubernetes的一个包管理器,其打包格式被称为chart。在GitHub上能够找到许多社区开发的chart。
(GitHub:https://github.com/helm/charts?ref=hackernoon.com)
1. ?创建一个覆盖文件,并将其作为实参传给Helm CLI。将 https://raw.githubusercontent.com/kubernetes/charts/master/stable/jenkins/values.yaml中的内容粘贴到values.yaml文件中。
然后在你喜欢的文本编辑器中打开values.yaml文件,将以下行:
storageClass:

修改为:

storageClass:?jenkins-pv


2.??现在,我们可以通过运行helm install命令来安装Jenkins,并传递以下参数:

helm?install?jenkins?-f?values.yaml?stable/jenkins?--namespace?jenkins


会得到类似以下输出:


NAME:?jenkins
LAST?DEPLOYED:?Mon?Dec?30?17:26:08?2019
NAMESPACE:?jenkins
STATUS:?deployed
REVISION:?1
NOTES:
1.?Get?your?'admin'?user?password?by?running:
??printf?$(kubectl?get?secret?--namespace?jenkins?jenkins?-o?jsonpath="{.data.jenkins-admin-password}"?|?base64?--decode);echo
2.?Get?the?Jenkins?URL?to?visit?by?running?these?commands?in?the?same?shell:
??export?POD_NAME=$(kubectl?get?pods?--namespace?jenkins?-l?"app.kubernetes.io/component=jenkins-master"?-l?"app.kubernetes.io/instance=jenkins"?-o?jsonpath="{.items[0].metadata.name}")
??echo?http://127.0.0.1:8080
??kubectl?--namespace?jenkins?port-forward?$POD_NAME?8080:8080
3.?Login?with?the?password?from?step?1?and?the?username:?admin


3.??根据你环境的不同,Jenkins可能需要一定时间才能完成初始化,输入以下命令来检查Pod状态:

kubectl?get?pods?--namespace=jenkins

Jenkins安装后,状态应像以下输出这样为Running

??kubectl?get?pods?--namespace=jenkins
NAME??????????????????????READY???STATUS????RESTARTS???AGE
jenkins-645fbf58d6-6xfvj???1/1?????Running???0??????????2m

4.??需要通过以下命令检索密码,才可以访问Jenkins服务器:
printf?$(kubectl?get?secret?--namespace?jenkins?jenkins?-o?jsonpath="{.data.jenkins-admin-password}"?|?base64?--decode);echo
Um1kJLOWQY

注意,你的密码应该是不一样的。

5. ?使用以下命令来获取运行Jenkins的Pod名称:
export?POD_NAME=$(kubectl?get?pods?--namespace?jenkins?-l?"app.kubernetes.io/component=jenkins-master"?-l?"app.kubernetes.io/instance=jenkins"?-o?jsonpath="{.items[0].metadata.name}")

这将创建名为POD_NAME的环境变量,将其值设置为运行Jenkins的Pod名称。

6. ?使用kubectl命令设置端口转发:

kubectl?--namespace?jenkins?port-forward?$POD_NAME?8080:8080
Forwarding?from?127.0.0.1:8080?->?8080
Forwarding?from?[::1]:8080?->?8080


添加Executor


Jenkins将executor定义为“用于在节点上执行由Pipeline或Pipeline定义的工作槽。一个节点可以配置零个或多个Executor,与在该节点上能够执行的Project或Pipeline数量相对应。”
接下来,我们将向Jenkins节点添加executor。
1. ?浏览器打开http://localhost:8080,使用用户名admin和之前检索到的密码进行登录。
2.? 在左侧导航栏中,选择Jenkins -> Manage Jenkins -> Manage Node

?? ? ?


3.? 选择“Master?”,然后单击“Configure”
? ? ? ?


4.? 在?# of executors 输入框中输入“1”,然后单击“Save?”
? ? ? ???
安装并配置Node.js插件

在本教程中,我们将使用Node.js插件来部署并测试一个用Express.js编写的简单web应用程序。
按照以下步骤安装Node.js插件:
1.? 左侧导航栏Jenkins -> Manage Manage Jenkins -> Manage Plugins -> Available Plugins,选择NodeJS?插件,然后单击“Install without restart”
??
2. ?安装完成后,会出现以下界面:
? ? ? ??? ? ?


3. ?左侧导航栏Jenkins -> Manage Jenkins -> Global Tool Configuration,选择Add NodeJS。输入NodeJS安装名称,然后选择一个NodeJS版本,选好后单击“Save ”。
? ? ? ????
HelloWorld 存储库

为了展示Jenkins 的工作原理,我们创建了一个监听端口3000并输出“Hello World!”的简单Express.js 服务器。然后我们编写了一个单元测试,检查该web 应用程序是否能够按预期工作。同时,我们还更新了package.json 文件,以便Jenkins 可以通过npm test命令执行单元测试。
最后,我们用以下命令创建了一个Jenkinsfile:
pipeline?{
??agent?any
??tools?{nodejs?"node"}
??stages?{
????stage('Cloning?Git')?{
??????steps?{
????????git?'https://github.com/andreipope/HelloWorld'
??????}
????}?????
????stage('Install?dependencies')?{
??????steps?{
????????sh?'npm?install'
??????}
????}
????stage('Test')?{
??????steps?{
?????????sh?'npm?test'
??????}
????}?????
??}
}


以上构建了一个三阶段CD pipeline:
  • 首先,克隆了HelloWorld Git存储库

  • 然后,通过运行npm install 安装了依赖项

  • 最后,执行了单元测试

接下来,我们将配置Jenkins以运行该脚本。

创建并运行Pipeline


Pipeline为交付软件提供了可重复且一致的流程。借助Jenkins,我们可以用Groovy编程语言将pipeline作为DSL脚本来编写。
按照以下步骤创建和运行pipeline:
1. ?选择Jenkins -> New Item,然后输入pipeline名称(HelloWorld),完成后单击“OK”。
? ? ? ??? ? ?


2. ?下一页,选择“Pipeline script from SCM”,并将Repository URL 设置为“https://github.com/andreipope/HelloWorld”。这是一个公共存储库,所以我们不需要配置任何证书凭证。
? ? ? ??? ? ?
Jenkins会自动检索位于存储库根目录中的Jenkinsfile。
3. ?现在,我们可以手动运行pipeline了:
? ? ? ?
4. ?等它运行完后,应该会看到控制台输出类似内容:

+?npm?test

>?HelloWorld@1.0.0?test?/var/jenkins_home/workspace/HelloWorld
>?mocha

??ExpressJS?server
??????Prints?out?Hello?World?(291ms)
??1?passing?(373ms)
[Pipeline]?}
[Pipeline]?//?withEnv
[Pipeline]?}
[Pipeline]?//?stage
[Pipeline]?}
[Pipeline]?//?withEnv
[Pipeline]?}
[Pipeline]?//?withEnv
[Pipeline]?}
[Pipeline]?//?node
[Pipeline]?End?of?Pipeline
Finished:?SUCCESS
恭喜你!你已经成功在Kubernetes配置了Jenkins,并用它测试了一个简单的web应用程序。虽然看起来本文似乎包含了大量信息,但其实这只是Jenkins 和Kubernetes中最为浅显的内容。多尝试就会打开新世界!

【END】

更多精彩推荐

?滴滴上线自动驾驶服务;微软宣布将永久关闭实体店;.NET 5.0 Preview 6 发布 | 极客头条

?Python 爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?

?零基础编程小白如何拿 Offer?八年经验面试官万字肺腑之言

?无代码开发到底是不是伪需求?

?没了Macbook的英特尔还好吗?

?Spring 从入门到入土——AOP 就这么简单!| 原力计划

?硬核!国外开发者用 25 美元做了个区块链警佩相机!

你点的每个“在看”,我都认真当成了喜欢

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接