【云原生】Kubernetes部署Jenkins静动Slave

Kubernetes部署Jenkins静动Slave

文章目录

文档介绍

  • Kubernetes是一个开源的系统,用于自动化部署、扩展、以及容器化应用程序的管理。
  • Kubernetes集群向Jenkins添加了一个新的自动化层。Kubernetes确保资源得到有效利用,并且您的服务器底层基础设施不会过载。Kubernetes编排容器部署的能力确保Jenkins始终具有适量的可用资源。
  • Kubernetes集群上托管Jenkins有利于基于Kubernetes的把部署和基于容器的动态可扩展Jenkins代理。在这里,我们看到了在Kubernetes集群上设置Jenkins的分步过程。

资源列表

操作系统 配置 主机名 IP 角色
CentOS 7.9 2C4G master 192.168.93.145 master
CentOS 7.9 2C4G node1 192.168.93.146 node1
CentOS 7.9 2C4G node2 192.168.93.147 node2

基础环境

  • 关闭防火墙
bash 复制代码
systemctl stop firewalld
systemctl disable firewalld
  • 关闭内核安全机制
bash 复制代码
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config

一、Jenkins Kubernetes清单文件

  • 此处使用的所有Jenkins Kubernetes清单文件都托管在GitHub上(克隆存储库)
bash 复制代码
[root@master ~]# yum -y install git
[root@master ~]# git clone https://github.com/scriptcamp/kubernetes-jenkins
[root@master ~]# cd kubernetes-jenkins/
  • 第1步:为Jenkins创建Namespace。最好将所有DevOps工具分类为单独与其他应用程序的名称空间。
bash 复制代码
[root@master kubernetes-jenkins]# kubectl apply -f namespace.yaml
  • 第2步:加载"serviceAccount.yaml"文件
bash 复制代码
# serviceAccount.yaml创建一个"jenkins-admin" clusterRole、"jenkins-admin"ServiceAccount,并将"clusterRole"绑定到服务账户
# jenkins-admin集群角色具有管理集群组件的所有权限。您还可以通过指定单个资源操作来限制访问
[root@master kubernetes-jenkins]# kubectl apply -f serviceAccount.yaml
  • 第3步:加载"volume.yaml",用于持久化数据
bash 复制代码
# 需要把此文件中的nodename选择器改为自己集群node节点的名字
# 对于卷,我们使用"local"存储类进行演示。这意味着,他会在"/mnt"位置下的特定节点中创建一个PV卷
# 由于"local"存储类需要节点选择器,因此您需要正确指定Jenkins Pod的工作节点名称,以便在特定节点中调度
# 如果Pod被删除或者重新启动,数据将持久化在节点卷中。但是,如果节点被删除,您将丢失所有数据

[root@master kubernetes-jenkins]# cat volume.yaml
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node1  # 改为集群中可用node节点的名称即可
[root@master kubernetes-jenkins]# kubectl apply -f volume.yaml
  • 第4步:加载deployment.yaml
bash 复制代码
# 在此文件中,我们使用了以下内容
# "securityContext"以便Jenkins Pod能够写入本地持久卷
# 运行情况和就绪情况探针,用于监控Jenkins Pod的运行情况
# 基于保存Jenkins数据路径"/var/jenkins_home"的本地存储类的本地持久化

[root@master kubernetes-jenkins]# kubectl apply -f deployment.yaml
  • 第5步:加载service.yaml,用于服务暴露
bash 复制代码
# 更改为如下内容
[root@master kubernetes-jenkins]# cat service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  namespace: devops-tools
  annotations:
      prometheus.io/scrape: 'true'
      prometheus.io/path:   /
      prometheus.io/port:   '8080'
spec:
  selector: 
    app: jenkins-server
  type: NodePort  
  ports:
    - name: jenkins
      port: 8080
      targetPort: 8080
      nodePort: 32000
    - name: jnlp
      port: 50000
[root@master kubernetes-jenkins]# kubectl apply -f service.yaml
  • 第6步:查看所需资源是否准备就绪
bash 复制代码
[root@master kubernetes-jenkins]# kubectl get pod,svc -n devops-tools 
NAME                          READY   STATUS    RESTARTS   AGE
pod/jenkins-b96f7764f-5vq6f   1/1     Running   0          18m

