k8s笔记20--基于 K8S 的 cicd 概述

  • 1 介绍
  • 2 方案实施
    • 2.1 Jenkins + kubectl + k8s
    • 2.2 Jenkins + helm + k8s
    • 2.3 Zadig + helm + k8s
  • 3 注意事项
  • 4 说明

1 介绍

近年来云服务|原生发展迅猛,企业上云已经成为家常便饭。当企业大量服务上云后,如何在云上快速部署、更新服务就是一个必须面对的问题。本文结合当下经典方案,分享以下3种常见基于 K8S的CICD方案,并加以案例介绍。

方案 概述 评价
jenkins + kubectl + k8s jenkins job实现镜像构建和服务更新, 服务更新的时候直接通过kubeclt命令实现 jenkins 比较经典,简单易用,适合新入门的用户,UI和附加功能较少
jenkins + helm + k8s jenkins job实现镜像构建和服务更新, 服务部署时候使用helm chart模式,服务更新的时候直接通过helm 命令实现 使用helm chart管理服务,可快速通过多个values.yaml部署不同环境的服务,同时具备jenkins的简单医用特性,UI和附加功能较少
zadig + helm + k8s 直接使用zadig实现镜像构建和服务更新,服务部署的时候使用helm chart模式 既有helm chart优秀功能,又具备良好的UI,且具备多个优秀的附加功能

注意:
此处第3种方案中Zadig 是 KodeRover 公司基于 Kubernetes 自主设计、研发的开源分布式持续交付 (Continuous Delivery) 产品,其可以被很多大公司内部的服务部署&发布系统代替。

本文受限于篇幅和时间,只出略讲了3种方案,很多实施细节暂未来得及补充,后续笔者会基于本文出一系列 基于K8S的CICD实战教程,并将链接更新补充在此处,欢迎有需要的小伙伴关注!

2 方案实施

上述已经介绍了3种主流 k8s cicd 方案的优缺点,此处继续通过案例进一步详细说明。

2.1 Jenkins + kubectl + k8s

本方案主要使用 build_docker 来构建镜像,然后通过 deploy_kubectl 将镜像发布到集群,以下为相关参数和 jenkins script脚本说明。

build_docker job 如下
1)图1 主要参数

build 流程中,我们一般提供给用户 git repo名称、分支、镜像repo-name 等几个核心参数即可,也可按需添加附加参数。
2)图2 执行结果

执行过程中我们可以动态生成镜像tag,并把它输出在 description栏目,方便用户获取镜像 tag。
3)pipeline script

