【Kubernetes系列】第8篇 CI/CD之全流程实践

简介: 前言本实践中已经的示例代码及jenkins-agent镜像已经推送归档至github,-->传送门注意本实践中均为内网数据,你测试时一定要改为自己的环境的有效数据。由于本实践涉及组件较多,若有操作不明确的话,你可以后台留言,我们一起完善。

前言

  1. 本实践中已经的示例代码及jenkins-agent镜像已经推送归档至github,-->传送门
  2. 注意本实践中均为内网数据,你测试时一定要改为自己的环境的有效数据。
  3. 由于本实践涉及组件较多,若有操作不明确的话,你可以后台留言,我们一起完善。
  4. 具体操作时若有不清楚,或是错误可以留言,大家一起解决。

1. 准备基础数据

  1. 配置gitlab
  • 创建项目
  • 上传示例代码

_注_: 本次示例使用的gitlab项目地址为:http://gitlab.hanker.com/colynn/hanker-hello.git

  1. 配置harbor
  • 创建项目, 用于存储构建的镜像
    _注_: 本次示例使用的harbor地址为 10.0.0.185:5000/hanker/hanker-hello:v1
  1. jenkins 验证信息
  • 添加 gitlab 帐号信息

_操作指引_:【Credentials】-> 【System】-> 【Global credentials】-> 【Add Credentials】

5

  • harbor 信息

_操作指引_:【Credentials】-> 【System】-> 【Global credentials】-> 【Add Credentials】

6

  • k8s namespace验证信息

在你的k8s master节点上执行如下操作:

1.创建serviceaccount

$ kubectl -n devops create serviceaccount jenkins-robot

命令输出:

serviceaccount/jenkins-robot created

2.角色绑定

$ kubectl -n devops create rolebinding jenkins-robot-binding --clusterrole=cluster-admin --serviceaccount=devops:jenkins-robot

命令输出:

rolebinding.rbac.authorization.k8s.io/jenkins-robot-binding created

3.获取 ServiceAccount

$ kubectl -n devops get serviceaccount jenkins-robot -o go-template --template='{{range .secrets}}{{.name}}{{"\n"}}{{end}}'

jenkins-robot-token-n8w6b

4.基于base64解码 ServiceToken

$ kubectl -n devops get secrets jenkins-robot-token-n8w6b -o go-template --template '{{index .data "token"}}' | base64 --decode

命令输出:

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZXZvcHMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiamVua2lucy1yb2JvdC10b2tlbi1uOHc2YiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJqZW5raW5zLXJvYm90Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOTcyZTY0OGYtMTYxZC00NmM5LWI0ZjgtYjFkNTdlOWY4NTBjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRldm9wczpqZW5raW5zLXJvYm90In0.ArQvcaEqCaeU1ZcJ6nOC5rLaTZr_vLDrpLCt87asltMUWj2gSli_mXUTrl09hBnBDXI3A1D4rJXHKLHjIAA4nN8qRIRGbpqSNzDwmqJr-jmmmWWZFrZ3n3Al9-13KJnNOK8pcWr70rt3Rsigt4B6CIQ0-ZLK8BZhvROJSifeOfJ6xe2KBqdXBv1ccZZZfEhPLgGbaR5yWm5jLvOMr2MQiPDrZoHOEkcMt-C0xipytOp4sJCJ4bQhb-UoMu1owYydxbd6O7xO71fvqP_bMDpZXC601nA2ggK7h-vi6CJffHv5MM59q8X_DWe1NnZS6KXiMmkXqAmBn10Yu20PNj-kjg

5.添加 Secret text验证信息

_操作指引_:【首页】->【Credentials】-> 【System】-> 【Global credentials】-> 【Add Credentials】-> 选择【Secret text】类型

然后将上一步 解码的结果 更新至 Secret, Pipeline 中

7

2. 如何创建 jenkins pipeline

1. 创建jenkins pipeline item

_操作指引_:【首页】->【New Item】

8

2. pipeline script 步骤说明

_注_: pipeline主要包含三个阶段(检出代码、制作镜像、部署服务),下面跟大家解释下,如何编写pipeline, 借助Pipeline Syntax生成的只是部分代码,你可以根据语言规范将其完善。

1.阶段1,检出代码

_操作指引_:【首页】->【hanker-hello-demo】-> 【Pipeline Syntax】

9

_注_: 本实践中选取的 git: Git 类型,当然你也可以选择 checkout: Check out from version control

获取到该步骤的脚本

git credentialsId: 'gitlab-project-auth', url: 'http://gitlab.hanker.com/colynn/hanker-hello.git'

2.阶段2,构建镜像
_操作指引_:类似于 阶段1,

10

完善获取该步骤脚本

script {
    withDockerRegistry(credentialsId: 'harbor-auth', url: 'http://10.0.0.185:5000') {
        def customImage =  docker.build("10.0.0.185:5000/devops/hanker-hello:v1")
        customImage.push()
    }
}