NAME                      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                          AGE
service/jenkins-service   NodePort   10.98.217.62   <none>        8080:32000/TCP,50000:31218/TCP   15m
  • 访问Jenkins:访问地址http://192.168.93.145:320000
  • 查看解锁Jenkins密码
bash 复制代码
# 此解锁密码在Jenkins的持久化目录里面
# 我的持久化节点是node1
[root@node1 secrets]# pwd
/mnt/secrets
[root@node1 secrets]# cat initialAdminPassword 
a49a05b23a634ab1b1a8f42b2f5fc7da
  • 在线安装所需插件,如果中途有插件没有安装成功,可以选择登录Jenkins之后进行手动安装


  • 安装插件成功的情况下,也许会比我多几个需要填写的,这些都不是重点

二、使用静态Slave

  • Jenkins静态Slave是指在Jenkins环境中配置一个或多个固定的从属节点,这些节点的配置是静态的,不会频繁改变。

2.1、安装Kubernetes插件

  • 依次点击"Dashboard">"Manager Jenkins">"插件管理",搜索"Kubernetes插件"然后安装即可

2.2、添加Agent

  • 依次点击"Dashboard">"系统管理">"节点和云管理"

  • 添加Agent的名称,然后点击固定节点,最后点击Create(当然你可以创建多个Agent)

  • 填写远程工作目录(远程目录为Pod中容器的目录)、标签(作用:标签的作用就是等下进行发布任务的是时候指定那个Pod进行运行)、启动方式

  • 点进去,此时的Agent还没有并注册所以不能使用,接下来开始注册

  • 此处需要记下来secret地址

  • 我们拿到这些之后我们需要去创建一个Deployment来支持这个Agent了。不过这里最好不要用/root当Pod的远程目录,是否可能会出现权限问题

bash 复制代码
[root@master kubernetes-jenkins]# cat agent1.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: jenkins-agent
  namespace: devops-tools
  labels:
    app: jenkins-agent
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins-agent
  template:
    metadata:
      labels:
        app: jenkins-agent
    spec:
      containers:
      - name: jenkins-agent
        image: jenkins/inbound-agent:latest
        env:
          - name: JENKINS_URL
            value: "http://jenkins-service:8080"  # 更改为你的jenkins的svc名称
          - name: JENKINS_SECRET
            value: "653ed5a4393781d9abff71f28a12ca1f8256330c0c55468688ad71cfd69bed85"  # 填写上面图片中查到的secret地址
          - name: JENKINS_AGENT_NAME
            value: "k8s-agent1"  # 添加刚刚创建的Agent的名称
          - name: JENKINS_AGENT_WORKDIR
            value: "/tmp"  # 添加刚刚创建的Agent的远程目录


# 加载资源
[root@master kubernetes-jenkins]# kubectl apply -f agent1.yaml
bash 复制代码
# 查看静态Agent是否创建并且查看日志是否注册成功
[root@master kubernetes-jenkins]# kubectl get pod -n devops-tools 
NAME                            READY   STATUS    RESTARTS      AGE
jenkins-agent-ff7579bdd-k75l9   1/1     Running   0             14s
jenkins-b96f7764f-5vq6f         1/1     Running   1 (12m ago)   45m


[root@master kubernetes-jenkins]# kubectl logs -n devops-tools jenkins-agent-ff7579bdd-k75l9
# 最后的几行回显
INFO: Waiting for ProtocolStack to start.
Oct 19, 2024 6:58:16 AM hudson.remoting.Launcher$CuiListener status
INFO: Remote identity confirmed: c3:fe:45:30:0a:87:b2:0d:aa:37:d7:dd:92:84:64:75
Oct 19, 2024 6:58:16 AM hudson.remoting.Launcher$CuiListener status
INFO: Connected
  • 此时通过Web界面就可以很明显看到Agent注册成功了

2.3、使用Slave

  • 创建一个pipeline流水线项目,项目名称自定义
bash 复制代码
pipeline {
    agent {
        node {
            label "agent1"  //这个是Agent1的标签,意味着又这个标签的Agent来运行此次项目
        }
    }


    stages {
        stage('静态slave') {
            steps {
                echo 'Hello 静态slave'
            }
        }
    }
}


  • 如果你想让此静态Pod构建Maven、NodeJs项目,那么可以把运行此Agent的Pod宿主机上的Java或者、Maven目录挂载到Pod中即可

