【Kubernetes系列】第7篇 CI/CD之组件部署

简介: 前言应对敏捷开发的需求,对CI(持续集成))/CD(持续交付)的提出了更高的标准,今天来讨论下,如何基于开源组件(gitlab/jenkins/harbor/kubernetes)使用CI/CD,赋能团队的开发、运维。

前言

应对敏捷开发的需求,对CI(持续集成))/CD(持续交付)的提出了更高的标准,今天来讨论下,如何基于开源组件(gitlab/jenkins/harbor/kubernetes)使用CI/CD,赋能团队的开发、运维。

核心组件

组件名称 版本 备注
kubernetes v1.15.3 10.0.0.182:6443
jenkins 2.176.2 集群内部署/ namespace: devops
gitlab 11.8 主机部署
harbor v1.7.4 docker-compose部署

基本流程

  1. 在GitLab创建对应的项目。
  2. 开发者将代码提交到GitLab。
  3. Jenkins创建对应的任务(Job),集成该项目的Git地址和Kubernetes集群。
  4. 如有配置钩子,推送(Push)代码会自动触发Jenkins构建,如没有配置钩子,需要手动构建。
  5. Jenkins控制Kubernetes(使用的是Kubernetes插件)创建Jenkins Slave。
  6. Jenkins Slave根据流水线(Pipeline)定义的步骤执行构建。

    1. 检出代码、打包、编译。
    2. 通过Dockerfile生成镜像。
    3. 将镜像提送(Push)到私有Harbor。
    4. Jenkins再次控制Kubernetes进行最新的镜像部署。

__注__:

  • 上面所述为一般步骤,中间还可能会涉及自动化测试等步骤,可自行根据业务场景添加。
  • 上面流水线步骤一般由应用代码库的根目录下Jenkinsfile决定,Jenkins会自动读取该文件;另外如果需要对具体的应用流水线实施强管控,可以独立管理jenkinsfile模板,然后根据jenkins API接口即时生成流水线。
  • 默认使用的Dockerfile放置在代码仓库的根目录下。

组件部署

1.Kubernetes【Kubernetes系列】第3篇 Kubernetes集群安装部署

  1. gitlab 无忌过招:手把手教你搭建自己的GitLab库
  2. harbor 安装配置指南
  3. jenkins

_注_: 本文主要说明下jenkins的部署及配置,其他组件如果你部署有问题,欢迎留言。

Jenkins 部署及配置

_说明_:

  • 以下的yaml文件均在 k8s master节点的 /home/jenkins_deploy目录下,
  • 部署示例的depployment.yaml 的注解

    • nodeName ipaddress , ipaddress 请确认其为一个有效的ip.
    • 示例中jenkins的目录 /var/jenkins_home 是直接挂载到host_path, 如果你有条件,建议替换为共享存储。
    • 因使用的jenkins-master 的基础镜像来自公网,需要k8s maste 节点也要可以访问外网,或者你可以将 jenkins/jenkins:lts-alpine 推送至自己的内网镜像仓库。
  • 部署示例的ingress.yaml 的注解

    • 需要你也需要办公网(集群外)访问,请将jenkins.dev.hanker.net, 改为有效的域名地址,或是你也可以通过NodePort的形式声明 service,就可以直接通过ip:port的形式访问jenkins了。

1. 准备部署yaml

  • deployment.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: devops
  
# Deployment 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins
  namespace: devops
spec:
  replicas: 1
  revisionHistoryLimit: 3
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      nodeName: 1.1.1.1
      serviceAccountName: jenkins-admin
      containers:
      - image: jenkins/jenkins:lts-alpine
        imagePullPolicy: IfNotPresent
        name: jenkins
        volumeMounts:
        - name: jenkins-volume
          mountPath: /var/jenkins_home
        - name: jenkins-localtime
          mountPath: /etc/localtime
        env:
          - name: JAVA_OPTS
            value: '-Xms256m -Xmx1024m -Duser.timezone=Asia/Shanghai'
          - name: TRY_UPGRADE_IF_NO_MARKER
            value: 'true'
        ports:
        - name: http
          containerPort: 8080
        - name: agent
          containerPort: 50000
        resources:
          requests:
            cpu: 1000m
            memory: 1Gi
          limits:
            cpu: 1200m
            memory: 2Gi
      volumes:
        - name: jenkins-localtime
          hostPath:
            path: /etc/localtime
        - name: jenkins-volume
          hostPath:
            path: /home/jenkins/jenkins_home
  • 配置service, services.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  namespace: devops
spec:
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 8080
  - port: 50000
    targetPort: 50000
    name: agent
  selector:
    app: jenkins
  • 授权jenkins对k8s的访问 rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: jenkins
  name: jenkins-admin
  namespace: devops

---

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: jenkins-rbac
  namespace: devops
rules:
  - apiGroups: ["","extensions","app"]
    resources: ["pods","pods/exec","deployments","replicasets"]
    verbs: ["get","list","watch","create","update","patch","delete"]

