微服务自动化部署CI/CD

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 基于Jenkins的微服务的自动化部署

一直有人说想了解微服务的自动化部署,今天它来了。


在微服务化的时代,自动化部署越来越成为企业的重中之重了,因为这样减少了人员的成本,开发人员将代码提交后,触发相关事件即可部署测试环境,甚至得到许可后部署到线上。这样,原先开发人员、运维人员等要做的事,通通不必再重复劳作了。这对于一个企业来说,leader比较在乎的一件事。今天讲解通过jenkins、gitlab、harbor、k8s来作简单的CI/CD平台,暂时未涉及到代码检测等。


环境:

ubuntu16.04
docker18.04
k8s1.13.x +

1. 准备

以上系统环境准备好,本文讲述的是用 k8s 来进行部署 jenkins


2. 部署 jenkins

新建部署脚本 jenkins.yaml:

apiVersion: v1
kind: Service
metadata:
  name: jenkins-service
  namespace: default
  labels:
    app: jenkins
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    protocol: TCP
    nodePort: 30600
    name: jenkins
  - port: 30000
    targetPort: 30000
    nodePort: 30000
    protocol: TCP
    name: agent
  selector:
    app: jenkins
    tier: jenkins

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-deployment
  labels:
    app: jenkins
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: jenkins
        tier: jenkins
    spec:
      containers:
        - name: jenkins
          image: jenkinsci/blueocean:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
              name: jenkins
            - containerPort: 30000
              name: agent
          volumeMounts:
          - mountPath: /var/jenkins_home
            name: jenkins-data
          - mountPath: /data/jenkins
            name: jenkins-log-path
      volumes:
      - name: jenkins-data
        hostPath:
          path: /home/demo/jenkins
      - name: jenkins-log-path
        hostPath:
          path: /data/jenkins


执行脚本:

kubectl apply -f jenkins.yaml


查看部署成功的 pod

kubectl get pod


同时会看到一个 service 生成,映射端口到外部。

接下来通过页面访问该服务,首次打开后,会让输入一个 admin 的密钥,这一串字符可以在日志中找到,执行 kubectl logs -f test-jenkins-c6bd58bf9-tgmsa 即可,输入一串字符后,进入下一步,需要安装一些插件,在安装插件的时候,需要注意的是,选择 jenkins 的 image 不同,其所需安装的插件也是不一样的,有的可能 image 已经存在了。
具体请看:https://jenkins.io/zh/doc/book/installing/

安装完插件后,进入下一步,创建第一个账户,管理员账户,一般建议创建,方便后面使用,注:邮箱也需要填写。


完成以上后,我们进入正式界面:

jenkins1.png


第一步:点击系统管理--->插件管理,添加一些插件,这里有用到kubernetes的插件,故安装了kubernetes plugins,其他的可根据自行项目确定下载、安装。


第二步:点击系统管理--->系统设置

jenkins2.png

添加jenkins的地址以及邮件地址


第三步:拉动滚动框到最下面,新增一个云

jenkins3.png

这里我加了kubernetes的配置,为什么后面会讲。


第四步:新建任务

jenkins4.png

在触发器中新增规则,最下面要生成token。


第五步:

jenkins5.png

接下来就是选择与gitlab互动,gitlab的地址以及凭据,凭据可通过首页加上可访问gitlab的用户信息,脚本路径需要根据自身的Jenkinsfile路径情况填写。


第六步:

jenkins6.png

如果启用全局安全,这个端口本身是50000,但由于k8s的默认nodePort范围是30000-32767,故可以修改在这区间内,比如:30000,这也是为什么上面创建时service的nodePort是30000了。


至此,jenkins环境配置完成


第七步:配置gitlab

jenkins7.png

这里的url就是在新建任务时生成的Gitlab webhook,token就是上面截图生成的token,最后add webhook。


第八步:

关于Harbor,自己可以简单搭建一个harbor服务,找度娘问一下很多,此处略。


第九步:

新建Jenkinsfile文件,如果刚才的路径是在项目根目录,则直接在项目根目录下创建Jenkinsfile文件:

