GitLab+Rancher实践DevOps

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文描述使用自建GitLab和Rancher实践持续集成/持续交付流水线的过程,并用Rancher实现容器编排和蓝绿发布。

摘要

本文描述使用自建GitLab和Rancher实践持续集成/持续交付流水线的过程,并用Rancher实现容器编排和蓝绿发布。

GitLab持续集成

GitLab持续集成/持续交付流程图:
image
部署GitLab服务器不是本文重点,暂且略过。GitLab内置持续集成/持续交付,支持测试、构建、部署流水线。使用GitLab持续集成需要在GitLab项目路径下添加.gitlab-ci.yml文件,这个配置文件是YAML格式,用于配置流水线的各阶段任务,详细说明参考官方.gitlab-ci.yml配置文件说明文档。这里给一个Go语言开发的项目并用容器部署的示例:

# 容器镜像地址
image: [镜像仓库地址]/library/[镜像名称]

# 设置变量如果有私密变量,可以在GitLab项目流水线设置中配置。
variables:
  DOCKER_DRIVER: overlay2
  IMAGE_NAME: [镜像名称]
  INTRANET_DC_REGISTRY: [镜像仓库地址]
  INTRANET_DC_REGISTRY_REPO: $INTRANET_DC_REGISTRY/library

before_script:
  - echo $GOPATH
  - ln -s "$PWD" $GOPATH/src/$CI_PROJECT_NAME
  - cd $GOPATH/src/$CI_PROJECT_NAME
  - apk update
  - apk add --no-cache gcc pkgconfig zeromq-dev git musl-dev
  - export CGO_ENABLED=1

stages:
  - test
  - build
  - deploy

test:
  stage: test
  script:
    - govendor test +local
  tags:
    - rancher_docker

build:
  stage: build
  script:
    - govendor build -v
    # 服务镜像版本号
    - export BUILD_TAG=$(cat Version)
    # 登录内网镜像仓库
    - docker login -u $INTRANET_DC_REGISTRY_USER -p $INTRANET_DC_REGISTRY_PASS $INTRANET_DC_REGISTRY
    # 生成服务镜像
    - docker build -t $INTRANET_DC_REGISTRY_REPO/$IMAGE_NAME:$BUILD_TAG .
    - docker push $INTRANET_DC_REGISTRY_REPO/$IMAGE_NAME:$BUILD_TAG
    - docker tag $INTRANET_DC_REGISTRY_REPO/$IMAGE_NAME:$BUILD_TAG $INTRANET_DC_REGISTRY_REPO/$IMAGE_NAME:latest
    - docker push $INTRANET_DC_REGISTRY_REPO/$IMAGE_NAME:latest
  tags:
    - rancher_docker

deploy:
   stage: deploy
   script:
     - export DEPLOY_URL="http://[Rancher服务器地址和端口号]/v1-webhooks/endpoint?key=vUMszIPObLRYtojrASlyRVBTvn5nc7DsqK0POrhy&projectId=1a46"
     - export IMAGE=$INTRANET_DC_REGISTRY_REPO/$IMAGE_NAME
     - curl -X POST $DEPLOY_URL -H 'content-type:application/json' -d '{"push_data":{"tag":"latest"},"repository":{"repo_name":"'"$IMAGE"'"}}'
   tags:
     - rancher_docker
   only:
     - master

需要说明的是INTRANET_DC_REGISTRY_USER和INTRANET_DC_REGISTRY_PASS参数是在GitLab项目“设置”->“流水线”->“保密变量”中配置,而没有直接写在配置文件中。在上述配置文件的部署阶段使用了Rancher默认容器编排工具Cattle的Webhooks功能实现自动发布,其它的编排工具也有相应的方法。上述配置中有一个配置项tags,这里就是用于配置Runner。Runner是用来执行流水线任务的计算资源,可以是虚拟机、物理机或容器。首先要安装Runner,然后配置Runner。既然使用容器就要有Dockerfile,这个文件也是在项目路径下,在上述配置中的镜像构建阶段(docker build)需要使用这个文件的配置信息,这里给一个示例:

# This file is a template, and might need editing before it works on your project.
FROM [镜像仓库地址]/library/alpine:latest

