CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题(亦称:“集成地狱1”)。
具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。这些关联的事务通常被统称为“CI/CD 管道”,由开发和运维团队以敏捷方式协同支持。
缩略词 CI / CD 具有几个不同的含义。CI/CD 中的“CI”始终指持续集成,它属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到共享存储库中。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题。
CI/CD 中的“CD”指的是持续交付和/或持续部署,这些相关概念有时会交叉使用。两者都事关管道后续阶段的自动化,但它们有时也会单独使用,用于说明自动化程度。
持续交付通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。这旨在解决开发和运维团队之间可见性及沟通较差的问题。因此,持续交付的目的就是确保尽可能减少部署新代码时所需的工作量。
持续部署(另一种“CD”)指的是自动将开发人员的更改从存储库发布到生产环境,以供客户使用。它主要为了解决因手动流程降低应用交付速度,从而使运维团队超负荷的问题。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化。
CD 持续部署(Continuous Deployment)
对于一个成熟的 CI/CD 管道来说,最后的阶段是持续部署。作为持续交付——自动将生产就绪型构建版本发布到代码存储库——的延伸,持续部署可以自动将应用发布到生产环境。由于在生产之前的管道阶段没有手动门控,因此持续部署在很大程度上都得依赖精心设计的测试自动化。
实际上,持续部署意味着开发人员对应用的更改在编写后的几分钟内就能生效(假设它通过了自动化测试)。这更加便于持续接收和整合用户反馈。总而言之,所有这些 CI/CD 的关联步骤都有助于降低应用的部署风险,因此更便于以小件的方式(而非一次性)发布对应用的更改。不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期投资还是会很大。
项目 | 框架+开发语言 | 开发语言 | 打包工具 | 部署方式 | 仓库地址 | 访问地址 |
---|---|---|---|---|---|---|
开发语言 | ||||||
##CRM 售后 | .net | .net | 项目自带 | |||
## | 开发语言 | |||||
电商 | magento | php | ||||
欧洲中台 | java | |||||
营销活动系统 | vue2 | 开发语言 | vue-cli | |||
SPMS 平台 | vue2 | 开发语言 | vue-cli | jenkins | ||
官网 | java+vue | java + js | webpack | 部分组件webpack+maven | ||
数字资产 | .net | |||||
IPMS | 开发语言 | |||||
DRM(越南承运商) | java+vue | js+java | webpack | 手动ftp | ||
会员 | java+vue | js+java | ||||
TCL Home | 内嵌h5 | app | ||||
CMS (内容管理系统) | java+vue | java+js | webpack | 手动部署 | ||
呼叫中心 | 开发语言 | |||||
Eshop | java | java | ||||
零售 | java + vue | java+js | ||||
QIS | 开发语言 | |||||
权限系统 | vue3 + antd-design-vue | ts | vite | gitlab ci + devops | develop | sit |
中山空调 | vue3 + antd-design-vue | ts | vite | gitlab ci + devops | develop | sit |
SEMS | vue2 + elementUI | js | vue-cli |
当前除去.net等由第三方供应商开发以及由后端主导发布的项目 大部分项目的部署方式主要有:
传统的部署方式,将静态文件直接拷贝至分发服务器 非覆盖式发布: 静态资源通过数据摘要(hash)算法控制,先部署静态资源再灰度页面 缺点: 人工检查文件版本及内容,人工上传,多服务器可能遗漏更新,没有版本控制,出现错误回退不了, 涉及到cdn的要部署两套,页面放自己服务器,静态资源放cdn,操作步骤多,检查困难容易出错。
使用aws的S3存储服务。 (目前场景:海外运营的活动类)
找基础架构部申请开通一个s3存储桶,并提供控制的私钥。 如果要外网能访问需求申请开一个CDN绑定到这个s3存储桶上
Amazon S3 专为从任意位置存储和检索任意数量的数据而构建的对象存储
Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用 S3 来存储并保护各种用例(如数据湖、网站、移动应用程序、备份和还原、存档、企业应用程序、IoT 设备和大数据分析)的数据,容量不限。Amazon S3 提供了易于使用的管理功能,因此您可以组织数据并配置精细调整过的使用权限控制,从而满足特定的业务、组织和合规性要求。Amazon S3 可达到 99.999999999%(11 个 9)的持久性,并为全球各地的公司存储数百万个应用程序的数据。
配置IAM Role 我们的 jenkins 服务器安装在 EC2 上面,我们需要为其创建可以访问 S3 的 IAM Role
创建好之后,我们为 EC2 附加 IAM Role
创建S3存储桶
为静态文件创建 S3 存储桶
jenkins安装S3 publisher 插件
This is a plugin to upload files to Amazon S3 buckets.
jenkins配置S3 publisher
系统管理 >> 系统配置 >> Amazon S3 profiles
jenkins创建job
创建一个自由风格的job就行了
配置源码管理
创建触发器
配置构建后操作
开始构建
S3查看
gitlab自动发布
"使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上" ——Hudson/Jenkins
Jenkins是一个CI工具。它可以根据设定持续定期编译,运行相应代码;运行UT或集成测试;将运行结果发送至邮件,或展示成报告。
创建任务
General信息
填写项目基础信息
GitBucket
参数化构建:构建的时候可以指定部分参数,比如这里我们这里指定要构建的分支作参数,第二个是丢弃旧的构建:这样每次构建都会丢弃之前历史构建,防止jenkins构建项目过多导致内存泄漏等问题
源码管理
填写我们要构建的项目源码位置,这里我们填写git项目地址,当然还支持svn地址、文件地址、cvs地址等等
点击“Credientials”后面的“Add”,可以直接添加git的用户名和密码:
构建环境
构建环境可以理解为要构建的项目需要什么样的环境,比如node环境,maven环境等等,这里我们设置环境为node环境。
这里的“NodeJS Installation”是下拉选择的,需要提前在如下地方添加:
系统管理->全局工具配置->NodeJs下面,如下
注意:如果没有NodeJS项的话,考虑如下插件是否安装:
构建
构建就是指怎么样去操作“源代码”,这里我们填写如下:
将“源代码”打包压缩后发送至目标服务器下,再解压更新,然后再重启node服务,“SSH Server”在如下地方添加:
当然,你可以同时配置多个“SSH Server”,这样就可以同时构建更新多个服务了,整好之后保存即可。
开始构建
开始很简单,在任务列表页或者任务详情页操作即可:
开始构建如下:
查看构建日志:
构建成功:
GitLab Runner is an application that works with GitLab CI/CD to run jobs in a pipeline.
您可以选择在您拥有或管理的基础设施上安装GitLab Runner 应用程序。如果这样做,出于安全和性能原因,您应该在与托管 GitLab 实例的机器分开的机器上安装 GitLab Runner。当您使用不同的机器时,您可以在每个机器上拥有不同的操作系统和工具,例如 Kubernetes 或 Docker。
GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将这个变动通知GitLab-CI。这时GitLab-CI会找出与这个工程相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本。
Runner类型 GitLab-Runner可以分类两种类型:Shared Runner(共享型)和Specific Runner(指定型)。
使用docker安装gitlab runner
Use Docker volumes to start the Runner container
Create the Docker volume:
docker volume create gitlab-runner-config
Run the register command:
xxxxxxxxxx
docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register
gitlab实例地址 可以在 Settings > CI/CD > Runners settings查看
注册完成后 gitlab端会更新显示 runner状态
Start the GitLab Runner container using the volume we just created:
xxxxxxxxxx
docker run -d --name gitlab-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v gitlab-runner-config:/etc/gitlab-runner \
gitlab/gitlab-runner:latest
启动runner后,对应gitlab项目会显示runner状态已连接
要使用 GitLab CI/CD, 您需要:
在.gitlab-ci.yml文件中,您可以定义:
一个.gitlab-ci.yml文件可能包含:
xstages
build
test
build-code-job
stage build
script
"Check the ruby version, then build some Ruby project files:" echo
ruby -v
rake
test-code-job1
stage test
script
"If the files are built successfully, test some files with one command:" echo
rake test1
test-code-job2
stage test
script
"If the files are built successfully, test other files with a different command:" echo
rake test2
Stage Stages 表示构建阶段,说白了就是上面提到的流程。默认有3个stages:build, test, deploy。我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点:
Jobs Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:
部分示例:
在Kubernetes中,Gitlab Runner,是一个中介的作用,它申请pod运行stage,所以Runner并不直接运行stage。
当前TCL Devops平台是基于Choerodon平台开发的。
Choerodon 是将服务和应用构建在 Kubernetes 上,后端服务使用 Spring Boot 开发,前端使用 React 开发。Choerodon 分为两类环境,即应用 PaaS 环境和产品 PaaS 环境,应用 PaaS 环境为主要软件开发区,包括应用构建、敏捷管理、开发管理和持续发布管理等核心功能;产品 PaaS 环境主要软件运行区,包括测试环境、用户集成测试环境、正式环境等,用户可以根据自身需求定义。
2.1 创建一个应用服务
第一步:
使用项目所有者角色登录系统
第二步:
路径: 开发 -> 应用服务
第三步:
点击导入应用服务,右侧会弹出操作页面,点击从GitLab导入,输入GitLab仓库地址,然后在页面中选择服务类型为普通服务,输入服务编码、服务名称。点击导入,即可创建一个应用服务,创建成功后,您可以进行后续的应用服务开发。
第四步:
查看到新建的应用服务,当应用服务的状态是启用时,表示应用服务创建成功。
2.2 应用服务配置
应用容器化配置
Choerodon猪齿鱼秉承云原生的理念,基于平台的应用需要进行容器化改造才能够使用Choerodon进行开发和部署。
容器化的第一步是编写合适的Dockerfile, Dockerfile定义了如何将一个可执行程序打包成镜像. 例如: 一个SpringBoot项目, 在maven构建之后会生成一个可执行的jar包, 基于这个jar包可以打包成一个镜像, 最简单的Dockerfile如下:
xxxxxxxxxx
# 指定基础镜像(基础镜像中一般包含可执行程序的运行环境, 如JRE, 一些基本的linux指令)
FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:0.9.0
# 指定Dockerfile中剩余指令的工作目录为 /choerodon
WORKDIR /choerodon
# 将构建上下文中的jar包复制到镜像中, 这个jar包由SpringBoot项目maven打包生成
COPY app.jar app.jar
# 指定镜像的默认指令
# 其中 $JAVA_OPTS $SKYWALKING_OPTS 这两个环境变量是为了在不重新生成镜像的前提下,
# 能够根据需要指定JVM参数和skywalking参数以运行容器
CMD java $JAVA_OPTS $SKYWALKING_OPTS -jar /choerodon/app.jar
应用Helm配置
在Choerodon猪齿鱼中,使用Helm管理Kubernetes包等,Helm之于Kubernetes好比yum之于RHEL,或者apt-get之于Ubuntu。Helm使用Charts管理应用,Charts就好像RPM一样,里面描述了应用及其依赖关系。
所以, 在Choerodon的标准应用代码结构中一定要包含charts文件夹,如下截图,这是一个后端项目的标准结构。
Chart包结构:
xxxxxxxxxx
├── charts
└── choerodon-todo-servie
├── Chart.yaml 包含关于chart的的信息的YAML文件
├── README.md 可选:chart的README文件, 简单介绍Chart(例如: Chart的用法用途, 环境变量)
├── templates 这个目录下包含了多个模板文件以结合配置值生成有效的Kubernetes manifest文件
│ ├── deployment.yaml 创建 Kubernetes 部署的基本清单。
│ ├── _helpers.tpl 可选: 放置模板助手的地方,您可以在整个 chart 中重复使用
│ ├── ingress.yaml 可选: 为部署配置Ingress, 以通过域名访问服务
│ ├── pre-config-config.yaml 可选: 为部署配置前置job, 用于初始化配置中心
│ ├── pre-config-db.yaml 可选: 为部署配置前置job, 用于初始化数据库
│ └── service.yaml 可选: 为您的部署创建服务端点的基本清单。
└── values.yaml 为模板的预定义变量。
第一步: 创建目录 在项目根目录下创建如下目录结构,首先创建一个名为charts的文件夹,再创建一个与应用名相同的文件夹,在此处示例为choerodon-todo-servie,在其下创建如上文Chart包结构所示的文件
第二步: 编写_helpers.tpl文件 在 templates文件夹下将一些公共的lable或值定义到 _helpers.tpl文件中:
xxxxxxxxxx
{{/* vim: set filetype=mustache: */}}
{{- /*
service.labels.standard prints the standard service Helm labels.
The standard labels are frequently used in metadata.
*/ -}}
{{- define "service.microservice.labels" -}}
choerodon.io/version: {{ .Chart.Version | quote }}
choerodon.io/service: {{ .Chart.Name | quote }}
choerodon.io/metrics-port: {{ .Values.deployment.managementPort | quote }}
{{- end -}}
{{- define "service.labels.standard" -}}
choerodon.io/release: {{ .Release.Name | quote }}
{{- end -}}
{{- define "service.match.labels" -}}
choerodon.io/release: {{ .Release.Name | quote }}
{{- end -}}
{{- define "service.logging.deployment.label" -}}
choerodon.io/logs-parser: {{ .Values.logs.parser | quote }}
{{- end -}}
{{- define "service.monitoring.pod.annotations" -}}
choerodon.io/metrics-group: {{ .Values.metrics.group | quote }}
choerodon.io/metrics-path: {{ .Values.metrics.path | quote }}
{{- end -}}
{{/*
Return the appropriate apiVersion for deployment.
*/}}
{{- define "app.deployment.apiVersion" -}}
{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}}
{{- print "apps/v1beta2" -}}
{{- else -}}
{{- print "apps/v1" -}}
{{- end -}}
{{- end -}}
{{/*
Return the appropriate apiVersion for ingress.
*/}}
{{- define "app.ingress.apiVersion" -}}
{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}}
{{- print "extensions/v1beta1" -}}
{{- else -}}
{{- print "networking.k8s.io/v1beta1" -}}
{{- end -}}
{{- end -}}
第三步: 编写deployment.yml文件 在 templates文件夹下创建一个名为 deployment.yml的文件,内容如下:
xxxxxxxxxx
apiVersion: {{ include "app.deployment.apiVersion" . }}
kind: Deployment
metadata:
name: {{ .Release.Name }}
labels:
{{ include "service.labels.standard" . | indent 4 }}
{{ include "service.logging.deployment.label" . | indent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{ include "service.labels.standard" . | indent 6 }}
template:
metadata:
labels:
{{ include "service.labels.standard" . | indent 8 }}
{{ include "service.microservice.labels" . | indent 8 }}
annotations:
{{ include "service.monitoring.pod.annotations" . | indent 8 }}
spec:
containers:
- name: {{ .Release.Name }}
image: "{{ .Values.image.repository }}:{{ .Chart.Version }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
{{- range $name, $value := .Values.env.open }}
{{- if not (empty $value) }}
- name: {{ $name | quote }}
value: {{ $value | quote }}
{{- end }}
{{- end }}
ports:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
readinessProbe:
exec:
command: ["/bin/sh","-c","curl -s localhost:{{ .Values.deployment.managementPort }}/actuator/health --fail && nc -z localhost {{ .Values.service.port }}"]
failureThreshold: 3
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
resources:
{{ toYaml .Values.resources | indent 12 }}
第四步:编写Chart.yaml文件 在halm-dev文件夹中编写 Chart.yaml文件,这个文件中写明应用的的相关信息。
xxxxxxxxxx
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: choerodon-todo-servie
version: 0.1.0
第五步:编写文件 在charts/choerodon-todo-service文件夹中编写 values.yaml文件,这个文件中编写 templates文件夹中 deployment.yml文件(以及其它清单文件)会用到的变量及默认值。
xxxxxxxxxx
# Default values for manager-service.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
# pod运行数量
replicaCount: 1
image:
# 镜像库地址
repository: registry.cn-hangzhou.aliyuncs.com/feifei-feifei-05/choerodon-todo-servie
# 镜像拉取策略
pullPolicy: IfNotPresent
preJob:
# job超时时间
timeout: 300
# job镜像库地址
image: registry.cn-hangzhou.aliyuncs.com/choerodon-tools/dbtool:0.6.7
preConfig:
# 是否初始化manager_service数据库
enabled: true
# 初始化到配置中心文件名
configFile: application.yml
# 初始化到配置中心存储方式
configType: k8s
# 注册中心地址
registerHost: http://register-server:8000
datasource:
# manager_service数据库连接地址
url: jdbc:mysql://localhost:3306/manager_service?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true
# manager_service数据库用户名
username: choerodon
# manager_service数据库密码
password: 123456
preInitDB:
# 是否初始化demo_service数据库
enabled: true
datasource:
# demo_service数据库连接地址
url: jdbc:mysql://localhost:3306/demo_service?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true
# demo_service数据库用户名
username: choerodon
# demo_service数据库密码
password: 123456
deployment:
# 服务管理端口
managementPort: 18081
env:
open:
# 注册服务地址
EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://register-server.io-choerodon:8000/eureka/
# 是否启用配置中心
SPRING_CLOUD_CONFIG_ENABLED: true
# 配置中心地址
SPRING_CLOUD_CONFIG_URI: http://config-server.framework:8010/
# 数据库连接地址
SPRING_DATASOURCE_URL: jdbc:mysql://localhost::3306/demo_service?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true
# 数据库用户名
SPRING_DATASOURCE_USERNAME: choerodon
# 数据库密码
SPRING_DATASOURCE_PASSWORD: 123456
metrics:
# 收集应用的指标数据路径
path: /prometheus
# 性能指标应用分组
group: spring-boot
logs:
# 日志收集格式
parser: spring-boot
persistence:
# 是否启用持久化存储
enabled: false
# 绑定的pvc名称
# existingClaim:
# 持久化路径
# subPath:
service:
# 是否创建k8s service
enabled: false
# service类型
type: ClusterIP
# service端口
port: 18080
# service名称
name: choerodon-todo-servie
ingress:
# 是否创建k8s ingress
enabled: false
resources:
# k8s中容器能使用资源的资源最大值
limits:
# cpu: 100m
memory: 2Gi
# k8s中容器使用的最小资源需求
requests:
# cpu: 100m
memory: 1.5Gi
CI文件配置
Choerodon使用Gitlab-CI作为CI工具,需要在应用源代码中加上.gitlab-ci.yml文件。
.gitlab-ci.yml是用于指导gitlab进行自动化的持续集成步骤的
在CI中主要的工作就是进行镜像构建, 并且生成Chart包,最后将Chart包上传至Choerodon,与Choerodon进行集成。
在项目根目录下新建.gitlab-ci.yml文件,粘贴以下内容:
xxxxxxxxxx
# 设置CI运行时的环境镜像
image registry.cn-shanghai.aliyuncs.com/c7n/cibase0.9.1
# 设置阶段,第一个阶段构建镜像, 第二个阶段构建chart包并上传至Choerodon
stages
docker-build
chart-build
docker-build
stage docker-build
# 阶段中需要执行的命令
script
# 进行sonar分析
>-
mvn --batch-mode verify sonar:sonar
-Dsonar.host.url=$SONAR_URL
-Dsonar.login=$SONAR_LOGIN
-Dsonar.gitlab.project_id=$CI_PROJECT_PATH
-Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA
-Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
-Dsonar.analysis.serviceGroup=$GROUP_NAME
-Dsonar.analysis.commitId=$CI_COMMIT_SHA
-Dsonar.projectKey=$ GROUP_NAME :$ PROJECT_NAME
# 打包生成springboot的jar
mvn clean package spring-boot:repackage
# 将生成的jar包移动到docker目录下
mv target/app.jar docker
# 这个命令是使用kaniko进行更安全的镜像打包
# 其中, -c 参数后是Docker构建上下文, 一般包含需要打包到镜像中的文件(jar包,二进制文件等)
# -f 参数指定Dockerfile的位置 (根据实际位置)
# 可选参数: --skip-tls-verify用于跳过harbor的证书校验
# 剩余的 变量都是Choerodon的CI内置变量
kaniko -c $PWD/docker -f $PWD/docker/Dockerfile -d $ DOCKER_REGISTRY /$ GROUP_NAME /$ PROJECT_NAME :$ CI_COMMIT_TAG
chart-build
stage chart-build
script
# 这是猪齿鱼内置的CI函数, 生成chart包并上传到猪齿鱼
chart_build
# 这里是最为关键的,定义了一个全局脚本,在每一个阶段运行前都将执行下面代码从Choerodon平台中获取相应变量及封装的shell函数。
.auto_devops&auto_devops
http_status_code=`curl -o .auto_devops.sh -s -m 10 --connect-timeout 10 -w %{http_code} "/devops/ci?token="`
if [ "$http_status_code" != "200" ]; then
cat .auto_devops.sh
exit 1
fi
source .auto_devops.sh
before_script
*auto_devops
2.3 创建集群
集群是用于运行k8s的托管群组,一个Choerodon集群对应为一个k8s集群。有了集群,我们才能以此来统一调配资源,管理环境。
路径:部署->集群->集群管理;
点击左上方的 创建集群,右侧会弹出创建集群页面,输入相关信息,包括集群编码、集群名称和集群描述;
填写完成后,点击创建,界面会自动生成可执行的shell脚本命令,其中各个参数已经由后端服务自动生成。
xxxxxxxxxx
helm install --repo=http://chart.choerodon.com.cn/choerodon/c7ncd/ \
--namespace=choerodon \
--name=choerodon-cluster-agent-asdasd123 \
--version=2018.11.12-162515-master \
--set config.connect=ws://devops-service-front.staging.saas.hand-china.com/agent/ \
--set config.token=7f58f4cd-9ee0-4abd-9ca5-b2e667f2da59 \
--set config.clusterId=14 \
--set config.choerodonId=asdasd123 \
--set rbac.create=true \
choerodon-cluster-agent
需要复制指令至k8s执行才能激活集群,与平台建立连接。
执行成功后回到集群管理界面,便可以看到之前创建好的集群状态变为连接状态。
2.4 创建环境 环境是Choerodon平台中部署资源的载体,用户可以在环境中部署应用服务或其他资源。
路径:部署->环境配置;
点击工具栏创建环境,右侧会弹出创建环境的操作页面;
输入或选择相关信息,包括集群、环境编码、环境名称、环境描述;
填写完成后,点击创建,回到环境管理界面。
若所连接的集群状态为运行中,则该环境的状态为运行中,如果对应集群未连接,那么该环境也是未连接。若想激活环境,只有先将集群激活。
2.5 部署应用
部署应用服务是指将Choerodon中应用服务的某一个版本部署至指定环境的操作。
路径:部署->应用部署->部署,点击工具栏的手动部署按钮,右侧弹出手动部署界面;
选择服务来源、选择应用服务、选择一个服务版本、选择环境;
部署配置为可选项,若此处不选择,则会给出Charts包中默认的配置信息。
根据实际的配置,配置部署应用服务所需的配置信息。替换掉一些参数文件值。
最后,点击部署。信息提交完成后,会自动跳转到实例信息界面,可以在相同菜单下的环境下看到正在部署中的实例。
点击实例的实例详情,可以查看到阶段信息及日志。
如何判断某版本的应用服务已经部署成功并通过健康检查? 当实例出现在列表中,且实例名称后没有报错提示icon即为部署成功生成实例; 当新的实例状态为running,且容器状态都是绿色时,表示新部署的实例通过健康检查。
完成上述操作后,若您需要通过外部网络对应用服务部署后产生的实例进行访问,还需为此实例创建网络和域名。
创建网络 a. 路径:部署->应用部署->资源->资源视图,选择部署应用服务所在的环境,并点击进=入环境下的网络层级。
b. 点击顶部工具栏的创建网络按钮,右侧弹出创建网络的操作界面;
c. 在网络的创建页面填入以下信息,例如:
xxxxxxxxxx
- 目标对象:选择实例
- 应用服务名称:猪齿鱼Todo服务
- 选择实例:choerodon-todo-service-1(此处选择为部署应用服务后产生的实例)
- 网络类型:ClusterIp
- 端口: 80(此处为网络的端口号,可填入0-65535内任意数字)
- 目标端口: 18080(此处的端口需填入对应实例的端口)
- 网络名称:choerodon-todo-servie-s1s1(网络名称使用默认生成的即可)
d. 最后,点击创建按钮,会回到网络列表界面,此时便能通过此网络的端口在集群内部访问到目标实例;若想通过外部网络访问到目标实例,还需再已有网络的基础上,创建一个域名。
创建域名 a. 路径:部署->应用部署->资源->资源视图,选择部署应用服务所在的环境,并点击进入环境下的域名层级。
b. 点击顶部工具栏的创建域名按钮,右侧弹出创建域名的操作界面;
c. 在域名的创建页面填入以下信息,例如:
xxxxxxxxxx
- 域名名称:c7n-todo-ingress
- 网络协议:普通协议
- 域名地址:c7n-todo.demo.example.com(请填写所属环境关联集群主机绑定的域名及其子域名地址)
- 路径:默认为根目录/,遵循Ant path的规范
- 网络: choerodon-todo-servie-s1s1(选择与实例关联的已创建的网络)
- 端口: 80(此处端口为选择的网络的端口)
网络和域名创建成功后,便可通过外部的域名地址访问到部署的应用服务了。
gitlab上代码片段
dockerfile:
xxxxxxxxxx
# /docker/Dockerfile
FROM registry.getech.cn/poros/frontbase:1.0.7
ADD dist /usr/local/openresty/nginx/html
#RUN chmod 777 /usr/share/nginx/html/env.sh
#ENTRYPOINT ["/usr/share/nginx/html/env.sh"]
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 80
chart目录下 values.yaml:
xxxxxxxxxx
# Default values for choerodon-front.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount1
image
#repository: registry.choerodon.com.cn/choerodon/choerodon-front
repository harbor-harbor-ingress.c7n-system.10.74.20.139.nip.io/operation-project1/poros-front
pullPolicy Always
logs
parser poros-front
service
enabledtrue
port80
type ClusterIP
name poros-front
env
open
API_HOST http //poros.getech.cn
WEBSOCKET_SERVER ws //ws.example.com
FILE_SERVER http //minio.example.com
COOKIE_SERVER http //poros.getech.cn
DEVOPS_HOST ws //devops.poros.getech.cn
BUZZ_WEBSOCKET_URL ws //buzz.example.com
CLIENT_ID poros-front
HTTP http
LOCALfalse
CUSTOM_THEME_COLOR undefined
resources
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources,such as Minikube. If you do want to specify resources,uncomment the following
# lines,adjust them as necessary,and remove the curly braces after 'resources:'.
limits
# cpu: 100m
# memory: 2Gi
requests
# cpu: 100m
# memory: 1Gi
.gitlab-ci.yml:
xxxxxxxxxx
image 18211571563/cibase-gc-front0.0.5
stages
build
docker-build
build
stage build
script
yarn install --registry=http://10.74.20.125:8081/repository/npm-group/
yarn run build
"build complete..." echo
artifacts
name $CI_PROJECT_NAME
expire_in 1 day
paths
dist/*
only
master
# 构建docker镜像
docker-build
stage docker-build
script
docker_build
chart_build
only
master
devlop
release
test
/^release-.*$/
/^bugfix-.*$/
/^hotfix-.*$/
.auto_devops&auto_devops
curl -o .auto_devops.sh \
"/devops/ci?token=&type=microservice"
if [ $? -ne 0 ];then
cat .auto_devops.sh
exit 1
fi
source .auto_devops.sh
function docker_build(){
docker build --pull -t //: -f docker/Dockerfile .
docker push //:
}
before_script
*auto_devops
devops平台截图
应用服务
集群管理
环境配置
资源视图
现今研发部署趋势肯定是由各种CI/CD工具来自动化处理取代以往繁复易错的手工部署方案。
TCL Devops平台采用docker部署方式,建立了一套处理docker-k8s基础的部署解决方案。借助部署流水线,用户可以方便地管理各种使用TCL Devops平台开发部署的应用服务,包括应用启停、状态监控,以及应用对应的版本控制、容器管理等,同时还包括应用涉及到的各种资源管理,例如网络、域名、数据库服务、缓存服务等。 因此建议后续项目部署放在TCL Devops平台上管理。
Cloud Native Computing Foundation 提供了一个官方定义
云原生技术使组织能够在现代动态环境(例如公共云、私有云和混合云)中构建和运行可扩展的应用程序。容器、服务网格、微服务、不可变基础设施和声明式 API 是这种方法的例证。
这些技术使松散耦合的系统具有弹性、可管理性和可观察性。与强大的自动化相结合,它们使工程师能够以最少的工作量频繁且可预测地进行高影响力的更改。
云原生是关于速度和敏捷性的。业务系统正在从支持业务能力发展成为加速业务速度和增长的战略转型武器。必须立即将创意推向市场。
以下是一些实施这些技术的公司。想想他们已经实现的速度、敏捷性和可扩展性。
公司 | 经验 |
---|---|
Netflix | 在生产中拥有 600 多项服务。每天部署数百次。 |
Uber | 在生产中拥有 1,000 多项服务。每周部署数千次。 |
在生产中拥有 3,000 多项服务。每天部署 1,000 次。 |
为云原生系统提供基石的五个支柱:
云基础设施 云原生系统充分利用了云服务模型。 这些系统旨在在动态的虚拟化云环境中蓬勃发展,广泛使用平台即服务 (PaaS)计算基础设施和托管服务。他们将底层基础设施视为一次性的——在几分钟内进行配置,并通过自动化按需调整、扩展、移动或销毁。
现代设计
十二要素应用
构建基于云的应用程序的一种广泛接受的方法是gate io login。它描述了开发人员在构建针对现代云环境优化的应用程序时遵循的一组原则和实践。
要素 | 解释 |
---|---|
代码库 | 每个微服务的单一代码库,存储在其自己的存储库中。通过版本控制进行跟踪,它可以部署到多个环境(QA, Staging, Production) |
依赖 | 每个微服务都隔离并打包自己的依赖项,在不影响整个系统的情况下接受更改。 |
配置 | 配置信息从微服务中移出,并通过代码外部的配置管理工具具体化。相同的部署可以在应用了正确配置的环境中传播。 |
支持服务 | 辅助资源(数据存储、缓存、消息代理)应该通过可寻址的 URL 公开。这样做可以将资源与应用程序分离,使其可以互换。 |
构建、发布、运行 | 每个版本都必须严格分离构建、发布和运行阶段。每个都应该用唯一的 ID 标记并支持回滚的能力。现代 CI/CD 系统有助于实现这一原则。 |
流程 | 每个微服务都应该在自己的进程中执行,与其他正在运行的服务隔离。将所需状态外部化到后备服务,例如分布式缓存或数据存储。 |
端口绑定 | 每个微服务都应该是自包含的,其接口和功能在自己的端口上公开。这样做提供了与其他微服务的隔离。 |
并发 | 服务在大量相同的小型进程(副本)之间横向扩展,而不是在可用的最强大的机器上扩展单个大型实例。 |
一次性 | 服务实例应该是一次性的,有利于快速启动以增加可扩展性机会和优雅关闭以使系统处于正确状态。Docker 容器和编排器本质上满足了这一要求。 |
开发/生产奇偶校验 | 使整个应用程序生命周期中的环境尽可能相似,避免代价高昂的捷径。在这里,容器的采用可以通过促进相同的执行环境做出很大贡献。 |
记录 | 将微服务生成的日志视为事件流。使用事件聚合器处理它们并将数据传播到数据挖掘/日志管理工具,如 Azure Monitor 或 Splunk,并最终长期存档。 |
管理流程 | 作为一次性流程运行管理/管理任务。任务可以包括数据清理和报告的提取分析。执行这些任务的工具应该从生产环境中调用,但与应用程序分开。 |
微服务 微服务构建为通过共享结构交互的一组分布式小型独立服务,具有以下特征:
单体部署与微服务示例图:
容器 容器化微服务简单明了。代码、其依赖项和运行时被打包到一个称为容器映像的二进制文件中。图像存储在容器注册表中,它充当图像的存储库或库。注册表可以位于您的开发计算机、数据中心或公共云中。Docker 本身通过Docker Hub维护一个公共注册表。
需要时,您可以将映像转换为正在运行的容器实例。该实例在安装了BINGO4D引擎的任何计算机上运行。您可以根据需要拥有尽可能多的容器化服务实例。
在单个主机上运行三个不同的微服务示例图:
容器提供可移植性并保证跨环境的一致性。通过将所有内容封装到单个包中,您可以将微服务及其依赖项与底层基础设施隔离开来。
您可以在任何具有 Docker 运行时引擎的环境中部署同一个容器。容器化工作负载还消除了使用框架、软件库和运行时引擎预先配置每个环境的费用。
通过共享底层操作系统和主机资源,容器的占用空间比完整的虚拟机小得多。较小的尺寸会增加给定主机一次可以运行的密度或微服务数量。
后备服务 云原生系统依赖于许多不同的辅助资源,例如数据存储、消息代理、监控和身份服务。这些服务被称为支持服务。
常见的后备服务示例图:
自动化 如您所见,云原生系统采用微服务、容器和现代系统设计来实现速度和敏捷性。但是,这只是故事的一部分。您如何配置运行这些系统的云环境?您如何快速部署应用功能和更新?你如何完成整个画面?
进入广泛接受的基础设施即代码实践,或 IaC。
使用 IaC,您可以自动化平台配置和应用程序部署。您本质上是将软件工程实践(例如测试和版本控制)应用到您的 DevOps 实践中。您的基础设施和部署是自动化的、一致的和可重复的。
在“什么是基础设施即代码”一文中,作者 Sam Guckenheimer 描述了“实施 IaC 的团队可以快速、大规模地交付稳定的环境。团队避免手动配置环境并通过代码表示其环境的所需状态来强制一致性。使用 IaC 的基础设施部署是可重复的,可以防止因配置漂移或缺少依赖项而导致的运行时问题。DevOps 团队可以使用一套统一的实践和工具协同工作,以快速、可靠和大规模地交付应用程序及其支持的基础设施。”