#配置 jenkins 连接到我们存在的 k8s 集群
(1)访问http://192.168.172.163:30002/configureClouds/新增一个云,在下拉菜单中选择 kubernets 并添加
![](https://img.haomeiwen.com/i21199738/c3d51c33b34df4dd.png)
(2)填写云 kubernetes 配置内容
![](https://img.haomeiwen.com/i21199738/709f7c7f227925bf.png)
kubernetes https://192.168.172.163:6443
如果是vip写vip地址
(3)测试 jenkins 和 k8s 是否可以通信
![](https://img.haomeiwen.com/i21199738/6472964fe4547c30.png)
点击连接测试,如果显示 Connection test successful 或者显示Connected to Kubernetes 1.20 说明测试成功,Jenkins 可以和 k8s 进行通信
kubectl get svc -n jenkins-k8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins-service NodePort 10.109.88.145 <none> 8080:30002/TCP,50000:30814/TCP 108m
jenkins地址对应name
![](https://img.haomeiwen.com/i21199738/14da1664e0c71fb7.png)
配置 k8s 集群的时候 jenkins 地址需要写上面域名的形式,配置之后执行如下: http://jenkins-service.jenkins-k8s.svc.cluster.local:8080 应用------>保存
#配置 pod-template
(1)配置 pod template
访问 http://192.168.172.163:30002/configureClouds/
添加 Pod 模板------>Kubernetes Pod Template--->按如下配置
![](https://img.haomeiwen.com/i21199738/45845dac772a14e7.png)
(2)在上面的 pod template 下添加容器 添加容器------>Container Template------>按如下配置------>
![](https://img.haomeiwen.com/i21199738/756a79cf5129a2df.png)
Docker 镜像:使用 jenkins-jnlp.tar.gz 解压出来的镜像,把这个镜像上传到 k8s 的各 node 节 点,手动解压:docker load -i jenkins-jnlp.tar.gz
解压出来的镜像是 god/jenkins-jnlp:v1
在每一个 pod template 右下脚都有一个 Advanced,点击 Advanced,出现如下
![](https://img.haomeiwen.com/i21199738/ef098e5278f7e374.png)
在 Service Account 处输入 jenkins-k8s-sa,这个 sa 就是我们最开始安装 jenkins 时的 sa (3)给上面的 pod template 添加卷
添加卷------>选择 Host Path Volume
![](https://img.haomeiwen.com/i21199738/d00d412efab764f6.png)
/var/run/docker.sock /var/run/docker.sock
/root/.kube /home/jenkins/.kube 上面配置好之后,应用------>保存
#添加 dockerhub 凭据
首页------>系统管理----→管理凭据--→全局--→添加凭据
![](https://img.haomeiwen.com/i21199738/0084c8b7ed2b7244.png)
添加自己的dockerhub用户
![](https://img.haomeiwen.com/i21199738/6cefef314a0acfa3.png)
username:cadrcadr password:**** ID:dockerhub 描述:这个地方随便写 上面修改好之后选择确定即可
#测试通过 Jenkins 发布代码到 k8s 开发环境、测试环境、生产环境 在 k8s 的控制节点创建名称空间:
63 ~]# kubectl create ns devlopment namespace
63 ~]# kubectl create ns production namespace
63 ~]# kubectl create ns qatest namespace
回到 jenkins 首页:
pod模版 标签列表对应pipeline
![](https://img.haomeiwen.com/i21199738/e071ae4b858928b7.png)
新建一个任务
------>输入一个任务名称处输入 jenkins-variable-test-deploy------>流水线----- ->确定------>在 Pipeline script 处输入如下内容
node('testhan') {
stage('Clone') {
echo "1.Clone Stage"
git url: "https://github.com/cadrcadr/jenkins-sample.git"
script {
build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
}
}
stage('Test') {
echo "2.Test Stage"
}
stage('Build') {
echo "3.Build Docker Image Stage"
sh "docker build -t cadrcadr/jenkins-demo:${build_tag} ."
}
stage('Push') {
echo "4.Push Docker Image Stage"
withCredentials([usernamePassword(credentialsId: 'dockerhub', passwordVariable: 'dockerHubPassword', usernameVariable: 'dockerHubUser')]) {
sh "docker login -u ${dockerHubUser} -p ${dockerHubPassword}"
sh "docker push cadrcadr/jenkins-demo:${build_tag}"
}
}
stage('Deploy to dev') {
echo "5. Deploy DEV"
sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-dev-god.yaml"
sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-dev-god.yaml"
// sh "bash running-devlopment.sh"
sh "kubectl apply -f k8s-dev-god.yaml --validate=false"
}
stage('Promote to qa') {
def userInput = input(
id: 'userInput',
message: 'Promote to qa?',
parameters: [
[
$class: 'ChoiceParameterDefinition',
choices: "YES\nNO",
name: 'Env'
]
]
)
echo "This is a deploy step to ${userInput}"
if (userInput == "YES") {
sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-qa-god.yaml"
sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-qa-god.yaml"
// sh "bash running-qa.sh"
sh "kubectl apply -f k8s-qa-god.yaml --validate=false"
sh "sleep 6"
sh "kubectl get pods -n qatest"
} else {
//exit
}
}
stage('Promote to pro') {
def userInput = input(
id: 'userInput',
message: 'Promote to pro?',
parameters: [
[
$class: 'ChoiceParameterDefinition',
choices: "YES\nNO",
name: 'Env'
]
]
)
echo "This is a deploy step to ${userInput}"
if (userInput == "YES") {
sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s-prod-god.yaml"
sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s-prod-god.yaml"
// sh "bash running-production.sh"
sh "cat k8s-prod-god.yaml"
sh "kubectl apply -f k8s-prod-god.yaml --record --validate=false"
}
}
}
god 变成自己的 dockerhub 用户名 k8s-prod-god.yaml
应用------>保存------>立即构建 在左侧可以看到构建任务,如下所示:
![](https://img.haomeiwen.com/i21199738/1b870f3a7df5cba5.png)
![](https://img.haomeiwen.com/i21199738/22b56910b9cfbb26.png)
点击 Console Output,可以看到 pipeline 定义的步骤的详细信息
![](https://img.haomeiwen.com/i21199738/35f8cad958a6670e.png)
点击 Input request,部署应用到预生产环境
![](https://img.haomeiwen.com/i21199738/d7ab9b68aed7ff73.png)
![](https://img.haomeiwen.com/i21199738/6b4ca50dc89b3d90.png)
点击 Input request,部署应用到生产环境
![](https://img.haomeiwen.com/i21199738/ea4b1e669f088e6f.png)
看到 Finished:SUCCESS,,说明 pipeline 构建任务完成
报错 1
![](https://img.haomeiwen.com/i21199738/8518cf7e21add3be.png)
解决方法:请修改 Pipeline script 处标签更改为自己的 dockerhub 的 username。
6、验证开发、预生产、生产环境部署的应用是否正常运行
]# kubectl get pods -n devlopment
NAME READY STATUS RESTARTS AGE
jenkins-demo-784885d9c9-b4jkg 1/1 Running 0
]#kubectl get pods -n qatest
NAME READY STATUS RESTARTS AGE jenkins-demo-784885d9c9-59tsm 1/1 Running 0 5m19s
]#kubectl get pods -n production
NAME READY STATUS jenkins-demo-784885d9c9-42hz4 1/1 running
Jenkins 管理插件 BlueOcean 配置和使用
# BlueOcean 是什么?
为了适应 Jenkins Pipeline 和 Freestyle jobs 任务,Jenkins 推出了 BlueOcean UI,其目的就 是让程序员执行任务时,降低工作流程的复杂度和提升工作流程的清晰度,它具有如下特征: 1、清晰的可视化:对 CI/CD pipelines, 可以快速直观的观察项目 pipeline 状态。
2、pipeline 可编辑:引导用户通过直观的、可视化的过程来创建 Pipeline,从而使 Pipeline 的创 建变得平易近人。
3、pipeline 精确度:通过 UI 直接介入 pipeline 的中间问题。
#安装 BlueOcean 插件 主页—>系统管理→插件管理→可选插件—>过滤 BlueOcean→直接安装
![](https://img.haomeiwen.com/i21199738/0a9e46e0bccec2b2.png)
安装完成后,重启 jenkins
http://192.168.172.163:30002/restart
重启进入 jenkins 之后,在主页左侧可以看到打开 Blue Ocean
![](https://img.haomeiwen.com/i21199738/6001af93c8f838db.png)
![](https://img.haomeiwen.com/i21199738/2494c18446991a63.png)
![](https://img.haomeiwen.com/i21199738/36f6f21c3e60fdfe.png)
![](https://img.haomeiwen.com/i21199738/de106ebbed061f9c.png)
![](https://img.haomeiwen.com/i21199738/803e8f16d50605c4.png)
![](https://img.haomeiwen.com/i21199738/0ebd462a0dd621e7.png)
![](https://img.haomeiwen.com/i21199738/ac9d6ec3e3d7dc39.png)
![](https://img.haomeiwen.com/i21199738/e0ec9a60c3655233.png)
![](https://img.haomeiwen.com/i21199738/cb4404b977f8b12e.png)
Jenkins 实现 k8s 应用按照指定版本回滚
回到首页:
新建一个任务------>输入一个任务名称处输入 jenkins-variable-test-deploy-rollout------>流水 线------>确定------>在 Pipeline script 处输入如下内容
node('testhan') {
stage('git clone') {
git url: "https://github.com/luckylucky421/jenkins-rollout"
sh "ls -al"
sh "pwd"
}
stage('select env') {
def envInput = input(
id: 'envInput',
message: 'Choose a deploy environment',
parameters: [
[
$class: 'ChoiceParameterDefinition',
choices: "devlopment\nqatest\nproduction",
name: 'Env'
]
]
)
echo "This is a deploy step to ${envInput}"
sh "sed -i 's/<namespace>/${envInput}/' getVersion.sh"
sh "sed -i 's/<namespace>/${envInput}/' rollout.sh"
sh "bash getVersion.sh"
// env.WORKSPACE = pwd()
// def version = readFile "${env.WORKSPACE}/version.csv"
// println version
}
stage('select version') {
env.WORKSPACE = pwd()
def version = readFile "${env.WORKSPACE}/version.csv"
println version
def userInput = input(id: 'userInput',
message: '选择回滚版本',
parameters: [
[
$class: 'ChoiceParameterDefinition',
choices: "$version\n",
name: 'Version'
]
]
)
sh "sed -i 's/<version>/${userInput}/' rollout.sh"
}
stage('rollout deploy') {
sh "bash rollout.sh"
}
}
![](https://img.haomeiwen.com/i21199738/1556f1a7c0d56071.png)
点击应用->保存-立即构建
![](https://img.haomeiwen.com/i21199738/cc2d632c8db850f4.png)
![](https://img.haomeiwen.com/i21199738/12ce51a68b123109.png)
![](https://img.haomeiwen.com/i21199738/11b817dc5830317a.png)
网友评论