---

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: jenkins-admin
  namespace: devops
  labels:
    k8s-app: jenkins
subjects:
  - kind: ServiceAccount
    name: jenkins-admin
    namespace: devops
roleRef:
  kind: ClusterRole
  name: jenkins-rbac
  apiGroup: rbac.authorization.k8s.io
  • 为了便于办公网(集群外)访问,ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: jenkins-ingress
  namespace: devops
spec:
  rules:
  - host: jenkins.dev.hanker.net
    http:
      paths:
      - backend:
          serviceName: jenkins-service
          servicePort: 8080
        path: /

2. 应用yaml,部署jenkins

$ pwd
$ /home/jenkins_deploy
$ kubectl apply -f *.yaml

3. 确认jenkins 服务状态

[root@node0 jenkins_deploy]# kubectl -n devops get deployment jenkins
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
jenkins   1/1     1            1           51d
[root@node0 jenkins_deploy]# 

4. 访问jenkins 安装插件、设置

注: 步骤1 声明的域名 jenkins.dev.hanker.net 已经解析至ingress,故可直接访问; 如果你也想通过自定义域名访问jenkins,麻请解析至正确的ingress服务节点,即可。

  1. 确认你也已经安装了kubernetes/ kubernetes cli 插件

_操作指引_: 【Manage Jenkins】 -> 【Manage Plugins】

你应该可以通过类似的指令获取jenkins-master的密码

$ kubectl -n devops exec jenkins-pod-name cat /var/jenkins_home/secrets/initialAdminPassword

1

  1. 配置Kubernetes 插件

_操作指引_: 【Manage Jenkins】->【Configure System】
2
3

图中标注:

  1. 请修改为你所在环境对应的k8s master
  2. 声明jenkins-agent 的命令空间,也可以根据需要调整;
  3. jenkins-master的访问地址,本示例使用的是 service-name的形式访问。
  4. 测试与k8s分享群的连接情况。如果你获取到『
    Connection test successful』,恭喜你可以继续。
  5. 配置Kubernetes Pod Template

4

图中标注:

  1. 设置基础的jenkins-agent镜像;
  2. 指定工作目录;

    • 如果你需要下载、导出或是缓存构建的话,指定一个为共享存储的目录就很有意义了。
  3. 设置目录挂载

    • 如步骤2如说,你可以将宿主机的目录或是网络存储挂载至jenkins-agent.
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
20天前
|
Kubernetes Devops 应用服务中间件
基于 Azure DevOps 与阿里云 ACK 构建企业级 CI/CD 流水线
本文介绍如何结合阿里云 ACK 与 Azure DevOps 搭建自动化部署流程,涵盖集群创建、流水线配置、应用部署与公网暴露,助力企业高效落地云原生 DevOps 实践。
150 1
|
7月前
|
存储 Kubernetes 开发工具
使用ArgoCD管理Kubernetes部署指南
ArgoCD 是一款基于 Kubernetes 的声明式 GitOps 持续交付工具,通过自动同步 Git 存储库中的配置与 Kubernetes 集群状态,确保一致性与可靠性。它支持实时同步、声明式设置、自动修复和丰富的用户界面,极大简化了复杂应用的部署管理。结合 Helm Charts,ArgoCD 提供模块化、可重用的部署流程,显著减少人工开销和配置错误。对于云原生企业,ArgoCD 能优化部署策略,提升效率与安全性,是实现自动化与一致性的理想选择。
342 0
|
6月前
|
存储 Kubernetes 异构计算
Qwen3 大模型在阿里云容器服务上的极简部署教程
通义千问 Qwen3 是 Qwen 系列最新推出的首个混合推理模型,其在代码、数学、通用能力等基准测试中,与 DeepSeek-R1、o1、o3-mini、Grok-3 和 Gemini-2.5-Pro 等顶级模型相比,表现出极具竞争力的结果。
|
7月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
647 33
|
7月前
|
Kubernetes 开发者 Docker
集群部署:使用Rancher部署Kubernetes集群。
以上就是使用 Rancher 部署 Kubernetes 集群的流程。使用 Rancher 和 Kubernetes,开发者可以受益于灵活性和可扩展性,允许他们在多种环境中运行多种应用,同时利用自动化工具使工作负载更加高效。
373 19
|
7月前
|
存储 测试技术 对象存储
使用容器服务ACK快速部署QwQ-32B模型并实现推理智能路由
阿里云最新发布的QwQ-32B模型,通过强化学习大幅度提升了模型推理能力。QwQ-32B模型拥有320亿参数,其性能可以与DeepSeek-R1 671B媲美。
|
8月前
|
存储 Kubernetes 测试技术
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
企业级LLM推理部署新范式:基于ACK的DeepSeek蒸馏模型生产环境落地指南
326 12
|
8月前
|
人工智能 Kubernetes 异构计算
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
407 5
|
5月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
184 9
|
5月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。

热门文章

最新文章

推荐镜像

更多