在Google Kubernetes集群创建分布式Jenkins(一)

这篇具有很好参考价值的文章主要介绍了在Google Kubernetes集群创建分布式Jenkins(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为项目需要,在GKE的集群上需要创建一个CICD的环境,记录一下安装部署一个分布式Jenkins集群的过程。

分布式Jenkins由一个主服务器和多个Agent组成,Agent可以执行主服务器分派的任务。如下图所示:

在Google Kubernetes集群创建分布式Jenkins(一),kubernetes,分布式,jenkins,ci/cd

如上图,Jenkins Agent可以运行不同的操作系统,执行主服务器分派的编译打包或测试等任务。

在Jenkins的官网上介绍了在K8S上安装的几种方式,包括了Helm, operator等。但是我直接用Helm最新版的Jenkins安装始终遇到问题,日志报错信息是Google的OAUTH插件编译有问题,如果用旧版本的可以安装成功,但是我不想用旧的版本,而新版本的问题暂时没找到解决的思路,另外Helm安装的values配置过于繁杂。我考虑用最传统的Yaml manifest的方式来部署这个Jenkins。

创建Jenkin主服务器

首先是创建namespace的manifest,配置如下:

apiVersion: v1
kind: Namespace
metadata:
  name: "jenkins"
  labels:
    name: "jenkins"

定义Storage class的manifest

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: storage-jenkins
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  fstype: ext4
volumeBindingMode: WaitForFirstConsumer

定义PVC,保存Jenkins的相关数据

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: jenkins-pvc 
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "storage-jenkins" 
  resources:
    requests:
      storage: 30Gi 

再创建多一个PVC,给Jenkins Agent用来保存下载的文件,例如maven的仓库,这样可以加快Build job的执行速度。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: maven-repo-storage 
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "storage-jenkins" 
  resources:
    requests:
      storage: 10Gi 

然后就是创建一个deployment,部署Jenkins pod,注意在containers的env里面增加了一个环境变量,定义了jenkins uri的前缀,然后在probe的path里也相应的加了/jenkins前缀。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
spec:
  selector:
    matchLabels:
      app: jenkins
  replicas: 1
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      volumes:
        - name: pvc-jenkins 
          persistentVolumeClaim:
            claimName: jenkins-pvc 
      containers:
      - name: jenkins
        image: "jenkins/jenkins:lts"
        securityContext:
          runAsUser: 0
        volumeMounts:
          - mountPath: "/var/jenkins_home/"
            name: pvc-jenkins
        env:
        - name: JENKINS_OPTS
          value: --prefix=/jenkins 
        ports:
        - containerPort: 8080
        - containerPort: 50000 
        resources:
          limits:
            cpu: "2"
            memory: "4Gi"
          requests:
            cpu: "1"
            memory: "2Gi"
        livenessProbe:
          httpGet:
            path: "/jenkins/login"
            port: 8080
          initialDelaySeconds: 90
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 5
        readinessProbe:
          httpGet:
            path: "/jenkins/login"
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3

创建一个service来暴露Jenkins的地址和端口,注意这里加了GCP的neg注解,使得可以使用ingress来暴露,另外指定了jenkins agent和jenkis master之间通讯的接口50000

apiVersion: v1
kind: Service
metadata:
  name: jenkins-svc
  namespace: jenkins
  annotations:
   cloud.google.com/neg: '{"ingress": true}'
  labels:
    app: jenkins
spec:
  ports:
  - name: jenkinsport
    port: 8080
    targetPort: 8080
  - name: slaveconnectors
    port: 50000
    targetPort: 50000
  selector:
    app: jenkins

再创建一个ingress,使得可以从公网访问

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins-ingress
  namespace: jenkins
spec:
  rules:
  - http:
      paths:
      - path: /jenkins
        pathType: Prefix
        backend:
          service:
            name: jenkins-svc
            port:
              number: 8080

最后创建一个kustomization.yaml,把以上部分组合起来

resources:
  - namespace.yaml
  - storage-class.yaml
  - pvc.yaml
  - agent-pvc.yaml
  - deployment.yaml
  - service.yaml
  - ingress.yaml

然后运行命令kubectl apply -k kustomization_dir/即可部署。等待ingress创建完成后,在gcp console的网页上找到相应的地址,在浏览器上访问即可进入jenkins的配置页面。如果不能访问,我们需要检查一下Firewall是否没有放通。

初次访问配置页面,需要输入admin password,这个可以从Jenkins pod的日志查到。

kubectl logs <jenkins_pod_name> -n jenkins

之后我们可以安装建议的插件,然后创建一个Jenkins的用户

安装Jenkins动态Agent

有了主服务器之后,我们就可以配置动态Agent了。以下是Jenkins创建动态Agent的流程图

在Google Kubernetes集群创建分布式Jenkins(一),kubernetes,分布式,jenkins,ci/cd

  1. 当触发Jenkins任务的时候,Jenkins kubernetes插件会给K8S服务器发起一个API调用,创建一个Agent pod.
  2. 这个Jenkins agent pod会运行在K8S上来运行Jenkins任务,当任务完成时会自动中止。
  3. 当Jenkins agent pod启动时,会读取环境变量配置并和Jenkins主服务器通过JNLP的方式沟通。

安装Jenkins kubernetes插件

在Jenkins的Manage Jenkins页面,选择Plugin,搜索Kubernetes并安装。安装完成后重启Jenkins

1. 连接Kubernetes

在Jenkins的Manage Jenkins->Clouds->New Cloud,类型选择Kubernetes.

然后在配置项里面,Kubernetes url和Kubernetes server certificate key都不用输入,因为我们的Jenkins master server是在同一个Kubernetes里面。Namespace输入jenkins。然后赋予jenkins这个namespace下的default用户cluster-admin的role。如以下命令:

kubectl create clusterrolebinding jenkins --clusterrole cluster-admin --serviceaccount=jenkins:default

点击Test Connection,如果正常就会显示连接成功。

2. 配置Jenkins URL

输入Jenkins service的internal DNS的名称,因为我们之前定义了jenkins前缀,所以URL是http://jenkins-svc.jenkins.svc.cluster.local:8080/jenkins

3. 创建Pod和Container template

Pod label key设置为jenkins,value设置为slave。Pod template name输入jenkins-slave,namespace输入Jenkins,labels输入slave。Containers里面先不加container template,Jenkins默认是用Jenkins/inbound-agent这个镜像

如果我们需要用docker来创建镜像,并且我们的GKE cluster是standard的类型(Autopilot类型不支持host path为/var/run/docker.sock),那么可以Jenkins agent可以采用docker in docker的方式。需要Add volume detail,选择Host path volume,然后把kubernetes节点的docker daemon socket mount到Jenkins agent pod. 在Host path和mount path分别输入/var/run/docker.sock

因为我的GKE是Autopilot类型,我将采用Kaniko的方式来Build镜像,因此这里没有add volume

4. 配置Service Account

因为Jenkins agent pod需要权限来调用GCP的服务,例如推送image到repository等。需要创建一个service account来给agent使用。

首先在K8S的jenkins namespace创建一个service account

kubectl create serviceaccount jenkins-sa --namespace jenkins

在GCP IAM里面创建一个service account

gcloud iam service-accounts create jenkins-sa --project=PROJECT_ID

给这个service account赋予需要的role,可以用以下命令

gcloud projects add-iam-policy-binding PROJECT_ID --member "serviceAccount:jenkins-sa@PROJECT_ID.iam.gserviceaccount.com" --role "ROLE_NAME"

把这两个service account绑定起来,使得K8S的service account可以模仿GCP的service account

gcloud iam service-accounts add-iam-policy-binding jenkins-
sa@PROJECT_ID.iam.gserviceaccount.com --role roles/iam.workloadIdentityUser --member
"serviceAccount:PROJECT_ID.svc.id.goog[jenkins/jenkins-sa]"

Annotate K8S的service account,加上email地址

kubectl annotate serviceaccount jenkins-sa --namespace jenkins
iam.gke.io/gcp-service-account=jenkins-sa@PROJECT_ID-
v1.iam.gserviceaccount.com

最后还要把Run as user id设为0,使得jenkins agent pod以root用户来运行,以避免权限问题。最后Save即可完成配置。

5. 设置Agent连接端口

回到Manage jenkins的manage globle security里面,在Agent的设置下选择指定端口,填入50000

运行Jenkins CICD pipeline

现在可以构建一个CICD pipeline了。下图是构建CICD的一个流程图

在Google Kubernetes集群创建分布式Jenkins(一),kubernetes,分布式,jenkins,ci/cd

这里面包括了几个步骤

  1. 往Git仓库提交代码,通过hook触发jenkins任务
  2. Jenkins启动agent pod,运行打包任务
  3. 把打包的镜像推送到registry
  4. 更新部署的manifest,更新镜像的标签
  5. 把应用部署到GKE

我这里将扩展一下这些步骤,增加Jenkin和Github webhook的集成,使得用户提交PR的时候自动触发UT检查,然后当用户执行merge操作的时候来触发打包任务。这部分的内容比较多,我将在下一篇博客中记录具体的操作过程。

现在我将建立一个简单的任务,测试一下我们配置的Jenkins是否能正常工作。

在主页面选择新建任务,然后选择pipeline,然后在pipeline script里面输入以下内容

pipeline {
  agent{
    kubernetes{
        label 'slave'
    }
  }
  environment {
    ZONE = "us-central1"
    PROJECT_ID = "curious-athlete-401708"
  }

  stages{      
    stage("test"){
      steps{
        script{
          sh 'echo "testing"'
        }
      }
    }
  }
}

运行这个任务,我们可以看到页面会显示自动创建一个jenkins-slave-xxxx的pod,然后在这个pod上运行我们的pipeline。运行结束之后我们可以查看Job的console log,可以看到成功执行了pipeline里面定义的echo testing

可见我们已经成功配置了一个Kubernetes上的分布式jenkins环境。文章来源地址https://www.toymoban.com/news/detail-743156.html

到了这里,关于在Google Kubernetes集群创建分布式Jenkins(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式、集群、微服务

    分布式是以缩短单个任务的执行时间来提升效率的;而集群则是通过提高单位时间内执行的任务数来提升效率。 分布式是指将不同的业务分布在不同的地方。 集群指的是将几台服务器集中在一起,实现同一业务。 分布式中的每一个节点,都可以做集群。而集群并不一定就是

    2024年02月08日
    浏览(52)
  • 分布式与集群区别

    1、提供服务是否相同 分布式:不同的机器上部署的是不同的服务模块,对外提供不同的服务 集群:不同机器上部署的是同样的模块,对外提供同样的服务 2、目的 分布式:分解任务,用来应对高并发。 集群:用来容错,可靠性,高可用。 3、是否依赖其他模块 分布式:各节

    2024年04月22日
    浏览(37)
  • 在Kubernetes上部署分布式深度学习训练平台

    作者:禅与计算机程序设计艺术 1.1 什么是深度学习? 1.2 为什么需要深度学习? 1.3 深度学习平台架构图 # 2.基本概念术语说明 2.1 Kubernetes 2.2 GPU 2.3 MPI # 3.核心算法原理和具体操作步骤以及数学公式讲解 3.1 数据加载流程 3.2 网络结构设计 3.3 激活函数设计 3.4 损失函数设计 3

    2024年02月07日
    浏览(40)
  • Hadoop分布式集群安装

            上一篇大数据文章讲解了在单机上搭建Hadoop-Yarn 伪分布式集群的安装方法,方便大家学习,真实环境不可能只有一台机器,肯定是多节点的集群,大单位还会建设很多Hadoop集群,比如各个大部门有自己的集群,或者按热、温、冷来划分建立集群,反正都是很多台服

    2024年01月19日
    浏览(50)
  • Redis分布式系统:集群

    \\\"还不如留给花园,多一瞬色彩~\\\"          当我们聊到“集群”这一个词,我们脑中构想出的画面,一定是多台机器,构成的分布式系统,这可以被称为一个“集群”。其实,在前篇的哨兵机制下,奇数个监控哨兵,以及多组主从结构的数节点所构成的大的环境,就是一个“

    2024年01月24日
    浏览(43)
  • 搭建HBase分布式集群

    0. Prerequisite There are 3 VMs - hadoop3/hadoop4/hadoop5 for fully-distributed HBase cluster, the setup plan looks like: hadoop3 hadoop4 hadoop5 Hadoop hdfs NameNode:8020 DateNode:50010 JobHistoryServer:19888 DataNode:50010 SecondaryNameNode:50090 DateNode:50010 Hadoop yarn NodeManger:8040 ResourceMananger:8088 NodeManger:8040 NodeManger:8040 Zookeeper Quor

    2024年02月08日
    浏览(36)
  • 单机,集群和分布式概念

    1.受限于硬件资源,单机所能承受的用户并发量太少; 2.一个系统有多个模块,任意模块的修改都会导致整个项目代码重新编译、部署; 3.系统中,有些模块是CPU密集型,有些模块是I/O密集型,造成各个模块对于硬件资源的需求是不一样的。 负载均衡        集群的优点

    2024年02月14日
    浏览(48)
  • LVS集群和分布式

    LVS 在计算机领域,集群早在 1960 年就出现,随着互联网和计算机相关技术的发展,现在 集群这一技术已经在各大互联网公司普及。 1.1.1 集群概念 计算机集群指一组通过计算机网络连接的计算机,它们一起工作,在许多方面,它们可以 被视为一个单一的系统。与网格计算机

    2024年02月13日
    浏览(39)
  • Hadoop分布式集群搭建

    集群以三台电脑搭建,每台电脑创建一个UbuntuKylin虚拟机,集群以三台UbuntuKylin虚拟机为基础搭建,虚拟机主机名分别为hadoop101、hadoop111和hadoop121。IP地址分别为192.168.214.101、192.168.214.111和192.168.214.121。 主机名 IP地址: hadoop101 192.168.214.101 hadoop111 192.168.214.111 hadoop121 192.168.214

    2024年02月03日
    浏览(48)
  • 浅析集群、分布式、负载均衡

    平时开发或者面试中进场听到集群、分布式、负载均衡等系列的名词,他们之间有什么联系呢,本文就简要的抛砖引玉一下。 1.什么是集群 集群一般指的是服务器集群。集群其实就是一组相互独立的计算机,通过高速的网络组成一个计算机系统。而很多服务器集中起来一起进

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包