环境背景
- 已实现 k8s系列(一) - 使用kubeadm安装kubernetes(k8s)
- 已实现 k8s系列(二) - jenkins+kubernetes(k8s)+docker持续集成与部署(CI/CD)
- km - 2cpu - 4g内存 - ip - 192.168.23.39
- node1 - 2cpu - 2G内存 - ip - 192.168.23.40
- node1 - 2cpu - 2G内存 - ip - 192.168.23.41
- 基于 k8s系列(二) 已有可正常运行的jenkins工作任务
jenkins 已按文章安装好 kubernetes 与 Git Parameter 扩展
- git 仓库地址(CI/CD所需文件及代码)https://gitee.com/lnamp/k8s.git master tag为:master-20220401-00 dev tag为:dev-20220401-00
- 所有操作基于官方文档说明
增加jenkins构建参数
- 勾选 This project is parameterized
1.增加 docker_registry 构建参数
- 点击增加参数选择 - String Parameter
- 填充如下数据

2.增加 banch_name 构建参数
- 点击增加参数选择 - Git Parameter
- 参数类型选择分支
- 填充如下数据

3.增加 tag_name 和 dev_tag_name 构建参数
- 点击增加参数选择 - Git Parameter
- 参数类型选择标签
- 填充如下数据

- 点击高级填充表填过滤
- tag_name 填写 master*
- dev_tag_name 填写 dev*
- 修改排序方式为倒叙

4.构建显示
- 若首次构建无法出现分支与标签,需要先构建一次才会显示

修改Pipeline脚本
1.条件触发
script{
if(branch_name == "origin/master"){
#master构建
} else {
#dev构建
}
}
2.相关 Deployment与Service配置在git仓库内go_app.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-app-${branch_name}
labels:
app: goweb${branch_name}
spec:
selector:
matchLabels:
app: goweb${branch_name}
replicas: 10
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: goweb${branch_name}
spec:
containers:
- name: go-app-${branch_name}
image: ${docker_registry}/k8s:${tag_name}
imagePullPolicy: Always
ports:
- name: http
containerPort: 80
livenessProbe:
httpGet:
port: 80
path: /ping
initialDelaySeconds: 2
periodSeconds: 60
timeoutSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
name: go-app-${branch_name}
spec:
type: ClusterIP
selector:
app: goweb${branch_name}
ports:
- port: 80
protocol: TCP
targetPort: 80
3.最终脚本
pipeline {
agent any
stages {
stage('clone') {
steps {
echo 'clone' // 拉取代码
git credentialsId: 'gitee_userid', url: 'https://gitee.com/lnamp/k8s.git'
sh "git checkout ${branch_name}"
sh "sed -i 's/\${docker_registry}/${docker_registry}/g' go_app.yaml"
script{
//替换环境变量
if(branch_name == "origin/master"){
sh "sed -i 's/\${branch_name}/master/g' go_app.yaml"
sh "sed -i 's/\${branch_name}/master/g' run.go"
sh "sed -i 's/\${tag_name}/${tag_name}/g' go_app.yaml"
sh "sed -i 's/\${tag_name}/${tag_name}/g' run.go"
} else {
sh "sed -i 's/\${branch_name}/dev/g' go_app.yaml"
sh "sed -i 's/\${branch_name}/dev/g' run.go"
sh "sed -i 's/\${tag_name}/${dev_tag_name}/g' go_app.yaml"
sh "sed -i 's/\${tag_name}/${dev_tag_name}/g' run.go"
}
}
}
}
stage('build go') {
steps {
echo 'build go' // 编译可执行文件
sh "export GOPROXY='https://goproxy.cn' && go mod tidy && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./run run.go"
sh "mkdir -p work && cp -a run ./work/ && cp -a static ./work/"
}
}
stage('make image') {
steps {
echo 'make image' // 制作代码镜像
script{
if(branch_name == "origin/master"){
sh "docker build -f Dockerfile -t ${docker_registry}/k8s:${tag_name} ."
} else {
sh "docker build -f Dockerfile -t ${docker_registry}/k8s:${dev_tag_name} ."
}
}
}
}
stage('push image') {
steps {
echo 'push image' // 推送到私有仓库
script{
if(branch_name == "origin/master"){
sh "docker push ${docker_registry}/k8s:${tag_name}"
} else {
sh "docker push ${docker_registry}/k8s:${dev_tag_name}"
}
}
}
}
stage('deploy') {
steps {
echo 'deploy' // 部署代码
kubeconfig(caCertificate: '''-----BEGIN CERTIFICATE-----
MIIC/jCCAeagAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
cm5ldGVzMB4XDTIyMDQwMTAxNDU0NVoXDTMyMDMyOTAxNDU0NVowFTETMBEGA1UE
AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ6u
P4IG/t/uorMEiVgseW1llz/XyO2BCvl7Hu1dtS1NNu7360H/fTs+HqP7Ss8Qf5Yh
di3DbClKfERUHD8nKLztocSrrJNbKhniQOpI9tUJIbMVkCj5iBWthHrrQshdPB90
xP5skLM+aMoraIJqWdvzzcDKdjfi0pV6XM37YOovYT5e8IzTJ5a24dWCCu5z7J1+
rEQPxOp9AOyqctpUyneA5LK0nxxNs3Vqv16t97IzTPttAiRfUfNEVDswUqF/pspd
aBM3u3saQ/08BhKn45lGNog3huC5kViT0U61Z84EuX/a+YOWxPAIWnSnRrwl7oFR
fBpIKNJq59SlYtanVskCAwEAAaNZMFcwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
/wQFMAMBAf8wHQYDVR0OBBYEFJ3uWtxk0fbtEy5E+bodzUpPojErMBUGA1UdEQQO
MAyCCmt1YmVybmV0ZXMwDQYJKoZIhvcNAQELBQADggEBAGgJH5enPPtMnQwyjtJm
PH13dV/CU/R+8i3w4Mz567otNNTlWNZ5bHb6ddKUKQ6iaSMJ3y/O/Oi1RAVFAGA2
6ffL5BWiQyywNdzjUdd5nPFz97BfDqm5yIEVdIecSNnzbe47IDyXl0vHegp31DRf
YHGOQ0PTOJz1rJ7qKNehsM3j5p2Hg22o4IT6EqaXNRS/tlaCb5cG5OLil+vAebl/
FNfII8/ORpMN6KFGH6iC1TBsXPzn1Y6vzLv96758L8DpLmMBZ/z9f+s/ZyPESrxo
tkCZ89YwTMchrxHg0uluRnh8MQaUPgm1itTIdJNrwet1zBrQOogkOfFZdfunSkdy
0yE=
-----END CERTIFICATE-----''', credentialsId: 'kubernetes-key', serverUrl: 'https://192.168.23.39:6443') {
sh "kubectl apply -f go_app.yaml"
}
}
}
}
}
查看结果
1.查看 kubernetes(k8s) pods 发布结果

2.校验 kubernetes(k8s) 最终发布

3.所需shell命令
kubectl get pod
kubectl get svc
curl svc_ip/ping