三、使用动态Slave

  • Jenkins动态Slave是指在JenkinsCICD系统中,根据需求动态生成、管理和销毁构建代理(Slave)节点的一种方式。与静态代理节点不同,静态代理是预先配置的固定节点,而动态代理则可以在需要时根据任务自动化创建Pod去运行,运行完成自动销毁Pod。

3.1、添加凭据

  • 添加K8S的凭据,把K8S的master节点下的/root/.kube/config文件复制到物理机上,后面需要使用
bash 复制代码
# 此文件复制到物理机上
[root@master ~]# ls /root/.kube/
cache  config


3.2、配置动态Slave

  • 连接Kubernetes集群




3.3、配置Jenkins地址和通道

  • Jenkins通道地址通过以下方式获取端口
  • 我的Jenkins地址和通道地址如下
bash 复制代码
# 对外暴露的50000端口就是Jenkins通道端口
[root@master ~]# kubectl get svc -n devops-tools 
NAME              TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                          AGE
jenkins-service   NodePort   10.98.217.62   <none>        8080:32000/TCP,50000:31218/TCP   62m

3.4、配置Pod模板



  • 添加容器
  • 名称填写"jnlp",镜像填写"jenkins/inbound-agent:latest"
  • 运行的命令和命令参数为空


  • 添加卷

3.5、确定拉取端口是否开启50000

  • 默认开启

3.6、使用Slave

  • 创建一个pipeline流水线项目,项目名称自定义

    pipeline {
    agent {
    node {
    label "jnlp" //这个是动态slave的标签,意味着又这个标签的Agent来运行此次项目
    }
    }

      stages {
          stage('动态slave') {
              steps {
                  echo 'Hello 动态slave'
                  sleep 60
              }
          }
      }
    

    }

  • 最后点击保存,构建项目

  • 构建的时候K8S会自动创建Pod,构建完成之后自动销毁

bash 复制代码
# 构建项目时内容如下
[root@master ~]# kubectl get pod -n devops-tools 
NAME                            READY   STATUS    RESTARTS      AGE
jenkins-agent-ff7579bdd-k75l9   1/1     Running   0             39m
jenkins-b96f7764f-5vq6f         1/1     Running   1 (51m ago)   84m
jnlp-4h92g                      1/1     Running   0             10s   # 这个就是动态Slave自动创建的Pod
bash 复制代码
# 构建项目后内容如下
# 项目构建成功后意味着任务结束,所以Pod就会被自动创建
[root@master ~]# kubectl get pod -n devops-tools 
NAME                            READY   STATUS    RESTARTS      AGE
jenkins-agent-ff7579bdd-k75l9   1/1     Running   0             40m
jenkins-b96f7764f-5vq6f         1/1     Running   1 (52m ago)   85m
  • 如果你想让此动态Pod构建Maven、NodeJs项目,那么可以把运行此Agent的Pod宿主机上的Java或者、Maven目录挂载到Pod中即可具体挂载的操作大致如下
  • 通过卷把相应的脚本或者二进制可执行文件挂载即可
相关推荐
JavaOpsPro8 小时前
jenkins部署手册
运维·jenkins·离线部署
搬砖天才、8 小时前
自动化部署-02-jenkins部署微服务
微服务·自动化·jenkins
思通数据9 小时前
AI助力医疗数据自动化:诊断报告识别与管理
大数据·人工智能·目标检测·机器学习·计算机视觉·目标跟踪·自动化
CYRUS STUDIO9 小时前
frida脚本,自动化寻址JNI方法
android·运维·自动化·逆向·移动安全·jni·frida
Liquid UI11 小时前
Amcor 如何借助 Liquid UI 实现SAP PM可靠性
ui·自动化·sap·制造
IT·小灰灰12 小时前
Python——自动化发送邮件
运维·网络·后端·python·自动化
尘佑不尘12 小时前
shodan5,参数使用,批量查找Mongodb未授权登录,jenkins批量挖掘
数据库·笔记·mongodb·web安全·jenkins·1024程序员节
斯普信专业组12 小时前
K8s企业应用之容器化迁移
云原生·容器·kubernetes
颜淡慕潇12 小时前
【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】
后端·云原生·容器·kubernetes
摇曳 *13 小时前
Kubernetes:(三)Kubeadm搭建K8s 1.20集群
云原生·容器·kubernetes