下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

基于Jenkins和K8s的云原生CI/CD:安装篇

作者:匿名     来源: 云计算点击数:455发布时间: 2022-12-29 20:57:45

标签: Jenkins云原生K8s

  本文主要目的是演示最佳安装Jenkins的方式,使用Jenkins Operator安装。在安装好了Jenkins之后,我们使用定义流水线脚本来显示一个简单的流水线任务。

  Jenkins是在CI/CD持续集成发布的市场上占有绝对的主导地位,是我们工作中最常用的持续集成发布的工具之一。Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

  Jenkins从根本上被设计成一个分布式系统,它包含一个负责协调分配构建任务的master和多个实际执行工作的agent构成。

  

Jenkins Logo

  在云原生的场景下,我们也可以通过Jenkins的“Kubernetes插件”支持将分布式的Jenkins系统部署到k8s集群。

  本文将使用Jenkins Operator来简单快速在k8s集群上安装Jenkins。这个Operator是k8s的原生operator,用来管理k8s上的jenkins的操作。

  Jenkins Operator支持Jenkins的全生命周期管理(扩展、升级、备份等),并集成了Kubernetes插件。支持使用Jenkinsfile来构建流水线。

  

Jenkins Operator Logo

  准备k8s实验集群

  如果你在本机测试,可以使用MiniKube、Docker Desktop、Rancher Desktop、k3d等工具进行。

  如果你有专用的home lab主机,可使用microk8s、k3s等安装单节点k8s。

  当然你有可用的k8s集群都可以使用

  k8s强大UI客户端-Lens

  Lens(https://k8slens.dev/)是功能强大的k8s图形客户端,建议可以试用一下。

  

Lens界面

  安装

  1、安装Jenkins Operator

  安装Jenkins CRD(Custom Resource Definition,自定义资源定义),这时k8s集群里就有了资源类型为Jenkins的资源(kind: Jenkins)

  复制

  1.  kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/config/crd/bases/jenkins.io_jenkins.yaml 

  

安装Jenkins CRDs

  安装Jenkins Operator和其他需要的资源

  复制

  1.  kubectl apply -f https://raw.githubusercontent.com/jenkinsci/kubernetes-operator/master/deploy/all-in-one-v1alpha2.yaml

  

安装Jenkins Operator

  查看Jenkins Operator安装情况

  复制

  1.  kubectl get pods -w

  Jenkins Operator将会被安装在default 命名空,也可以用Lens查看:

  

Lens查看Jenkins Pod是否安装成功

  安装Jenkins

  因为我们安装了Jenkins的CRD,k8s集群里已经有类型为Jenkins的自定义资源。这意味着我们可以像使用k8s内置资源(Deployment,Pod)一样定义yaml文件来部署Jenkins。

  编写jenkins_instance.yaml

  复制

  1.  apiVersion: jenkins.io/v1alpha2

  2.  kind: Jenkins

  3.  metadata:

  4.  name: example

  5.  namespace: default

  6.  spec:

  7.  configurationAsCode:

  8.  configurations: []

  9.  secret:

  10.  name: ""

  11.  groovyScripts:

  12.  configurations: []

  13.  secret:

  14.  name: ""

  15.  jenkinsAPISettings:

  16.  authorizationStrategy: createUser

  17.  master:

  18.  disableCSRFProtection: false

  19.  containers:

  20.  - name: jenkins-master

  21.  image: jenkins/jenkins:2.319.1-lts-alpine

  22.  imagePullPolicy: Always

  23.  livenessProbe:

  24.  failureThreshold: 12

  25.  httpGet:

  26.  path: /login

  27.  port: http

  28.  scheme: HTTP

  29.  initialDelaySeconds: 100

  30.  periodSeconds: 10

  31.  successThreshold: 1

  32.  timeoutSeconds: 5

  33.  readinessProbe:

  34.  failureThreshold: 10

  35.  httpGet:

  36.  path: /login

  37.  port: http

  38.  scheme: HTTP

  39.  initialDelaySeconds: 80

  40.  periodSeconds: 10

  41.  successThreshold: 1

  42.  timeoutSeconds: 1

  43.  resources:

  44.  limits:

  45.  cpu: 1500m

  46.  memory: 3Gi

  47.  requests:

  48.  cpu: "1"

  49.  memory: 500Mi

  50.  seedJobs:

  51.  - id: jenkins-operator

  52.  targets: "cicd/jobs/*.jenkins"

  53.  description: "Jenkins Operator repository"

  54.  repositoryBranch: master

  55.  repositoryUrl: https://github.com/jenkinsci/kubernetes-operator.git

  安装Jenkins到k8s

  复制

  1.  kubectl create -f jenkins_instance.yaml

  观察jenkins实例是否部署成功:

  

Lens查看Jenkins是否安装成

  获取jenkins的账号密码

  复制

  1.  kubectl get secret jenkins-operator-credentials-example -o 'jsnotallow={.data.user}' | base64 -d

  2.  kubectl get secret jenkins-operator-credentials-example -o 'jsonpath={.data.password}' | base64 -d

  

jenkins账号和密码

  或者在Lens上查看:

  

Lens查看Jenkins实例详情

  

Lens查看Jenkins实例账号密码

  代理Jenkins端口到本地访问:

  复制

  1.  kubectl port-forward jenkins-example 8080:8080

  或者在Lens上直接操作:

  

使用Lens代理Jenkins端口到本地

  访问Jenkins地址:http://localhost:8080/,输入账号密码。

  

Jenkins登录界面

  Jenkins的k8s配置

  因为我们使用Jenkins Operator安装Jenkins,所以Jenkins Kubernetes插件无需我们手动配置连接到k8s集群,我们的Jenkins实例已经配置好了连接。

  首页点击“Manage Jenkins -> Manage Node and Clouds -> Configure Clouds”,或者访问:http://localhost:8080/configureClouds/,我们可以看到已经为我们直接配置好了连接Kubernetes:

  

Jenkins连接k8s

  我们可以通过“Add a new cloud”自己配置连接新的k8s集群,或者通过“Delete cloud”删除当前的k8s集群连接。

  我们可以点击“Kubernetes Cloud details...”和“Pod Templates...”查看当前的连接配置。

  

Jenkins Kubernetes连接配置

  定义一个流水线任务

  在首页点击“New Item”,任务名“first_test”,构建类型为“Pipeline”(流水线),点击“OK”后进入下一页。

  

新建流水线任务

  在“Build Trigger”页签下,“Pipeline”部分填入“Pipeline script”:

  

流水线任务的脚本配置

  复制

  1.  #!/usr/bin/env groovy

      2.

  3.  def label = "k8s-${UUID.randomUUID().toString()}"

  4.  def home = "/home/jenkins"

  5.  def workspace = "${home}/workspace/build-jenkins-operator"

  6.  def workdir = "${workspace}/src/github.com/jenkinsci/kubernetes-operator/"

      7.

  8.  podTemplate(label: label,

  9.  containers: [

  10.  containerTemplate(name: 'alpine', image: 'alpine:3.11', ttyEnabled: true, command: 'cat'),

  11.  ],

  12.  ) {

  13.  node(label) {

  14.  stage('Run shell') {

  15.  container('alpine') {

  16.  sh 'echo "hello world"'

  17.  }

  18.  }

  19.  }

  20.  }

  在代码中我们可以看出,流水线中定义了podTemplate ,而podTemplate 在里面定义了Jenkins流水线所需要的所有容器containerTemplate。如果我们想要使用流水线完成Spring Boot程序自动化集成和发布的话,那我们就需要定义容器:

  a)、git容器:拉取代码;

  b)、gradle/maven容器:编译程序;

  c)、docker容器:编译Docker镜像并推送到镜像中心(若k8s的容器方案不是docker的话,此方案不通,在后续文章会讲解解决方案);

  d)、helm/kubectl容器:部署或更新程序。

  开始编译,点击“test_first”进入详情页,点击“Build now”,我们可以“Console Output”中查看编译过程。

  

Jenkins流水线编译过程1

  

Jenkins流水线编译过程2

  通过编译过程和观察k8s集群变化,可发现我们的Jenkins master(jenkins-example)实例,在k8s集群中新建了一个agent实例:k8s-dc0d4e7a-8d88-4932-8467-6cd58918c4f1-380bq-0r80k,这个名称是在上面脚本中的label中定义的。

  

jenkins通过k8s新建agent

  结语

  本文主要目的是演示最佳安装Jenkins的方式,使用Jenkins Operator安装。在安装好了Jenkins之后,我们使用定义流水线脚本来显示一个简单的流水线任务。

  在下一篇文章中,我将演示生产级别的Jenkins的使用方式,使用Jenkinsfile来定义流水线脚本,使一个Spring Boot程序完成自动化的集成和发布的过程,敬请期待。

  参考资料:

  https://jenkinsci.github.io/kubernetes-operator/docs/getting-started/latest/

  https://plugins.jenkins.io/kubernetes/

  文章出自:爱科学的卫斯理,如有转载本文请联系爱科学的卫斯理今日头条号。

  来源: 今日头条

    >>>>>>点击进入计算专题

赞(8)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程