gitlab_repo = "${params.gitlab_repo}"
def split = gitlab_repo.split("/")
def repo_name = split[1]
build_node = 'knode-pc'
branch_name = "${params.branch_name}"
dockerhub_repo = "${params.dockerhub_repo}"
repo_url = "git@xx.xx.xx.xx:${gitlab_repo}.git"import java.text.SimpleDateFormat;
def createVersion() {def dateUnix = ((new Date().time + 8*3600*1000) / 1000).intValue()Date dateObj =  new Date( ((long)dateUnix) * 1000 )String ymd = new SimpleDateFormat("yyyy.MM.dd-HHmm").format(dateObj)return "${ymd}"
}
image_version = createVersion()
work_dir = "${repo_name}-${image_version}"build_user=""
node{wrap([$class: 'BuildUser']) {build_user = env.BUILD_USER}
}
println("build_user=${build_user}")default_description = "${build_user} ${gitlab_repo}/${branch_name}:${image_version}"
currentBuild.description = "${default_description}"pipeline {agent {node {label "${build_node}"}}environment {repo_name1 = "${repo_name}"}stages {stage('Clean workspace') {agent {node {label "${build_node}"}}steps {sh """rm -rf ${work_dir}"""}}stage("Clone Repo"){agent {node {label "${build_node}"}}steps {dir("${work_dir}"){deleteDir()git(url: "${repo_url}",credentialsId: '73d34b09-yourCredentialsId-142643489274',branch: "${branch_name}")sh """pwd && ls -la"""}}}stage('Build docker images') {agent {node {label "${build_node}"}}steps {dir("${work_dir}"){sh """if [ ! -f Dockerfile ]thenecho "No available Dockerfile in workspace"exit 0fipwdlsdocker build -f Dockerfile -t ${dockerhub_repo}:${image_version} .docker push ${dockerhub_repo}:${image_version}docker rmi ${dockerhub_repo}:${image_version}"""}}}stage('Set tag') {agent {node {label "${build_node}"}}steps {dir("${work_dir}"){sh """git tag ${branch_name}_${image_version}git push origin ${branch_name}_${image_version}"""}sh """rm -fr ${work_dir}"""}}}post {always {echo 'I have finished'}success {sh """echo "@${build_user} build_docker notify: ${gitlab_repo}/${branch_name}:${image_version}, succeed!""""}failure {sh """echo "@${build_user} build_docker notify: ${gitlab_repo}/${branch_name}:${image_version}, failed!""""}}
}

deploy_kubectl job 如下:
1)图1主要参数

deploy 流程中,我们一般提供用户命名空间选项、deployment_name选项、docker repo 、docker image tag、container名称等选项即可

2)图2执行结果

3)pipeline script

namespace = "${params.namespace}"
deployment_name = "${params.deployment_name}"
dockerhub_repo = "${params.dockerhub_repo}"
image_version = "${params.image_version}"
container_name = "${params.container_name}"
build_node = 'knode-pc'default_description = "${namespace}/${deployment_name} ${image_version}"
currentBuild.description = "${default_description}"pipeline {agent { node { label "$build_node" } }stages {stage('check-deploy') {agent { node { label "$build_node"} }steps {echo "Hello, check deployment ${namespace}/${deployment_name} exists"sh "/usr/bin/kubectl --kubeconfig /home/xg/.kube/config -n ${namespace} get deploy ${deployment_name}"}}stage('deploy') {agent { node { label "$build_node" } }steps {echo 'Hello, deploy to k8s'sh """/usr/bin/kubectl --kubeconfig /home/xg/.kube/config -n ${namespace} set image deployment/${deployment_name} ${container_name}=ccr.ccs.tencentyun.com/${dockerhub_repo}:${image_version}"""}}}post {always {echo 'I have finished'}success {sh """echo "curl deploy_kubectl: ${namespace}/${deployment_name} ${image_version}, succeed!""""}failure {echo "${namespace}/${deployment_name} ${image_version}, failed!"sh """echo "curl deploy_kubectl notify: ${namespace}/${deployment_name} ${image_version}, failed!""""}}
}

此处为了使文档相对简洁,暂未详细介绍 jenkins 相关内容,若有需要可参考笔者 jenkins 相关博文:
docker笔记3–配置jenkins
Devops - cicd 01-08 系列文章

2.2 Jenkins + helm + k8s

本方案主要使用 build_docker 来构建镜像,然后通过 deploy_helm 将镜像发布到集群,以下为相关参数和 jenkins script脚本说明。

build_docker job 直接复用上面的流程,此处就不再单独介绍了。

deploy_helm job 如下:
1)图1主要参数

deploy_helm 流程中,我们一般提供用户 app name选项、命名空间选项、镜像版本选项、服务环境选项(用于区分不同的 {deploy_env}-values.yaml)

2)图2执行结果

3)pipeline script

helm_app_name = "${params.helm_app_name}"
namespace = "${params.namespace}"
deployment_name = "${params.helm_app_name}"
version = "${params.version}"
deploy_env = "${params.deploy_env}"
build_node = 'knode-pc'
repo_url = "git@xx.xx.xx.xx:root/sre-helm.git"import java.text.SimpleDateFormat;
def createVersion() {def dateUnix = ((new Date().time + 0) / 1000).intValue()Date dateObj =  new Date( ((long)dateUnix) * 1000 )String ymd = new SimpleDateFormat("yyyy.MM.dd-HHmm").format(dateObj)return "${ymd}"
}
ymd = createVersion()
image_version = createVersion()
work_dir = "deploy-helm-${image_version}"build_user=""
node{wrap([$class: 'BuildUser']) {build_user = env.BUILD_USER}
}
println("build_user=${build_user}")default_description = "${build_user} ${namespace}/${deployment_name} ${version}"
currentBuild.description = "${default_description}"pipeline {agent { node { label "${build_node}" } }stages {stage('check-deploy') {agent { node { label "${build_node}"} }steps {echo 'Hello, check deployment exists'sh """helm --kubeconfig /home/xg/.kube/config -n ${namespace} status ${deployment_name}"""}}stage("Clone Repo"){agent {node {label "${build_node}"}}steps {dir("${work_dir}"){deleteDir()git(url: "${repo_url}",credentialsId: '73d34b09-yourCredentialsId-142643489274',branch: "helm")sh """pwd && ls -la"""}}}stage('deploy') {agent { node { label  "${build_node}"} }steps {echo 'Hello, deploy to k8s'dir("${work_dir}"){sh """helm --kubeconfig /home/xg/.kube/config upgrade ${deployment_name} ./${deployment_name} -n ${namespace} -f ./${deployment_name}/${deploy_env}-values.yaml --set image.tag=${version}"""}}}}post {always {echo 'I have finished'echo "rm -fr ./${work_dir}"}success {echo "${namespace}/${deployment_name} ${version}, succeed!"sh """echo "curl succeed message here""""}failure {echo "${namespace}/${deployment_name} ${version}, failed!"sh """echo "curl failed message here""""}}
}

此处为了使文档相对简洁,暂未详细介绍 helm 相关内容,若有需要可参考笔者 helm 相关博文:
k8s笔记7.1–快速入门helm
k8s笔记7.2–搭建私有helm仓库
k8s笔记7.3–基于gitlab、jenkins、helm、k8s的CI/CD
k8s笔记7.4–helm构建无端口类型chart

2.3 Zadig + helm + k8s

本方案使用helm chart 的方式将服务部署在集群中,然后使用 zadig 的 ci 和 cd 功能实现服务的构建和部署。
zadig 中提供给用户使用的是工作流,类似于jenkins 中的 job|pipeline,一般只需要给项目提供一个通用的构建部署工作流 和 一个通用的交付物部署工作流即可, 如下图所示。

1)构建部署=服务镜像+发布服务

2)交付物部署=已有镜像发布服务


此处为了使文档相对简洁,暂未详细介绍 zadig 相关内容,若有需要可参考笔者 zadig 相关博文或官方文档:
k8s笔记14–初次体验 开源云原生软件交付平台zadig

3 注意事项

  1. 笔者kubectl 部署服务的时候需要输入多个参数,包括 deployment 名称 和 container 名称,实际上很多用户不一定会关注容器名称,因此我们也可以通过 kubectl apply -f app-deploy.yaml 的方式来更新服务,更新过程中通过 shell 将 ymal 中的image tag替换即可。
  2. zadig 既可部署 k8s yaml 项目,也可以 helm chart 项目; 但是部署 yaml 项目的时候通常需要删除后重新部署,部署 helm chart 的时候可以在已有 app 存在的情况下部署,因此实际项目中建议有限使用 helm chart 部署项目。

4 说明

核心软件环境:
ubuntu server 18.04
k8s 1.23.6
Jenkins 2.354
zadig 1.12.0 (k8s 1.19.3)
helm v3.6.1
主要参考文档:
jenkins 官方文档
helm 官方文档
zadig官方文档

k8s笔记20--基于 K8S 的 cicd 概述相关推荐

  1. k8s部署zabbix_基于k8s平台的Zabbix压力测试

    本文以 2019 年 1 月 16 日 Webinars 课程内容编写 内容目录 视频下载地址: k8s 介绍 kubernetes,简称 K8s,是用 8 代替 8 个字符"ubernet ...

  2. k8s笔记22--使用fluent-bit采集集群日志

    k8s笔记22--使用fluent-bit采集集群日志 1 介绍 2 部署 & 测试 2.1 获取安装 fluent-bit 2.2 直接采集日志到 es 集群 2.3 直接采集日志到 kaf ...

  3. Docker基础、进阶笔记,为k8s的学习预预热

    标题 Docker基础.进阶笔记,为k8s的学习预预热 笔记来源于视频: 狂神docker基础篇 狂神docker进阶篇 笔记中图片有些取自于:这位博主的两篇docker笔记中的一些图片 百度云笔记工 ...

  4. 基于 K8S 构建数据中心操作系统

    在 12 月 22 日 ECUG 的下午场 ,七牛云容器计算部技术总监袁晓沛为大家带来了主题为<基于 K8S 的 DCOS 之路>的精彩分享,向大家介绍了七牛容器云目前 K8S 的状况和产 ...

  5. javaweb k8s_K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程...

    K8S微服务核心架构学习指南 ASP.NET Core微服务基于K8S 架构师必备Kubernetes教程 课程内容是关于Kubernetes微服务架构学习课程,基于K8S开展ASP.NET核心进行微 ...

  6. 【要闻】如何基于K8s管理1600个微服务?某数字化银行秘诀公开

    Cloud Foundry Foundation宣布KubeCF为新孵化项目 Cloud Foundry Foundation是开放源代码项目的聚集地,简化了开发人员的体验,近日其宣布,KubeCF已 ...

  7. k8s笔记14--初次体验 开源云原生软件交付平台zadig

    k8s笔记14--初次体验 开源云原生软件交付平台zadig 1 介绍 2 部署&测试 2.1 部署 2.2 测试 3 注意事项 4 说明 1 介绍 Zadig 是 KodeRover 公司基 ...

  8. kubernetes(K8S)学习笔记P6:K8s集群|java项目部署

    kubernetes(K8S)学习笔记P6:K8s集群|java项目部署 8.集群资源监控 8.1概述 8.2搭建集群监控平台系统 8.2.1部署prometheus 8.2.3部署Grafana 8 ...

  9. 内网环境基于 k8s 的大型网站电商解决方案(一)

    一.环境说明 1.所有系统为rockylinux8.6最小化安装,所有服务器均为内网,只有manager为双网卡(可访问互联网),提供内网yum源.DNS解析.时间同步等 2. k8s搭建高可用集群版 ...

  10. 基于K8S构建企业级Jenkins CI/CD平台实战(三) 之 带你实战Spring boot/Cloud 项目 CI/CD jenkins自动化构建、部署过程

    需要环境 Git(GitLab) Harbor 私服 kubernetes-plugin 使用 Kubernetes jenkins 通过前面三篇我们已经了解了jenkins和 kubernetes- ...

最新文章

  1. ubuntu apache2配置详解(含虚拟主机配置方法)
  2. mysql多行合并成一行_数据文件合并与拆分
  3. 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器
  4. kill命令---Linux学习笔记
  5. 12如何隐藏dock栏_iPhone边框“变色”壁纸,隐藏Dock栏
  6. Prometheus Alertmanager报警组件
  7. C#反射Assembly 详细说明
  8. LINUX下载编译SDL2
  9. Educational Codeforces Round 26 - A, B, C 思维
  10. 本地创建MYSQL数据库详解
  11. c语言中windows头文件,windows与linux 标准c语言头文件
  12. GoLang之什么是CSP(1)
  13. 2023昆明理工大学计算机考研信息汇总
  14. 华胜天成收购中天安泰10%股权 出手网络信息安全
  15. 四大名著丨折射中国人性的四面镜子
  16. Fiddler简单使用手册
  17. 【C/C++】泛型栈
  18. 密码套件cipher suite
  19. DL在地球物理中的应用及发展趋势
  20. Matlab quiver函数用法 - 画矢量箭头图

热门文章

  1. Wamp的介绍和配置,解决安装时一些错误和配置上的一些需要,轻轻松松搭建以为window系统的服务器
  2. 好用的微信群管理软件
  3. mysql查询出现ambiguous的问题
  4. 杂谈:中国互联网早已经被群雄割据各自为王了
  5. 小程序的今天就是微信指数的明天
  6. 工作缺点和不足及措施_【工作中存在的问题和不足及改进措施】_工作中的不足与改进_工作中不足及改进措施...
  7. 腾讯 MIG 移动互联网事业群 米格招聘
  8. “打印机安装失败,请检查打印服务”问题解决方案
  9. 软件测试技术+HR面试
  10. windows使用密钥登录linux服务器