_注_: 支持本阶段需要jenkins-agent镜像里包含docker命令。

3.阶段3. 部署服务

_参考_: jenkins kubernetes cli plugin

_注_: 支持本阶段需要jenkins-agent镜像里包含kubectl命令。

3. 设置 pipeline

_注_:

  • General/ Build Triggers/ Advanced Project Options 这三块你可以根据自己需要设置,将各阶段的脚本合并,更新至 Pipline -> Script内。

合并后的pipeline脚本内容如下:

pipeline {
    agent any
    stages {
        stage('checkout') {
            steps {
                git credentialsId: 'gitlab-project-auth', url: 'http://gitlab.hanker.com/colynn/hanker-hello.git'    
            }
        }
        
        stage('docker-publish') {
            steps{
                script {
                    withDockerRegistry(credentialsId: 'harbor-auth', url: 'http://10.0.0.185:5000') {
                        def customImage =  docker.build("10.0.0.185:5000/devops/hanker-hello:v1")
                        customImage.push()
                    }
                }
            }
        }
        
        stage('application-deploy') {
            steps {
                withKubeConfig([credentialsId: '5a5517f3-3d38-459d-bafc-12b55beeb588', serverUrl: 'https://10.0.0.182:6443']) {
                    sh '/usr/bin/kubectl apply -f k8s-setup.yml'
                }
            }
        }
    }
}

11

3. 触发构建

12

4. 结果确认

1.确认 jenkina-agent 启动状态;

$ kubectl -n devops get pods |grep jnlp
jnlp-sh8zl                                 1/1     Running   0          14s

// 查看jenkins-agent pod日志
$ kubectl -n devops logs -f [jenkins-agent-pod-name]

_注_: 如果长时间没有启动jenkins-agent, 可以确认下集群内是否有足够的资源。

2.确认pipeline 执行状态;

13

3.确认harbor镜像仓库里是否已经有新推送的镜像

14

_注_: harbor里的项目是需要你先创建好的,不然推送时会报错。

4.确认部署的服务状态

k8s master节点上执行如下操作:

$ kubectl -n devops get pod,deployment,svc,ingress |grep hanker-hello 

pod/hanker-hello-5b7586f86d-5j7kk              1/1     Running   0          173m


deployment.extensions/hanker-hello              1/1     1            1           3h8m
service/hanker-hello-svc          ClusterIP   10.233.22.19    <none>        8080/TCP             3h8m
ingress.extensions/hanker-hello-ingress              hanker-hello-demo.dev.hanker.net                   80      3h8m

15

附录

自定义jenkins-agent镜像

## 基于 https://github.com/Kubernetes-Best-Pratice/jenkins-jnlp-agent.git

$ git checkout  https://github.com/Kubernetes-Best-Pratice/jenkins-jnlp-agent.git

$ cd jenkins-jnlp-agent
$ docker build .
$ docker tag tag-name custom-private-repository-addr

_注_: 你也可以基于基础镜像创建自定义的镜像

可以做的更完善

  1. 配置webhook, 自动触发jenkins job;
  2. 当前我们实践时构建的镜像版本使用的是固定的, 你是否可以将其替换为依赖pipeline环境变量或是传参的形式,将其变是更有意义;
  3. 上一篇文章中在设置【配置Kubernetes Pod Template】时,我们提到可以挂载主机或是网络共享存储,你是否可以通过这个将你的构建快起来;
  4. 我们的示例代码使用的go, 直接是镜像内打包,如何更好的就好的其他语言的构建,你可以参考Using Docker with Pipeline
  5. 你想过如何下载构建过程中的产物吗,等等。

参考链接 :

  1. https://github.com/jenkinsci/kubernetes-cli-plugin/blob/master/README.md
  2. 下载kubectl: https://docs.docker.com/ee/ucp/user-access/kubectl/
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
20天前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
150 1
|
6月前
|
存储 负载均衡 测试技术
ACK Gateway with Inference Extension:优化多机分布式大模型推理服务实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with Inference Extension组件,在Kubernetes环境中为多机分布式部署的LLM推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
7月前
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
7月前
|
存储 人工智能 物联网
ACK Gateway with AI Extension:大模型推理的模型灰度实践
本文介绍了如何使用 ACK Gateway with AI Extension 组件在云原生环境中实现大语言模型(LLM)推理服务的灰度发布和流量分发。该组件专为 LLM 推理场景设计,支持四层/七层流量路由,并提供基于模型服务器负载感知的智能负载均衡能力。通过自定义资源(CRD),如 InferencePool 和 InferenceModel,可以灵活配置推理服务的流量策略,包括模型灰度发布和流量镜像。
|
8月前
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
8月前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
8月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
10月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
5月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
184 9
|
5月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。

热门文章

最新文章

推荐镜像

更多