Kubernetes部署Jenkins静动Slave
文章目录
- Kubernetes部署Jenkins静动Slave
-
- 文档介绍
- 资源列表
- 基础环境
- [一、Jenkins Kubernetes清单文件](#一、Jenkins Kubernetes清单文件)
- 二、使用静态Slave
- 三、使用动态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地址和通道地址如下
- http://192.168.93.145:32000 Jenkins地址
- 192.168.93.145:31218 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中即可 ,具体挂载的操作大致如下
- 通过卷把相应的脚本或者二进制可执行文件挂载即可