RUN sed -i -e 's/v3\.6/edge/g' /etc/apk/repositories
RUN apk add --no-cache libzmq
WORKDIR /service

# 设置环境变量
ENV ZK_HOSTS=192.168.5.30:2181,192.168.5.30:2182,192.168.5.30:2183\
    ZK_PATH=/dtask\
    LOG_LEVEL=INFO

# 复制项目
RUN mkdir -p /service/lua_scripts
# 复制Lua脚本到容器环境
COPY lua_scripts [项目目录名称] ./
COPY lua_scripts/*.lua lua_scripts/

RUN chmod +x [项目目录名称]
EXPOSE 7080 5560 5561 5556
CMD ["./[可执行程序名]"]

这是一个Go语言编写的项目Dockerfile文件,Go语言编译器将项目编译成可执行程序,所以这个Dockerfile比较简单,如果是Python这种解释型脚本语言要安装各种依赖会稍微麻烦一些。

Rancher使用简介

架构

Rancher系统架构图:
image
从这个图上可以清晰地看出Rancher五层架构:

  1. 最底层(第一层)是各种云计算虚拟化环境,这些环境是以插件的形式提供。
  2. 第二层是在云平台上建立的虚拟主机。
  3. 第三层是各种基础服务,如存储、网络、负载均衡、DNS等。
  4. 第四层是容器编排、用户管理、运维管理,容器编排包含了各种主流的容器编排工具Cattle、Docker Swarm、Kubernetes、Mesos。
  5. 第五层是各种容器应用。

功能

Rancher官方文档内容很多,但是常用的功能其实并不多,所以这里只介绍最常用的几个功能。

概念

  • 环境:Rancher 支持将资源分组归属到多个环境。每个环境具有自己独立的基础设施资源及服务,并由一个或多个用户、团队或组织管理。例如,你可以创建独立的“开发”、“测试”及“生产”环境以确保环境之间的安全隔离,将“开发”环境的访问权限赋予全部人员,但限制“生产”环境的访问权限给一个小的团队。所有主机和Rahcner资源, 比如容器, 基础设施服务等, 都在环境中被创建, 并且属于一个环境。
  • 主机:在Rancher中,主机是调度资源的基本单位(直观的理解就是所发生的操作最终都会落到某台主机上),它可以是虚拟的或者物理的Linux服务器。
  • 镜像仓库:你可以在Rancher配置镜像仓库的认证信息,使Rancher可以访问你的私有镜像仓库(DockerHub, Quay.io和其他私有镜像库)。
    在每个环境中,你可以给每个私有仓库地址配置一个认证信息,从而使Rancher可以拉取私有镜像。如果你给同一个镜像仓库配置了多个认证信息,那么Rancher只会使用最近添加的一个认证信息。Rancher支持在Cattle和Kubernetes环境中使用多种镜像仓库。
  • 应用商店:Rancher提供了一个应用商店,通过商店中的应用程序模版的可以简化部署复杂应用的过程。进入应用商店页面,你可以看到所有的应用的应用模版。
  • 应用栈:应用栈可以部署多个容器服务,是一组容器服务的集合。一个应用栈对应一个业务群或者一个系统,用来确定系统边界。
  • 服务:服务分为两种:基础设施服务和用户服务。基础设施服务位于应用商店中,每个环境创建时需要配置环境模板,环境模板中选择需要启动的基础设置服务。用户服务是用户自定义的服务,由用户构建推送到镜像仓库再部署到应用栈。

基本使用

Rancher如何部署参考官方文档快速开始,这里不作赘述,这里假设Rancher已经有管理员部署完毕并建立用户账号,现在介绍如何将自建的镜像部署到Rancher应用栈。

  1. 首先要有主机,添加主机的过程参考快速开始
  2. 用环境模板创建环境(Environments),已创建的环境显示在环境管理界面的环境列表中,环境列表中有一个是登录Rancher后的默认环境,列表右边有一列“Switch to this Environment”按钮,点击这个按钮即可切换到该环境。
  3. 一个环境下包含多个应用栈(Stacks),基础设置服务应用栈可以从应用商店中添加,用户服务应用栈可以自定义也可以从应用商店中添加,添加一个应用栈就相当于建立一个容器服务集合。
  4. 一个应用栈包含多个服务(Services),用户自定义服务就建立在自定义应用栈上,也就是我们通过“添加服务”(Add Service)将镜像部署在应用栈,一个服务由多个容器组成。
  5. 创建服务(Add Service):创建服务时选项比较多,以Cattle服务为例介绍几个最重要的参数。

    1. 选择镜像(Select Image):这个应该比较好理解,不用多解释。
    2. 端口映射(Port Map):外部访问端口和容器内部端口对应关系。
    3. 服务链接(Service Links):这个选项参数比较多,这里只介绍几个常用的。

      1. 命令(Command) :这里面大部分配置都可以写到Dockerfile里面,用的多的是环境变量,环境变量用于服务初始化参数。
      2. 网络(Networking):Network有四种参数:None——容器除了回环不配置任何网络信息;Host——容器使用宿主机的网络信息;Bridge——容器通过虚拟网桥接入网络,使用虚拟子网的网络信息;Container-已存在的一个共享网络信息。
      3. 调度(Scheduling):这里可以设置调度规则(Add Scheduling Rule),不管是通过服务或者负载均衡来创建容器时,Rancher都提供了为容器创建标签的选项,并且可以安排你想要放置容器的主机,调度规则提供了让Rancher选择要使用哪个主机的灵活性。在Rancher中使用标签来帮助定义调度规则。你可以根据需要在容器上创建任意数量的标签。通过多个调度规则,你可以完全控制容器在哪些主机上创建。你可以要求在具有特定主机标签、容器标签或名称、特定服务的主机上启动该容器。这些调度规则可以帮助你创建容器对主机的黑名单和白名单。

容器服务的管理比较简单,主要就是启停、升级,升级也就是蓝绿发布。

总结

使用GitLab可以实现DevOps的开发、测试、构建的过程管理,Rancher则负责DevOps部署和运维的过程管理,这两个工具结合就可以完整的实现DevOps全过程,当然还需要依赖一个云计算平台建立云主机,公司内部如果需要自建虚拟化服务器可以使用XenServer。

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器技术融合实践
【5月更文挑战第31天】 随着云计算的普及和企业数字化转型的加速,传统的IT运维模式已无法满足快速迭代和持续交付的需求。本文探讨了将DevOps理念与容器技术相结合,构建一套高效、稳定且易于管理的云基础设施的实践方法。通过案例分析和技术选型,展示了如何实现自动化部署、监控和扩展,以及如何提高系统的可靠性和安全性,最终实现运维效率的显著提升。
|
7天前
|
运维 JavaScript Devops
DevOps实践:通过云效实现hexo自动构建部署发布
DevOps是一种融合开发、技术运营和质量保证的流程,旨在增强跨部门沟通与协作。通过自动化软件交付和架构变更,DevOps加速了构建、测试和发布软件的过程。本文作者分享了如何使用阿里云效平台实现个人Hexo博客的自动化部署,从而实现持续集成和持续部署(CI/CD)。在应用DevOps之前,作者需手动上传和部署文件;应用后,只需提交Markdown文件,其余步骤由DevOps平台自动完成。通过云效平台的代码管理和流水线功能,实现了从代码提交到自动发布的无缝衔接。
35 2
DevOps实践:通过云效实现hexo自动构建部署发布
|
7天前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第30天】 在当今快速迭代和持续交付的软件开发环境中,传统的IT运维模式已难以满足业务需求。本文深入探讨了如何通过DevOps理念和容器化技术的有机结合,构建一个既高效又稳定的云基础设施。文章首先概述了DevOps的核心概念和实施要点,然后详细介绍了容器化技术的优势及应用实践,最后通过案例分析展示了两者结合带来的显著效益。
30 3
|
7天前
|
运维 监控 Devops
构建高效自动化运维系统:DevOps在企业级应用的实践
【5月更文挑战第30天】 随着信息技术的飞速发展,企业对软件交付速度和稳定性的要求越来越高。传统的运维模式已无法满足快速迭代和高效稳定的需求,因此,本文将探讨如何通过实施DevOps文化、流程和工具,构建一个高效的自动化运维系统。文章将详细描述DevOps的核心理念、关键技术组件以及如何在组织中落地实施策略,旨在帮助企业提升运维效率,加速产品的上市时间,同时保证系统的高可用性和稳定性。
|
7天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第29天】 在当今快速迭代和持续交付的软件开发环境中,传统的IT运维模式已无法满足业务发展的需求。本文探讨了如何通过整合DevOps理念和容器化技术,构建一套既高效又稳定的云基础设施。文章首先概述了DevOps的核心概念及其对运维领域的影响,随后详细介绍了容器化技术的关键组件和优势,并通过实际案例分析展示了两者结合的最佳实践。通过阅读本文,读者将获得如何在现代云计算环境中实现自动化、可伸缩性和高可用性的深入见解。
|
8天前
|
运维 Kubernetes 监控
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第29天】在当今数字化转型的浪潮中,企业对IT基础设施的要求越来越高。本文探讨了如何通过结合DevOps和容器化技术来构建一个灵活、可扩展且高效的云基础设施。文章首先概述了DevOps文化的重要性及其对运维自动化的影响,接着深入分析了容器化技术的基本原理及其带来的优势。最后,本文通过实际案例展示了如何将这两种方法结合起来,以实现持续集成、持续部署(CI/CD)及微服务架构的最佳实践,从而提升系统稳定性和运维效率。
|
8天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第29天】在当今快速迭代的软件开发环境中,传统的运维模式已难以满足敏捷和持续交付的需求。本文将探讨如何通过整合DevOps理念和容器化技术,构建一个既高效又稳定的云基础设施,以支持现代应用的部署和管理。文章将详细阐述容器化的核心概念,以及它如何与微服务架构相结合,进而优化资源的使用、提高系统的弹性和可伸缩性。同时,我们还将讨论DevOps实践中的关键自动化工具和流程,它们如何促进团队协作,缩短开发周期,并确保部署的一致性和可靠性。
|
8天前
|
数据可视化 搜索推荐 Devops
从DevOps实践者的角度谈谈云效Flow
这篇文章是一位DevOps实践者对云效流水线Flow的评测。首先介绍了自己参与评测的背景,并对Flow的易用性给予了肯定,认为它适合新手,尤其是可视化的编排功能。然后,作者讨论了Flow在新人上手、产品功能、性能和开放性方面的表现,指出Flow在插件开发能力和YAML编排体验上存在提升空间。他还提到了YAML编排的学习曲线和与可视化的结合问题,以及任务管理和步骤名称的混淆。此外,作者建议Flow增强模块间的逻辑性和交互清晰度,以提供更顺畅的工作流程体验。最后,作者总结了Flow的优点(功能齐全,适合中小企业)和需要改进的地方(业务逻辑、制品库能力和私有化场景的支持),并对其未来发展提出了期待。
252 0
|
8天前
|
数据可视化 搜索推荐 Devops
从DevOps实践者的角度谈谈云效Flow
一名DevOps实践者参与了云效流水线Flow的评测,认为Flow对新手友好,具有可视化编排功能。但在上手过程中,了解相关术语和流畅编排设计可能构成一些挑战。Flow的功能基本满足需求,但开放性有待提高,建议开放插件开发以丰富生态。YAML编排作为趋势,Flow在易用性和功能完善上仍有进步空间,如语法检查、智能提示等功能。此外,产品模块间的逻辑性和交互清晰度也需改进。总结来说,Flow功能齐全,适合中小企业,但在用户体验和生态建设上有改进余地。
159 3
|
8天前
|
监控 Devops API
构建高效微服务架构:API网关的作用与实践构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【5月更文挑战第28天】 在当今的软件开发领域,微服务架构因其灵活性、可扩展性和容错能力而备受推崇。本文将深入探讨API网关在构建微服务系统中的关键角色,包括它如何促进系统的高可用性、安全性和性能监控。我们将剖析API网关的核心组件,并借助具体实例展示如何实现一个高效的API网关来服务于复杂的微服务环境。 【5月更文挑战第28天】 随着企业数字化转型的深入,传统的IT运维模式已难以满足快速迭代和持续交付的需求。本文聚焦于如何通过融合DevOps理念与容器化技术来构建一个高效、稳定且可扩展的云基础设施。我们将探讨持续集成/持续部署(CI/CD)流程的优化、基于微服务架构的容器化部署以及自动化监