环境要求
完整的K8S环境+gitee账号+dockerhub账号
实现目标
由于是简单测试 本次使用一个简单的nginx镜像 然后自定义首页来实现效果
简单的逻辑结构
1 首先梳理整个步骤 首先开发人员需要在本地调试代码并且运维人员写好dockerfile 同时写好K8S的yaml,本次实验用的是jenkinsfile 所以还需要编写好jenkinsfile
2 简单的代码目录结构如下
3 结构梳理
- jenkins点击构建之后回去代码库拉代码
- 由于我们选择了Jenkinsfile 所以代码拉去之后会按照Jenkinsfile 里面的内容执行
-
Jenkinsfile 内容为pipeline 由Groovy 编写 所以我们按照我们的需求编写 我的pipeline如下
node('haimaxy-jnlp') { stage('Prepare') { echo "1.Prepare Stage" checkout scm script { build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() if (env.BRANCH_NAME != 'master') { build_tag = "${env.BRANCH_NAME}-${build_tag}" } } } stage('Test') { echo "2.Test Stage" } stage('Build') { echo "3.Build Docker Image Stage" sh "docker build -t zfno111/nginx-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 zfno111/nginx-demo:${build_tag}" } } stage('Deploy') { echo "5. Deploy Stage" if (env.BRANCH_NAME == 'master') { input "确认要部署线上环境吗?" } sh "sed -i 's/<BUILD_TAG>/${build_tag}/' k8s.yaml" sh "sed -i 's/<BRANCH_NAME>/${env.BRANCH_NAME}/' k8s.yaml" sh "kubectl apply -f k8s.yaml --record" } }
关于上面的内容做一个简单理解:
node('haimaxy-jnlp') jenkins部署内容 实现动态slave,
stage('Prepare') 这个阶段取出build_tag这个后续也会给docker镜像用,如果分支是主分支名字前面会加上master
Build阶段完成docker镜像打包 按照dockerfile打包,这里会用到build_tag
Push阶段 把docker推送到dockerhub上并且打上标签
Deploy阶段 实施部署按照K8S.yaml里面的内容实现 同时更改一些标签
K8S.yaml内容如下
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-demo namespace: default spec: selector: matchLabels: app: nginx-demo template: metadata: labels: app: nginx-demo spec: containers: - image: zfno111/nginx-demo:<BUILD_TAG> imagePullPolicy: IfNotPresent name: nginx-demo env: - name: branch value: <BRANCH_NAME>
这里完成将容器部署到集群的操作
接下来看下实战效果
比如我们修改了Nginx的前端页面
echo "这是第一次测试的首页文件" > index.html
然后我们在jenkins上面打包

等待完成之后
由于我们没有使用svc和igress所以直接curl K8S内部的集群端口
发现正常
后记。。 其实在做整个CD之前还有需要插件和细节 比如JENKINS master-slave的动态部署 jenkins优化 与K8S的关联等等等 后续有时间再来详解