def label = "mypod-${UUID.randomUUID().toString()}"


def k8sPodYaml = """
    apiVersion: "v1"
    kind: "Pod"
    metadata:
      labels:
        jenkins: "slave"
      name: "${label}"
    spec:
      containers:
      - env:
        - name: "CI_ENV"
          value: "YES"
        - name: "JENKINS_AGENT_WORKDIR"
          value: "/home/jenkins/agent"
        image: "jenkins/jnlp-slave"
        imagePullPolicy: "Always"
        name: "jnlp"
        resources:
          limits: {}
          requests: {}
        securityContext:
          privileged: false
        tty: false
        volumeMounts:
        - mountPath: "/home/jenkins/.kube"
          name: "volume-2"
          readOnly: false
        - mountPath: "/var/run/docker.sock"
          name: "volume-0"
          readOnly: false
        - mountPath: "/var/inference/config"
          name: "volume-1"
          readOnly: false
        - mountPath: "/usr/local/bin/kubectl"
          name: "volume-3"
          readOnly: false
        - mountPath: "/home/jenkins/agent"
          name: "workspace-volume"
          readOnly: false
        workingDir: "/home/jenkins/agent"
      nodeSelector: {}
      restartPolicy: "Never"
      volumes:
      - hostPath:
          path: "/var/run/docker.sock"
        name: "volume-0"
      - hostPath:
          path: "/home/leinao/.kube"
        name: "volume-2"
      - hostPath:
          path: "/home/leinao/inference-deploy/output_config"
        name: "volume-1"
      - emptyDir: {}
        name: "workspace-volume"
      - hostPath:
          path: "/usr/local/bin/kubectl"
        name: "volume-3"


下面是自己的任务构建项目时的逻辑,由于我们这块用了自己的框架写的编译逻辑,故比较简单的,这里不合适公开,但是逻辑都差不多,大家可自行编写。

这块解释上面的k8s的yaml,这个就是为了在k8s中启动一个pod,通过该pod来执行构建逻辑的过程。




到此,关于Jenkins结合harbor、gitlab、k8s来实现CI/CD结束了,有几点注意的地方:

1. 如果jenkins是在容器中启动的一定要记得将这个端口(30000)暴露到外部,不然jenkins-master会不知道slave是否已经启动,会反复去创建pod只到超过重试次数。

2. 如果提示Jenkins doesn’t have label jenkins-jnlp-slave,可能原因:

    1). 因为slave节点无法链接到jenkins节点开放端口50000导致

    2). 因为slave镜像中slave启动失败导致的

    3). 因为jenkins和k8s通信有延时导致超时jenkins会反复创建pod

    4). 因为slave pod启动失败

    5). 因为pipeline中指定的label与配置中的不一致导致

3. 也可以通过Ingress暴露的方式来进行暴露。
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5天前
|
安全 jenkins 测试技术
自动化测试与持续集成/持续交付(CI/CD)的实践与应用
自动化测试是现代软件开发不可或缺的环节,它可以有效地提高测试效率、降低测试成本。而持续集成/持续交付(CI/CD)则是一种基于自动化的软件开发流程,能够将代码的开发、构建、测试和部署等过程无缝连接起来,从而实现快速迭代和部署。本文将结合实际案例,介绍自动化测试和CI/CD的实践与应用。
163 2
|
5天前
|
人工智能 运维 监控
构建高性能微服务架构:现代后端开发的挑战与策略构建高效自动化运维系统的关键策略
【2月更文挑战第30天】 随着企业应用的复杂性增加,传统的单体应用架构已经难以满足快速迭代和高可用性的需求。微服务架构作为解决方案,以其服务的细粒度、独立性和弹性而受到青睐。本文将深入探讨如何构建一个高性能的微服务系统,包括关键的设计原则、常用的技术栈选择以及性能优化的最佳实践。我们将分析微服务在处理分布式事务、数据一致性以及服务发现等方面的挑战,并提出相应的解决策略。通过实例分析和案例研究,我们的目标是为后端开发人员提供一套实用的指南,帮助他们构建出既能快速响应市场变化,又能保持高效率和稳定性的微服务系统。 【2月更文挑战第30天】随着信息技术的飞速发展,企业对于信息系统的稳定性和效率要求
|
5天前
|
运维 监控 Kubernetes
构建高效自动化运维体系:基于容器技术的持续集成与持续部署(CI/CD)实践
【5月更文挑战第15天】 随着云计算和微服务架构的普及,传统的IT运维模式面临转型压力。为提高软件交付效率并降低运维成本,本文探讨了利用容器技术实现自动化运维的有效策略。重点分析了在持续集成(CI)和持续部署(CD)流程中,容器如何发挥作用,以及它们如何帮助组织实现敏捷性和弹性。通过具体案例研究,文章展示了容器化技术在自动化测试、部署及扩展中的应用,并讨论了其对系统稳定性和安全性的影响。
|
5天前
|
运维 监控 安全
构建高效自动化运维系统:基于容器技术的持续集成与持续部署(CI/CD)实践
【5月更文挑战第14天】 随着DevOps文化的深入人心,持续集成与持续部署(CI/CD)已成为现代软件工程不可或缺的组成部分。本文将探讨如何利用容器技术,尤其是Docker和Kubernetes,构建一个高效、可扩展的自动化运维系统。通过深入分析CI/CD流程的关键组件,我们将讨论如何整合这些组件以实现代码从提交到生产环境的快速、无缝过渡。文章还将涉及监控、日志管理以及安全性策略等运维考量,为读者提供一个全面的自动化运维解决方案蓝图。
|
5天前
|
运维 Kubernetes 持续交付
构建高效自动化运维体系:基于容器技术的持续集成与持续部署(CI/CD)实践
【4月更文挑战第29天】 随着云计算和微服务架构的兴起,自动化运维已成为提升企业IT效率、确保系统稳定性的关键因素。本文旨在探讨如何利用容器技术构建一套高效的自动化运维体系,实现软件开发过程中的持续集成(CI)与持续部署(CD)。文章首先分析了传统运维模式面临的挑战,然后详细介绍了基于Docker和Kubernetes等容器技术的CI/CD流程设计与实施策略,并通过一个实际案例来展示该方案在提高部署频率、降低人力成本及提升系统可靠性方面的显著优势。
|
5天前
|
运维 监控 测试技术
【专栏】自动化测试、持续集成(CI)和持续交付(CD)如何提升软件开发效率
【4月更文挑战第27天】本文探讨了自动化测试、持续集成(CI)和持续交付(CD)如何提升软件开发效率。自动化测试通过特定工具和框架确保软件质量,缩短开发周期,包括单元测试、集成测试等类型,并使用Selenium等框架。持续集成在合并代码前进行自动化测试,保证代码质量,促进团队协作,使用Jenkins等工具。持续交付则实现快速迭代,自动化部署过程,降低部署风险,提高软件质量和运维效率。这三者结合助力企业在竞争中胜出。
|
5天前
|
jenkins Java 持续交付
Jenkins与Docker的自动化CI/CD实战
Jenkins与Docker的自动化CI/CD实战
|
5天前
|
运维 Kubernetes 测试技术
构建高效自动化运维系统:基于容器技术的持续集成与持续部署(CI/CD)实践
【4月更文挑战第2天】 在快速发展的信息技术时代,自动化运维已成为提升企业IT效率、保障系统稳定性的关键手段。本文以容器技术为核心,探讨了如何构建一个高效的自动化运维系统,实现软件的持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)。通过深入分析Docker容器及Kubernetes集群管理工具的运用,提出了一套切实可行的CI/CD流程方案,旨在帮助读者理解并实践自动化运维的最佳实践,进而推动企业运维管理的现代化进程。
|
5天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
3天前
|
数据采集 Java 开发工具
一文2500字从0到1教你搭建Android自动化python+appium环境
一文2500字从0到1教你搭建Android自动化python+appium环境
一文2500字从0到1教你搭建Android自动化python+appium环境