平台简介
功能架构
图 4容器云平台功能架构图
容器云平台主要包括以下功能:
- 门户首页
按用户类型分为管理员首页和用户首页,主要展示平台管理员和普通用户关注的集群、CPU、内存、配额、存储、服务实例状态等监控信息。
- 用户中心
提供对系统角色、权限、菜单的配置管理和用户登录认证功能。
- 资源管理
提供容器云平台计算、存储、网络等资源管理功能,主要包括集群管理、项目管理、服务管理、网络管理、存储管理、配置管理等。
- 运维中心
为用户提供应用的运行维护功能,主要包括日志管理、监控管理、告警管理、弹性伸缩等。
- 镜像仓库
为用提供Docker镜像的上传、下载和管理功能。
- 云原生组件
为用户提供基于容器的Redis、Mysql、RocketMQ、Kafka和Elasticsearch中间件服务。
容器云平台提供以下核心能力:
- 服务高可用
通过多应用副本数来分担负载以及提升可用性
- 弹性伸缩
通过多种策略,实现服务实例秒级自动扩容和缩容
- 平滑升级
采用滚动更新策略更新应用,如果更新过程出现问题,将自动回滚更改
- 多云环境部署
支持在多云环境快速部署和迁移
- 故障自愈
在节点故障或容器不健康时,通过容器漂移、自动重启等方式,确保线上服务不中断
- 资源隔离
支持按租户和项目对资源对象和资源配额进行隔离,保证应用之间互不干扰
- 容器中间件
提供分布式缓存、分布式消息队列、搜索引擎和关系型数据库等常用的中间件服务
- 镜像安全
提供安全可靠的基础镜像
多租户管理及权限体系
多租户管理体系
技术中台支持多租户管理,租户之间可根据需要进行相关资源的逻辑隔离。每个租户可以维护自己的成员、项目,部署本租户的应用,每个租户可按需申请CPU、内存、存储等资源。
图 7 多租户管理示意图
- 租户
一个租户通常是具有相似访问模式和权限的一组用户,典型的租户是同一个组织或者公司的若干用户。技术中台支持多租户,可为每一个租户单独分配cpu、内存和存储等资源,租户管理员可以管理本租户下的人员和项目,租户之间数据隔离。一般情况,技术中台指定一个部门或省公司为一个租户,某些大型项目(群)也可以单独成为一个租户。
- 项目
容器云平台项目,对应k8s中的NameSpace概念,相同项目中的服务具有相同的访问控制策略,项目下同一个人员角色对项目下的所有服务具有相同的维护权限。项目组在使用时,可以按运维权限划分和服务之间是否需要访问隔离来设定容器项目,一般在容器云提供的每个环境中为研发团队创建一个容器云项目。
权限体系
表 4 权限体系表
级别 | 生效范围 | 权限组 | 权限说明 | 配置说明 |
租户 | 技术中台 | 租户管理员 | 可以创建项目,维护租户成员列表 | 租户及租户管理员由技术中台系统管理员创建 |
租户成员 | 可以查看租户内的项目、人员信息 | 租户成员由租户管理员从系统用户列表拉入租户下 | ||
项目 | 容器云平台 | 项目管理员 | 拥有容器云项目下所有资源和人员的管理权限 | 由租户管理员创建容器云项目时指派 |
标准用户 | 可以管理容器云项目中的服务、配置、存储等资源 | 项目管理员维护项目成员时,指定人员角色为“标准用户” | ||
项目成员 | 有项目下资源的只读权限 | 项目管理员维护项目成员时,指定人员角色为“项目成员” |
接入条件
容器云平台是基于Kubernetes、Docker打造的企业级容器云平台,当前环境的版本号如下表所示,如使用人员自行制作镜像上传容器云平台进行部署,需充分了解并考虑版本的兼容性问题。如使用人员通过研发效能平台流水线进行部署,则无需关注此事项。
表 5容器云引擎组件版本列表
引擎组件 | 版本 |
Docker | 18.09.0 |
Kubernetes | 1.19.5 |
使用说明
方案阶段
总体架构
业务系统基于技术中台的总体架构设计可参考下图。
图 1210业务总体架构图
业务系统总体架构可按照云计算SaaS、PaaS、IaaS三层架构进行设计,具体说明可参考如下:
本工程按照云计算SaaS、PaaS、IaaS三层架构进行设计,基于云原生理念和技术,构建云原生应用,充分发挥云平台效能,打造弹性可靠、松耦合、易管理可观测的应用系统。
IaaS层采用邮政阿里私有云/OpenStack私有云/信创云(根据业务需要选择),使用虚拟机、裸金属服务器、对象存储、SLB等云资源;PaaS层采用邮政技术中台容器云、研发效能平台、微服务治理等核心能力,实现应用的持续构建、持续部署、服务托管、服务治理等生命周期管理。
SaaS层根据前期需求调研和分析,将公共的业务服务划分为xxx、xxx、xxx等x个服务中心。其中xxx服务中心xxxx(此处省略几百字,请项目组对公共业务的划分及各个服务中心的核心能力进行简要描述)。结合业务需求和业务场景,本工程规划建设xxx、xxx、xxx等x个子系统。其中xxx子系统xxxx(此处省略几百字,请项目组对子系统的划分及各个子系统的核心能力进行简要描述)。
渠道接入包括xxx、xxx、xxx等外部系统的数据交互,其中与xxx系统主要实现xxxx(此处省略几百字,如有外部渠道接入,请进行简要说明,如不存在,架构图不用体现。此处渠道接入指的是与淘宝、京东、顺丰等合作伙伴的数据交互。如本工程涉及内部系统(新一代寄递平台、业财一体化平台等)的数据交互,请项目组根据实际情况单独编写集成架构,并在集成架构部分进行说明)。
技术中台按照3级等保标准建设,系统安全部分项目组根据实际需求,增加或删减相关安全能力,并进行说明即可。
网络架构
华三云环境
业务项目使用技术中台技术中台容器云的华三云环境部署时,网络架构说明可以参考如下示例:
本系统开发、生产、UAT等环境服务分别部署在容器云平台对应环境的VPC网络中,每个VPC中包含多台虚拟机和裸金属等服务器组成,VPC之间通过云内东西向防火墙进行隔离。系统共涉及容器云平台的开发、生产内网、生产互联网、UAT内网、UAT互联网5个VPC,各VPC关系如下图所示:
图 1312 xxx项目网络架构详情
容器云开发VPC:本系统开发环境所在VPC,接入公司开发网络,用户需要通过云桌面访问该环境的服务。
容器云生产内网VPC:本系统生产环境中所有不依赖互联网的内网服务所在VPC,接入公司综合网,用户需要堡垒机访问该环境的服务。
容器云生产互联网VPC:本系统生产环境中所有需要访问互联网或被互联网访问的服务所在VPC,接入公司互联网区,用户通过堡垒机或通过互联访问访问该环境的服务。该VPC与生产内网VPC间可以通过开通有限的端口进行通讯。
容器云UAT内网VPC:本系统UAT环境中所有不依赖互联网的内网服务所在VPC,接入公司综合网,用户需要堡垒机访问该环境的服务。
容器云UAT互联网VPC:本系统UAT环境中所有需要访问互联网或被互联网访问的服务所在VPC,接入公司互联网区,用户通过堡垒机或通过互联访问访问该环境的服务。该VPC与UAT内网VPC间可以通过开通有限的端口进行通讯。
每个容器云环境的VPC中包含了一到多个容器云业务集群,本系统的所有服务均部署在容器云的业务集群中。每个业务集群中部署有独立的微服务治理平台数据面(注册中心、配置中心、API网关和APM监控),集群内部服务可以直接通过注册中心获取地址互相通讯。集群外部用户或服务可以通过集群的SLB访问集群内部服务,访问方式有两种:一种是ingress方式,该方式仅支持HTTP(80端口)和HTTPS(443端口),流量经过SLB负载均衡到master节点上的ingress服务器,然后再转发到用户服务实例中;另一种是nodeport方式(端口30000-32767),该方式为TCP协议,流量不经过ingress,而是直接由master节点将流量转发到用户实例中。
创新云(ARM)环境
业务项目使用技术中台技术中台容器云的创新云(ARM)环境部署时,网络架构说明可以参考如下示例:
本系统开发、生产、UAT等环境服务分别部署在容器云平台对应环境的VPC网络中,每个VPC中包含多台虚拟机和裸金属等服务器组成,VPC之间通过云内东西向防火墙进行隔离。系统共涉及容器云平台的开发、生产内网、生产互联网、UAT内网、UAT互联网5个VPC,各VPC关系如下图所示:
图 14 xxx项目网络架构详情
容器云开发VPC:本系统开发环境所在VPC,接入公司开发网络,用户需要通过云桌面访问该环境的服务。
容器云生产内网VPC:本系统生产环境中所有不依赖互联网的内网服务所在VPC,接入公司综合网,用户需要堡垒机访问该环境的服务。
容器云生产互联网VPC:该VPC内部署有容器云平台提供的nginx代理服务,用于代理互联网访问。本系统生产环境中所有需要访问互联网的服务均需要通过该代理服务访问互联网。
容器云UAT内网VPC:本系统UAT环境中所有不依赖互联网的内网服务所在VPC,接入公司综合网,用户需要堡垒机访问该环境的服务。
容器云UAT互联网VPC:该VPC内部署有容器云平台提供的nginx代理服务,用于代理互联网访问。本系统UAT环境中所有需要访问互联网的服务均需要通过该代理服务访问互联网。
除互联网VPC外,每个容器云环境的VPC中包含了一到多个容器云业务集群,本系统的所有服务均部署在容器云的业务集群中。每个业务集群中部署有独立的微服务治理平台数据面(注册中心、配置中心、API网关和APM监控),集群内部服务可以直接通过注册中心获取地址互相通讯。集群外部用户或服务可以通过集群的SLB访问集群内部服务,访问方式有两种:一种是ingress方式,该方式仅支持HTTP(80端口)和HTTPS(443端口),流量经过SLB负载均衡到master节点上的ingress服务器,然后再转发到用户服务实例中;另一种是nodeport方式(端口30000-32767),该方式为TCP协议,流量不经过ingress,而是直接由master节点将流量转发到用户实例中。
阿里云环境
业务项目使用技术中台技术中台容器云的阿里云环境部署时,网络架构说明可以参考如下示例:
本系统开发、生产、UAT等环境服务分别部署在容器云平台对应环境的VPC网络中,每个VPC中包含多台虚拟机和裸金属等服务器组成,VPC之间通过云内东西向防火墙进行隔离。系统共涉及容器云平台的开发、生产内网、生产互联网、UAT内网、UAT互联网5个VPC,各VPC关系如下图所示:
图 15 xxx项目网络架构详情
容器云开发VPC:本系统开发环境所在VPC,接入公司开发网络,用户需要通过云桌面访问该环境的服务。
容器云生产内网VPC:本系统生产环境中所有不依赖互联网的内网服务所在VPC,接入公司综合网,用户需要堡垒机访问该环境的服务。
容器云生产互联网VPC:本系统生产环境中所有需要访问互联网的服务所在VPC,接入公司互联网区。
容器云UAT内网VPC:本系统UAT环境中所有不依赖互联网的内网服务所在VPC,接入公司综合网,用户需要堡垒机访问该环境的服务。
容器云UAT互联网VPC:本系统UAT环境中所有需要访问互联网的服务所在VPC,接入公司互联网区。
每个容器云环境中包含了一到多个容器云业务集群,本系统的所有服务均部署在容器云的业务集群中。每个业务集群中部署有独立的微服务治理平台数据面(注册中心、配置中心、API网关和APM监控),集群内部服务可以直接通过注册中心获取地址互相通讯。集群外部用户或服务可以通过集群的SLB访问集群内部服务,访问方式有两种:一种是ingress方式,该方式仅支持HTTP(80端口)和HTTPS(443端口),流量经过SLB负载均衡到master节点上的ingress服务器,然后再转发到用户服务实例中;另一种是nodeport方式(端口30000-32767),该方式为TCP协议,流量不经过ingress,而是直接由master节点将流量转发到用户实例中。
部署架构
华三云环境
业务项目使用技术中台技术中台容器云华三云环境部署时,部署架构说明可以参考如下示例,模板见《附件4 总体架构模板》。
图 1613 xxx项目部署架构图
xxx系统基于容器云平台的华三云环境进行部署,如上图所示,系统包括开发、测试、UAT和生产环境,其中开发和测试环境部署在容器云开发环境中的同一业务集群中,通过项目空间进行逻辑隔离,两个环境共用业务集群中的微服务治理平台数据面(API网关、注册中心、配置中心和APM监控)。UAT和生产环境分别部署在容器云的对应环境集群中,每个集群中部署有独立的微服务治理平台数据面。
系统中的内网服务主要包括:xxx服务、xxx服务、xxx服务等,部署在容器云的业务集群中;依赖互联网的服务主要包括xxx服务、xxx服务等,部署在容器云的互联网集群中。系统使用基于容器的Redis、Mysql、RocketMQ、Kafka、Elasticsearch中间件,由技术中台以服务形式提供,与业务服务部署在同一集群中。
创新云(ARM)云环境
业务项目使用技术中台技术中台容器云创新云(ARM)环境部署时,部署架构说明可以参考如下示例,模板见《附件4 总体架构模板》。
图 17 xxx项目部署架构图
xxx系统基于容器云平台的创新云环境进行部署,如上图所示,系统包括开发、测试、UAT和生产环境,其中开发和测试环境部署在容器云开发环境中的同一业务集群中,通过项目空间进行逻辑隔离,两个环境共用业务集群中的(API网关、注册中心、配置中心和APM监控)。UAT和生产环境分别部署在容器云的对应环境集群中,每个集群中部署有独立的微服务治理平台数据面。
系统中的所有服务均部署在容器云的业务集群中,需要访问互联网的服务,通过容器云提供的互联网代理服务访问。系统使用基于容器的Redis、Mysql、RocketMQ、Kafka、Elasticsearch中间件,由技术中台以服务形式提供,与业务服务部署在同一集群中。
阿里云环境
业务项目使用技术中台技术中台容器云阿里云环境部署时,部署架构说明可以参考如下示例,模板见《附件4 总体架构模板》。
图 18 xxx项目部署架构图
xxx系统基于容器云平台的阿里云(邮务云/寄递云/合肥云/国产云)环境进行部署,如上图所示,系统包括开发、测试、UAT和生产环境,其中开发和测试环境部署在容器云开发环境中的同一业务集群中,通过项目空间进行逻辑隔离,两个环境共用业务集群中的微服务治理平台数据面(API网关、注册中心、配置中心和APM监控)。UAT和生产环境分别部署在容器云的对应环境集群中,每个集群中部署有独立的微服务治理平台数据面。
系统中的内网服务主要包括:xxx服务、xxx服务、xxx服务等,部署在容器云的业务集群中内网节点上;依赖互联网的服务主要包括xxx服务、xxx服务等,部署在容器云的业务集群的互联网节点上中。系统使用基于容器的Redis、Mysql、RocketMQ、Kafka、Elasticsearch中间件,由技术中台以服务形式提供,与业务服务部署在同一集群中。
资源评估
计划使用技术中台进行容器化部署的业务系统,在做资源规划与估算时,可参考如下步骤估算容器业务服务所需计算资源数量:
- 估算生产环境计算资源:根据如下方法估算生产环境中所需计算资源数量。
业务服务拆分:根据需求和方案进行初步的微服务拆分。
确定微服务实例资源规格:确定每一个微服务的资源规格。一般业务服务(如Java、Vue、Golang)可按照每个实例2C4G规格进行估算(注意:容器云支持负载均衡和秒级弹性伸缩,尽量通过多实例横向扩容方式提升处理能力,一般单实例规格尽量不要超过2C4G)。
估算业务服务总实例数:估算出每个服务所需实例数量(按生产高可用部署规范,每个服务至少2个实例)。
计算总资源需求:累加计算出所有业务服务的实例所需CPU和内存资源总数。
如:
表 10 估算生产环境资源示例表
服务名称 | 开发语言 | 单实例CPU规格(核) | 单实例内存规格(G) | 实例个数 | CPU总数(核) | 内存总数(G) |
xxx前端服务 | Vue | 2 | 4 | 2 | 4 | 8 |
xxx前端服务 | Vue | 2 | 4 | 2 | 4 | 8 |
xxx服务 | Java | 2 | 4 | 4 | 8 | 16 |
xxx服务 | Java | 2 | 4 | 4 | 8 | 16 |
合计 | 24 | 48 |
- 估算其他环境资源:可以按生产环境资源需求的一定比例(如1/2,1/4)计算其他环境资源需求(开发、UAT等对可用性要求不是很高的情况下,可采用单实例部署)。
如:开发和UAT环境按生产环境1/2计算(可按实例个数或规格缩减,或两者同时缩减)
表 11估开发/UAT环境环境资源示例表
服务名称 | 开发语言 | 单实例CPU规格(核) | 单实例内存规格(G) | 实例个数 | CPU总数(核) | 内存总数(G) |
xxx前端服务 | Vue | 1 | 2 | 1 | 1 | 2 |
xxx前端服务 | Vue | 1 | 2 | 1 | 1 | 2 |
xxx服务 | Java | 2 | 4 | 1 | 2 | 4 |
xxx服务 | Java | 1 | 2 | 1 | 1 | 2 |
合计 | 5 | 10 |
设计阶段
设计规范
为最大化利用技术中台弹性伸缩、快速发布、故障自愈等特性,应用在设计阶段应遵循如下规范:
采用微服务架构设计,遵循单一职责和独立原则;
服务保持无状态,不在本地保存会话(Session)、共享数据等状态信息;
配置与源代码分离,配置信息使用环境变量、动态指定配置文件或配置中心等方式进行管理;
存储与服务分离,服务持久化数据使用外部存储,如数据库、OSS等;
互联网类服务与非互联网类服务分离,不共用同一注册发现中心;
服务接口设计保证接口向下兼容;
定时任务设计时保证任务执行完业务逻辑处理后结束当前进程;
服务间通讯设计,目标地址应通过服务注册中心(如kubernetes Service、Eureka、Nacos等) 获取,禁止直接使用服务IP地址;
服务拆分设计时应满足单个服务启动时间不超过1分钟;
服务开发时禁止在程序中使用容器主机名、容器IP地址信息;
服务日志采用标准输出(stdout)事件流;
服务提供以下至少一种健康检查方式:
HTTP 方式:提供 GET 请求方式接口,路径/health,服务正常时返回状态码 200;
命令方式:提供/check-health.sh 脚本,服务正常时返回返回码 0。
容器应用产生的临时文件大小不能超过500M,项目组须定期对临时文件进行清理,临时文件存放时长不能超过7天;
服务采用自定义RestTemplate,使用bean的@Qualifier注解方式进行明确区分。
注意事项
网络环境
互联网访问:因公司的开发网络无法连接到互联网,因此部署在技术中台开发和测试环境中的服务无法访问互联网,也无法被互联网访问;
SLB端口配置:容器云默认只提供80,443端口进行网络访问,若需要通过nodeport对外提供服务,则需要联系技术中台团队进行网络端口配置与开通;
网络开通报备:若业务系统访问外部网络不通,需要项目组自行提交工单给基础平台开通网络策略,待网络开通后,将开通的网络策略发送给容器云团队进行备案。注意:根据基础平台部网络管理要求,应由服务的提供方发起网络开通工单。
自定义容器镜像制作与使用
技术中台提供的黄金基础镜像通常只包含某类应用的基础运行环境,当用户应用需要依赖一些特殊软件包时,可以基于黄金镜像自行制作新基础镜像,作为应用的运行环境。用户在制作和使用自定义基础镜像时,须注意以下几点:
必须基于技术中台提供的黄金镜像制作。
新基础镜像必须通过技术中台安全团队扫描才允许使用,具体流程如下:
上传镜像:用户将新基础镜像上传到公司Harbor仓库(使用技术中台账号登录
https://192.102.20.150
)。提交申请:用户以邮件方式向安全小组(security@cpit.chinapost.com.cn)发送扫描申请,邮件内容保留项目名、镜像路径、使用黄金的基础镜像、镜像修改说明等内容。
镜像扫描:安全组对用户提交的镜像进行扫描,回复扫描结果邮件给申请人。邮件内容包括:镜像路径、HASH值、扫描结果等内容。
- 镜像大小不超过2GB。
容器服务管理
- 服务资源规格配置:容器云服务资源(CPU和内存)需求包括最小资源数量(request)和最大资源数量(limit)。
最小资源数量(request):是满足服务正常运行的最小资源数量。容器云平台根据该值进行节点调度,若该值设置过大,可能会使满足条件节点减少,影响服务调度。另外,平台在服务启动时就会立刻分配这些资源给服务并且长期占用,若设置过大会造成资源浪费。建议一般的Java、Vue等类型的服务最小资源数量设置不超过1C2G。
最大资源数量(limit):是服务运行期间可以使用的最大资源数量。该数量与项目配额对应,建议一般可以设置成为最小资源数量的2倍,最大不超过4C8G。
挂载应用程序目录:应用程序应全部打包到镜像中,不允许通过挂载外部文件目录方式执行应用程序。
日志文件:服务上线运行后应关闭日志文件,只保留控制台日志输出,容器平台会自动采集和存储服务的控制台日志,用户可以通过日志管理模块的控制台日志进行查询。
持久化存储:服务上线运行后禁止使用本地文件目录进行持久化存储,若有相关存储需要,可以使用分布式存储。
中间件
Spring Boot 2.x 版本默认使用Lettuce操作Redis,因该客户端存在一个BUG,当Redis服务端出现宕机或发生网络中断时,连接已中断,但客户端没有收到RST信号,此时,Lettuce客户端仍使用旧连接尝试,重试15次,累计925.6秒,这期间客户端进程处于阻塞状态,最终产生超时错误(详见:
<https://github.com/lettuce-io/lettuce-core/issues/2082>
)。因此,使用技术中台Redis时,推荐使用Jedis客户端进行操作。Jedis在连接处理上与lettuce不同,当一个连接发生问题时,Jedis会将之抛弃并重建连接,不会产生类似问题。Mysql root账号应由专人保管,根据需要为普通用户和应用创建账号,分配权限,日常避免使用root用户直接操作数据库。在中间件管理平台中创建用户时,需选择Mysql主节点实例,进入管理页面后才能创建。
在中间件管理平台查看Redis和Mysql监控数据需选择对应主节点实例进行查看。
开发&部署阶段
研发效能平台、容器云平台和微服务治理平台使用说明
整体流程
研发效能平台、容器云平台和微服务治理平台在开发、测试、部署和运营各阶段提供相应服务,以下流程图展示了基本操作流程,您可以按照实际需求有选择性阅读。
图 1917技术中台整体使用流程图
过程说明:
租户管理员将所有租户成员拉入租户下,在平台运营管理系统中创建研发效能平台项目和容器项目(容器项目也可以到容器云平台创建)并指定项目管理员,再到微服务治理平台创建微服务项目并指定项目管理员。
项目管理员在研发效能平台将项目成员拉入项目下,然后创建团队并指定团队负责人;再分别在容器云平台和微服务治理平台分配项目成员权限。如果项目需要使用中间件,需跟技术中台咨询团队申请开通中间件服务。
团队负责人在研发效能平台将项目成员拉入团队,创建构建、部署等各种流水线并给团队成员授权。
研发/测试人员在开发测试环境执行流水线对代码进行构建、扫描、测试,并通过流水线将应用部署到开发测试环境中,通过容器云平台修改服务配置、查看服务和中间件的监控信息,通过微服务治理平台对服务进行治理。
运维/运营人员在综合网环境执行流水线将应用部署到UAT、生产等环境中,通过容器云平台修改服务配置、查看服务和中间件的监控信息,通过微服务治理平台对服务进行治理。
租户管理员
添加租户成员
步骤1:以租户管理员身份登录系统后,打开左上角“产品”菜单,点击“租户门户”进入租户门户。
步骤2:点击左侧菜单“租户管理->成员管理”,打开成员管理列表页面。
步骤3:点击“添加用户”按钮,打开选择用户页面,加入租户的人员默认为租户成员角色,具有租户下资源的只读权限。
----结束
创建研发效能平台和容器云平台项目
步骤1:点击左侧菜单“租户管理->项目管理”,打开项目管理列表页面
步骤2:点击“创建”按钮,打开创建项目页面,输入项目名称、唯一标识、选择项目经理(从本租户下成员中选择)和构建集群(构建集群用于执行流水线持续构建,由系统管理员分配给租户使用)。
步骤3:如果不需要创建容器云项目,点击“保存”按钮创建完成;如果需要同时创建容器云项目,选择“开通”容器云选项,会展示容器项目配置页面。
步骤4:在容器云项目配置页面,选择需要容器云提供的基础架构类型、环境类型(在开发测试网只有开发测试环境,在综合网会选到UAT和生产环境)、输入创建容器云项目相关参数,点击“保存”,系统会同时创建研发效能平台项目和容器云项目,选择的项目管理员同时是研发效能平台项目和容器云项目的管理员。
项目管理员
初始化研发效能项目和团队
添加项目成员
步骤1:以项目经理身份登录系统后,打开左上角“产品”菜单,点击“项目管理”进入项目管理系统。
步骤2:点击左侧菜单“项目设置->人员管理”,打开项目人员列表页面。
步骤3:点击“添加人员”按钮,打开添加人员页面,选择人员、角色后点保存,将人员添加到本项目中。
创建团队
步骤1:点击左侧菜单“项目设置->团队管理”,打开项目团队列表页面。
步骤2:点击“创建”按钮,打开添加项目团队页面。输入团队信息,点保存,创建一个团队。
团队编码:团队唯一标识,用于不同环境之间同步团队资源。
团队负责人:指定项目下的一个成员作为团队的SM,团队负责人可以管理团队。
----结束
分配容器云平台权限
步骤1:以项目经理身份登录系统后,打开左上角“产品”菜单,点击“容器云->容器服务”(如果需要XC环境,选择“容器与->容器服务XC”)进入容器云平台。
步骤1:点击容器云平台左侧菜单“项目管理”,打开项目列表页面,选择要分配权限的项目,点击“分配权限”链接,打开项目用户管理页面。
步骤2:点击“添加”,打开项目授权页面,选择要加入项目的用户并给用户授权。
----结束
团队负责人
团队成员管理
步骤1:以团队负责人身份登录系统后,在首页工作台“我的服务”中,点击要管理的团队快捷入口,可以直接进入团队管理页面。
或者打开左上角“产品”菜单,点击“敏捷开发平台”进入团队管理页面。
步骤2:点击左侧菜单“团队设置->团队成员管理”,打开团队成员列表页面。
步骤3:点击“添加成员”,选择要添加的人员,点击保存,完成成员添加。
----结束
创建流水线
创建一条完整的流水线过程包括配置代码源、配置部署环境、编排流水线三个环节。如果只创建用于持续构建的流水线,则不需要配置部署环境环节;如果只创建用于持续部署的流水线,则不需要配置代码源环节。
下面,以创建一条完整的流水线为例,展示流水线的创建过程。
创建代码源
代码源用于关联GitLab中的代码库,当执行流水线时可以自动从GitLab中拉取代码。
步骤1:切换到团队负责人角色,点击左侧菜单“持续交付>代码源”,打开代码源列表页面。
步骤2:点击“创建GitLab代码源”按钮,打开代码关联页面。
步骤3:选择凭证。如果没有凭证,点击“创建凭证”,打开创建凭证页面,输入GitLab的用户名和密码,点“保存”创建凭证,返回到代码关联页面,选择已创建的凭证,系统会自动加载GitLab凭证拥有的代码库。勾选要关联的代码库,点击“关联”按钮,将代码源与代码库关联。
创建部署环境
部署环境用于关联容器、EDAS、主机等环境,便于使用流水线进行持续部署。下面,以创建一个容器云部署环境为例,展示部署环境的创建过程。
步骤1:切换到团队负责人角色,点击左侧菜单“持续交付>部署环境”,打开部署环境列表页面。
步骤2:点击“创建”按钮,打开添加环境页面,录入容器环境信息。点击“保存”,完成创建。
环境名称:环境唯一标识
环境类型:用于标识环境类型
运行环境:环境的类别,选容器云
凭证:登录容器云平台的凭证
容器云项目:选择凭证后,系统会自动加载该凭证下的容器云项目,选择要部署的目标项目
创建流水线
平台内置了多个流水线模板,可以选择模板快速创建流水线。
步骤1:切换到团队负责人角色,点击左侧菜单“持续交付>流水线”,打开流水线列表页面。
步骤2:点击“创建流水线”按钮,打开流水线创建页面。
步骤3:在流水线创建页面,单击要使用的模板,打开流水线信息录入界面。
以下选择Java+Maven+Docker技术栈的从代码拉取->代码编译->代码检查->镜像构建->容器部署整个过程的流水线模板创建流水线为例。
步骤4:录入流水线信息,点击“保存”,返回流水线列表页面。
流水线名称:流水线唯一名称。流水线名称命名包含服务名、阶段标识(CI-只包含持续集成、CD-只包含持续部署、ALL包含持续集成和持续部署)、环境标识(DEV、TEST、SIT、UAT、PROD等):服务名-阶段标识-环境标识,示例:PAAS-VIEW-CI-DEV、PAAS-VIEW-ALL-TEST、PAAS-VIEW-CD-UAT。
构建集群:平台提供了x86、Arm等不同架构的Jenkins集群,在租户管理员创建项目时分配了项目可以使用的集群,团队负责人创建流水线时可以选择被授权的集群。
代码源:选择代码源管理中配置的代码源。
代码分支/Tag:选择已有分支/Tag。
JDK版本号:选择构建代码使用的JDK版本。
镜像名称:命名打包成的镜像名称。
Tag前缀:输入镜像Tag前缀,每次执行流水线打包镜像时,系统会自动在Tag前缀后面拼接时间戳。
部署环境:选择环境管理中配置的容器环境。
容器服务名称:要在容器云环境中部署的容器服务名称,默认部署无状态服务。如果容器云没有部署过该服务会自动部署并启动服务,如果容器云已部署过该服务,执行流水线后系统会自动更新该容器服务的镜像。
检测时间窗:容器服务部署完成后,等待检测时间窗的时长后开始探测服务启动是否成功,单位秒。
检测次数:系统自动探测服务启动结果的次数,每次间隔5秒。
创建后触发流水线:勾选后,点击保存会自动执行流水线。不勾选,保存后不自动执行流水线。
步骤5:点击流水线编辑按钮,打开流水线编辑页面。
步骤6:流水线编辑页面中,可以修改流水线基本信息、流程、授权、通知提醒、触发方式等信息。
为了满足多样化的构建场景,平台流水线提供了常用配置的自定义功能:
- Maven配置
对于Java+Maven工程,平台提供了默认的settings.xml配置文件,团队成员可以在“团队设置>Setting文件”菜单查看,如果项目组有自定义的settings.xml文件也可由团队负责人上传到平台,流水线执行时会自动使用指定的settings.xml配置文件构建代码工程。
在“Java+Maven代码编译”任务中用户还可以自定义“Maven命令参数”以及指定pom文件路径。如果构建的代码工程是依赖包,用户可以勾选“将制品保存到Maven库”,在流水线执行成功后会自动将jar包发布到Maven仓库。
- Docker配置
在构建镜像任务时,平台为Java、Go、VUE、Python工程提供了默认的Dockerfile模板,用户可以根据需求进行选择,默认的Dockerfile模板中基础镜像是系统自带的黄金镜像,如果项目组需要制作自己的基础镜像,可以基于黄金镜像来制作,制作过程参见《3.4.3.4.3构建基础镜像》(l)章节。如果项目组想使用代码仓中已有Dockerfile文件,也可在“镜像构建”任务中将其路径填写在“Dockerfile路径”中。
----结束
构建基础镜像
容器云平台提供黄金镜像,业务如有需要制作基础镜像,需要基于黄金镜像制作,黄金镜像清单如下:
192.101.10.113/public/golden/python:3.8
192.101.10.113/public/golden/zookeeper:3.4.14-x86
192.101.10.113/public/golden/python:3.6
192.101.10.113/public/golden/tomcat:8.5.78-x86-qt
192.101.10.113/public/golden/tomcat:7.0.109-x86-qt
192.101.10.113/public/golden/tomcat:6.0.53-x86-qt
192.101.10.113/public/golden/redis:6.2.4-x86-qt
192.101.10.113/public/golden/rabbitmq:3.8.18-x86-qt
192.101.10.113/public/golden/mysql:5.7.36-x86-qt
192.101.10.113/public/golden/mongodb:4.4.6-x86-qt
192.101.10.113/public/golden/mariadb:10.5.12-x86-qt
192.101.10.113/public/golden/kafka:2.3.1-x86-qt
192.101.10.113/public/golden/nginx:1.18
192.101.10.113/public/golden/openjdk:1.8.0_352
192.101.10.113/public/golden/rhel:7.9-x86
192.101.10.113/public/golden/alpine:3.1.4-x86
192.101.10.113/public/golden/centos:7.9-x86
192.101.10.113/public/golden/euleros:2.3.1809-x86
192.101.10.113/public/golden/rhel6:6.10-x86
192.101.10.113/public/golden/ubuntu:20.04-x86
选择需要的黄金镜像后,加入自己的Dockerfile中,如:
FROM 192.101.10.113/public/golden/nginx:1.18
COPY nginx.conf /etc/nginx
流水线授权
流水线操作权限分为查看、执行和修改三种,可以按角色分配给团队成员;另外,为满足项目组对不同部署环境的权限管控要求,系统提供通过流水线部署应用到不同环境的授权管理,并支持分时间段授权生产环境的持续部署。
- 流水线基本操作权限设置
项目管理员和团队管理员可以管理流水线,其他团队成员需要授权才能进行相应操作。
在敏捷开发平台系统中,点击左侧菜单“持续交付>流水线”,新建或编辑一条流水线,在流水线授权管理页签中,将该条流水线的权限分配给团队内的角色。如下图所示:
查看:分配到查看权限的角色成员,可以在流水线列表中看到该条流水线,并可以查看流水线执行结果、过程日志、制品信息等。
执行:分配到执行权限的角色成员,可以在流水线列表中看到并执行该条流水线,同时,可以查看流水线执行结果、过程日志、制品信息等。
修改:分配到修改权限的角色成员,可以编排流水线、修改任务参数、执行流水线和查看执行结果。
注:如果授予流水线执行权限,该流水线是用于部署生产环境的,那么,必须要打开生产环境部署开关(参见《3.4.3.6.1.1.1生产环境发版开关管理》(l)章节),才能执行流水线;如果授予流水线修改权限,但是未授予某个部署环境的权限,配置流水线部署任务时不能选择到未授权的部署环境。
- 部署环境权限设置
项目组不同角色的成员能部署的环境不同,例如运维人员可以将应用部署到生产环境、开发人员可以将应用部署到开发环境但是不能部署生产环境等,因此,系统针对部署环境提供授权管理功能。
在敏捷开发平台系统中,点击左侧菜单“持续交付->部署环境”菜单,新建或编辑部署环境页面中,选择要授权的角色后保存数据,被授权的角色即可在流水线部署任务中选择到该部署环境。如下图所示:
注:未授权的角色,不能执行、修改任何使用该部署环境的流水线。
- 部署开关管理
部署生产环境的流水线执行权限会受发版开关的约束,发版开关未开启时,部署生产环境的流水线启动按钮置灰。
发版开关管理请参见《3.4.3.6.1.1.1生产环境发版开关管理》(l)章节。
研发测试人员
持续构建
开发测试人员可以执行团队负责人授权的流水线,进行代码自动拉取、自动编译和扫描、自动进行接口测试和UI测试、自动打包和构建镜像,流水线执行过程中可以查看执行日志,流水线执行结束后可以查看流水线执行结果。
手动执行流水线构建软件包/镜像
步骤1:以团队成员身份登录系统后,在首页工作台“我的服务”中,点击参与的团队快捷入口,或者打开“产品”菜单,点击“敏捷开发平台”进入团队概览页面。
步骤2:点击左侧菜单“持续交付->流水线”,打开流水线列表页面,选择要执行的用于构建的流水线,点击图标执行流水线。
如果流水线配置了全局变量,会弹出填写流水线变量的窗口,填写变量值,点击“确定”,执行流水线。
自动执行流水线构建软件包/镜像
在配置流水线时,触发方式选择定时、代码源两种方式会自动触发流水线。
查看流水线执行结果
步骤1:平台有三处入口可以查看流水线执行结果,分别是在流水线列表页面点击“执行历史”按钮、流水线列表中间的流水线状态区域和流水线列表后面的图标,如下图所示:
步骤2:打开流水线执行记录,查看流水线执行的结果和各环节输出物。在”执行过程”页签中,点击流水线过程任务图标,可以查看执行日志。
自动化测试
测试人员可以将测试脚本上传至Gitlab,并在流水线中配置自动化测试任务,流水线执行时可以自动执行脚本,平台支持JMeter接口测试和Robot Framework UI测试。
自动化测试脚本执行完成后,平台将自动采集测试结果供用户查看。
部署容器服务
部署流程
用户可以通过流水线将镜像部署到容器云,或者通过容器云平台手动部署镜像。
图 2018 两种方式部署容器服务流程图
执行流水线部署镜像
在开发测试环境的技术中台中,执行流水线(需包含部署任务)可将应用自动部署到容器云开发环境和测试环境。
步骤1:执行用于部署应用的流水线。操作过程参见《3.4.3.5.2持续构建》(l)章节。
步骤2:部署成功后,根据需要修改容器服务的资源规格。
应用通过流水线首次部署至容器云时,默认分配的CPU和内存资源为1C/2G,项目管理员和标准用户可以在容器云平台中根据需要修改CPU和内存大小,每个服务配置的CPU和内存的最大值一般为最小值的2倍(JAVA应用JVM的内存按照最大值计算),如最小值为1C/2G,最大值为2C/4G。
进入容器云平台,点击左侧菜单“服务管理->无状态服务”,打开服务列表页面,选择要修改的服务,点击“升级”进入服务详细信息页面。
修改服务的容器设置中的cpu和内存配置。
在容器云平台手动部署镜像
如果项目组未使用研发效能平台,可以自行制作镜像并通过容器云平台的服务部署功能将镜像部署到容器云。进入容器云平台,点击左侧菜单“服务管理->无状态服务”,打开服务列表页面按导航填写服务的基本信息、容器设置、存储设置、访问设置、高级设置等信息。
设置启动命令和参数
在默认情况下,镜像会运行默认命令,如果想运行特定命令或重写镜像默认值,可以手动填写运行命令和运行参数。
- 容器如何执行命令和参数
Docker的镜像拥有存储镜像信息的相关元数据,如果不设置生命周期命令和参数,容器运行时会运行镜像制作时提供的默认的命令和参数,Docker原生定义这两个字段为“Entrypoint”和“CMD”。
如果在创建工作负载时填写了容器的运行命令和参数,将会覆盖镜像构建时的默认命令“Entrypoint”、“CMD”,规则如下:
容器运行命令和参数表
镜像Entrypoint | 镜像CMD | 容器运行命令 | 容器运行参数 | 最终执行 |
[touch] | [/root/test] | 未设置 | 未设置 | [touch/root/test] |
[touch] | [/root/test] | [mkdir] | 未设置 | [mkdir] |
[touch] | [/root/test] | 未设置 | [/opt/test] | [touch/opt/test] |
[touch] | [/root/test] | [mkdir] | [/opt/test] | [mkdir/opt/ test] |
- 设置启动命令和参数
启动命令和参数
<table>
<colgroup>
<col style="width: 17%" />
<col style="width: 82%" />
</colgroup>
<tbody>
<tr class="odd">
<td><strong>命令方式</strong></td>
<td><strong>操作步骤</strong></td>
</tr>
<tr class="even">
<td>运行命令</td>
<td><p>输入可执行的命令,例如“/run/server”。</p>
<p>若可执行命令有多个,多个命令之间用空格进行分隔。若命令本身带空格,则需要加引号("")。</p>
<p><strong>说明</strong></p>
<p>多命令时,运行命令建议用/bin/sh或其他的shell,其他全部命令作为参数来传入。</p></td>
</tr>
<tr class="odd">
<td>运行参数</td>
<td><p>输入控制容器运行命令参数,例如--port=8080。</p>
<p>若参数有多个,多个参数以换行分隔。</p></td>
</tr>
</tbody>
</table>
多命令配置方式示例:
配置网络service
如需将服务暴露给其他服务进行访问,需要为该服务配置网络Service服务,Service是四层网络服务。在左侧导航栏中选择“网络管理->网络Service管理”,点击“创建service”。
或者在左侧导航栏中选择“服务管理->无/有状态服务”,点击查看服务详情,选择“网络访问Service”页签,点击“添加网络”。
网络Service以ClusterIP和Nodeport两种类型最为常用。
- 集群内访问服务
在网络Service创建ClusterIP类型的服务
项目内可以使用servicename:port访问该服务
跨项目使用servicename.namespace:port访问该服务
- 跨集群访问服务
如果服务只能提供tcp协议进行访问,创建网络Service时选择Nodeport类型(注意:该类型服务通常使用集群SLB+端口进行高可用访问,因目前SLB的端口配置尚不支持自动创建,需要联系技术中台相关人员协助配置端口映射。)。
如果服务能提供http(s)协议进行访问,创建网络Service时选择ClusterIP类型,再创建网络Ingress。
配置网络Ingress
如果需要将服务暴露给集群外部,需要配置Ingress服务,Ingress是七层网络服务,支持URI访问,通过对应的URI将访问流量分发到对应的服务。左侧导航栏中选择“网络管理->网络Ingress”,点击“创建Ingress”。
Ingress提供域名方式进行访问,需要在服务调用方配置hosts进行访问
hosts文件位置:
Linux平台: /etc/hosts
Windows平台:C:\Windows\System32\drivers\etc\hosts
----结束
容器服务管理
升级服务
用户可以通过执行流水线快速升级服务或者登录容器云平台手动更新服务。
当通过流水线升级容器云已部署的服务时,只会升级镜像,不会更改服务的配置信息和资源规格,如果需要更新配置和资源,需要到容器云平台手动更新。
登录容器云平台手动升级服务,可按如下步骤操作:
步骤1:登录技术中台,通过“产品->容器云服务”进入容器云平台,点击左侧菜单“服务管理->无状态服务”打开服务列表页面,选择要升级的服务,点击“升级”打开服务详情页面,按导航修改服务的基本信息、容器设置、存储设置、访问设置、高级设置等信息。
步骤2:点击保存。
如果服务升级失败,可以再次点击升级按钮,选择之前版本的镜像进行回退。
容器服务监控
容器云平台提供对Ingress服务,实例和服务的整体监控查看功能。
点击Grafana图标,进入Grafana监控模块。
- Ingress监控
点击Ingress监控面板,进入Ingress监控详情页面。
Ingress监控页面提供项目已经配置的Ingress服务请求数,连接数,延时和Http状态码等详细监控信息。用户可以根据时间段,Ingress服务进行条件过滤。
- 实例监控
点击实例监控面板,进入实例监控详细页面。
实例监控包含项目已部署的服务实例的CPU,内存和网络的监控信息。可以根据时间段和实例进行条件过滤查看。
- 服务监控
点击服务监控面板,进入服务监控查看页面。
容器云平台会定时探测已经创建的Service,监控服务的访问延迟、状态码和健康状态,并根据服务状态进行告警。容器云默认不开启此功能,需要服务提供健康接口,联系容器云管理员单独配置。
中间件管理
中间件平台提供基于容器的Kafka、ElasticSearch、RocketMq、Mysql、Redis等中间件服务,如果项目组使用了上述服务,可以点击导航栏的“产品->中间件服务”进入中间件平台查看中间件的监控和告警信息。
运维/运营人员
将应用部署UAT/生产环境
UAT环境和生产环境都部署在综合网,通过流水线部署,需要以下三个步骤:
在开发测试网的研发效能平台中,将开发测试网的制品同步到综合网。
在综合网的研发效能平台中,打开生产环境发版开关(只有生产环境需要此步骤)。
在综合网的研发效能平台中,执行流水线,部署应用。
1.制品同步
由于开发测试网不能直接将制品上传到综合网,因此,在部署综合网环境之前需要先将制品同步到综合网。只有项目管理员、团队负责人、测试人员可以同步制品。
当测试人员在开发测试网完成测试之后,可以通过制品仓库的同步功能,将已测试通过的镜像、软件包同步到综合网的制品仓库。
步骤1:在开发测试环境的技术中台中,进入研发效能平台,点击左侧菜单“制品仓库>镜像管理”,打开镜像名称列表页面。
步骤2:再点击镜像名称打开镜像Tag列表页面,选择要同步到综合网的镜像版本,点击后面的“同步”按钮,将开发测试网中的制品推送到综合网中。
2.打开生产环境发版开关
项目管理员和运维管理人员可以通过部署开关控制生产环境的部署时间、可部署的团队。
点击导航栏中的“产品”菜单,选择“研发效能平台->项目管理”进入敏捷开发平台项目管理子系统。点击左侧菜单“发版管理->发版开关”菜单,新建或编辑一个发版开关任务,可以在任务中配置哪些团队、在什么时间段内可以通过流水线部署生产环境。如下图:
注:系统默认生产环境开关是关闭状态,其他环境不受发版开关控制。
3.执行流水线部署应用
4.修改容器服务配置
上线阶段
代码安全检测
项目组自行检测,然后提交技术中台安全组进行审核,具体步骤如下:
- 代码检测:执行流水线(安全扫描任务)对代码做安全审计扫描,执行成功后会生成扫描报告。
在流水线执行详情页面,选择“代码扫描报告”页签,点击“点此查看”打开代码扫描报告。
代码扫码报告如下图所示:
(2)发送审核邮件:项目组将代码安全审计平台上的信息邮件发给安全组security@cpit.chinapost.com.cn进行审核。具体过程参见《附件5 [申请指南]安全漏洞审核和通过凭证发放》。
(3)代码审核:安全组对代码扫描结果进行审核并回复审核结果邮件。
漏洞扫描
项目组联系本部门网络安全协调员,使用部门账号(若没有账号,请联系基础平台部申请)执行漏洞扫描,查看扫描结果和下载扫描报告。
HTTPS证书申请
若项目组需要公司内部证书(浏览器访问时有安全警告)用于waf防火墙、SLB、Ingress、nginx等HTTPS配置,应按如下步骤申请:
- 生成keystore
keytool -genkey -alias secretsys -keyalg RSA -keysize 2048 -dname
"CN=域名或IP,OU=CPCA,O=技术中台集团公司,L=北京市西城区金融街甲
3号,S=Beijing,C=CN" -keypass 123456 -keystore ./ms.jks -storepass
123456
- 生成证书请求文件pem
keytool -certreq -alias secretsys -sigalg "SHA1withRSA" -file ./ms.pem
-keypass 123456 -keystore ./ms.jks -storepass 123456
申请证书:将证书请求发送给公司CA中心,CA中心签发Cer格式证书给项目组。
转换x509格式:项目组使用浏览器将Cer证书导入,然后再导出为base64编码x509证书(Internet选项/内容/证书)。
将证书导入到keystore(注意alias别名与第1步中的不能相同)
keytool -import -trustcacerts -alias secretsys1 -file certificateb64.cer
-keypass 123456 -keystore ms.jks -storepass 123456
- 将keystore文件转换为p12格式
keytool -importkeystore -srckeystore ms.jks -destkeystore ms.p12
-deststoretype pkcs12 -storepass 123456
- 从p12文件中分别导出私钥(server.key)与证书(server.crt)作为等HTTPS证书。
导出私钥:openssl pkcs12 -in ms.p12 -out server.key -nocerts -nodes
导出证书: openssl pkcs12 -in ms.p12 -out server.crt -nokeys -cacerts
互联网类应用申请域名及外网IP
互联网域名需要项目组自行申请,互联网IP需要先申请互联网SLB,然后再申请互联网IP,具体流程如下:
互联网开通需求:项目组将需要开通互联网服务的环境、服务名称、端口、IP数量等信息发送给技术中台实施交付团队。
申请互联网SLB:由技术中台实施交付团队发起工单,为项目组申请容器云集群的互联网区SLB,并挂载相关端口。
申请互联网IP:项目组提交工单给基础平台部网络组,申请互联网IP、进行相关端口映射和waf防火墙开通(若需要),提交工单时须将代码安全检测报告和漏洞扫描报告作为附件上传。工单流程一般为申请人提交工单给项目组部门分管领导审批,然后转发基础平台部网络组负责人审批并处理。
工单可参考如下示例:
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<tbody>
<tr class="odd">
<td><p>工单标题:</p>
<p>xxx项目申请互联网IP和开通waf</p>
<p>原因:</p>
<p>xxx项目生产/UAT环境部署在技术中台容器云中,项目需要面向互联网提供HTTPS服务,需要申请互联网IP和开通waf防火墙。</p>
<p>内容:</p>
<p>1.新申请1个互联网IP与容器云的SLB(192.168.xxx.xxx)映射端口443。</p>
<p>2.开通waf防火墙,域名xxx.xxx.xx,https证书及安全扫描结果见附件。</p></td>
</tr>
</tbody>
</table>
运营阶段
日常运营
日常巡检
容器云平台巡检
登录容器云平台,在用户首页,可进行如下巡检项检查:
当前项目配额使用情况:配额板块可以查看当前项目CPU、内存和存储配额的总量及已使用量。
服务状态:通过实例全景图查看项目所有服务实例的健康状况,若所有实例的色块均为绿色则表示所有服务实例运行正常,若有实例不正常,可以用鼠标指向对应色块查看实例信息,或点击查看详情。
实例重启情况:通过实例重启Top5板块,查看是否有实例重启次数过多,若重启次数过多,则需要进一步查看实例的事件和业务日志进行分析。
中间件巡检
Redis
登录中间件管理平台,选择Redis菜单,可进行如下巡检项检查:
实例状态:查看实例状态是否正常。若状态不是“正常”,请联系技术中台运维团队排查。
负载情况:查看负载情况高低,点击可查看详情。若实例长时间处于高负载状态,请联系技术中台运维团队评估是否需要扩容。
告警:查看是否有告警信息,若有告警请联系技术中台运维团队处理。
MySQL
登录中间件管理平台,选择MySQL菜单,可进行如下巡检项检查:
实例状态:查看实例状态是否正常。若状态不是“正常”,请联系技术中台运维团队排查。
负载情况:查看负载情况高低,点击可查看详情。若实例长时间处于高负载状态,请联系技术中台运维团队评估是否需要扩容。
告警:查看是否有告警信息,若有告警请联系技术中台运维团队处理。
容量:查看容量大小及增长趋势,若容量使用超过70%或增长过快,请确认是否数据是否正常,评估是否需要扩容。
Kafka
登录中间件管理平台,选择Kafka菜单,可进行如下巡检项检查:
实例状态:查看实例状态是否正常。若状态不是“正常”,请联系技术中台运维团队排查。
告警:点击Kafka集群列表中的实例,查看是否有告警信息,若有告警请联系技术中台运维团队处理。
Elasticsearch
登录中间件管理平台,选择Elastic Serach菜单,可进行如下巡检项检查:
实例状态:查看实例状态是否正常。若状态不是“正常”,请联系技术中台运维团队排查。
负载情况:选择资源列表中master实例,点击查看实例CPU和内存使用情况,若实例长时间处于高负载状态,请联系技术中台运维团队评估是否需要扩容。
告警:查看是否有告警信息,若有告警请联系技术中台运维团队处理。
集群状态:选择资源列表中master实例,查看监控详情,检查集群状态是否正常。若状态异常,请联系技术中台运维团队排查。
- 磁盘:选择master实例,查看监控详情,查看磁盘大小使用率及增长趋势,若使用率超过70%或增长过快,请确认是否数据是否正常,评估是否需要扩容。
RocketMQ
登录中间件管理平台,选择RocketMQ菜单,可进行如下巡检项检查:
实例状态:查看实例状态是否正常。若状态不是“正常”,请联系技术中台运维团队排查。
负载情况:点击Broker资源列表中的实例,查看实例监控详情,检查CPU和内存使用情况,若实例长时间处于高负载状态,请联系技术中台运维团队评估是否需要扩容。
告警:点击NameServer集群列表中的实例,查看监控详情,检查是否有告警信息,若有告警请联系技术中台运维团队处理。
- 磁盘:点击Broker资源列表中的实例,查看实例监控详情,检查磁盘大小使用率及增长趋势,若使用率超过70%或增长过快,请确认是否数据是否正常,评估是否需要扩容。
监控与告警
容器云平台支持对服务的CPU和内存使用率进行告警,当服务的CPU或内存的使用率达到某个阈值时,平台可以发送邮件或邮e联消息通知用户。项目组可根据需要在容器云平台的“告警管理/告警策略”模块中进行配置。
用户在配置告警策略时请注意以下几点:
触发预警的阈值不应过小,否则可能会频繁触发告警。一般推荐CPU告警阈值设置在95%以上,内存告警阈值设置在90%以上。
告警持续周期最小值应不小于2,避免偶发性资源使用高峰触发预警。在采样周期是1分钟情况下,一般推荐CPU持续周期设置在10以上,内存设置5以上。
问题排查
流水线部署容器服务失败
日志提示:部署xxx失败
提示部署失败通常有两种原因:
服务启动时间超过检测时限(检测时窗+(检测次数x5秒)),此时应增加检测时窗时间或检测次数;
容器内进程未正常启动,此时可通过流水线部署结果的链接,跳转到容器云服务详情查看服务的日志和事件,请参考《3.6.1.3.10容器云服务Failed状态异常问题排查》章节。
容器云服务Pending状态问题排查
Pod被创建后进入调度阶段,容器云调度器依据Pod声明的资源请求量和调度规则,为Pod挑选一个适合运行的节点。当集群节点均不满足Pod调度需求时,Pod将会处于Pending状态。造成调度失败的典型原因如下:
- 不满足 NodeSelector节点选择器
原因:Pod通过NodeSelector节点选择器指定调度到带有特定Label的节点,若不存在满足 NodeSelector的可用节点,Pod将无法被调度。
解决方案:检查服务是否设置了标签选择,标签名称和值是否正确。
- 超过项目资源配额
原因:项目所有服务使用资源超过项目配额,无法创建。
解决方案:适当减小某些服务的资源数量或减少服务实例数,若仍无法满足,请申请扩容。
- 节点资源不足
原因:当前集群所有可选节点的资源(CPU或内存)可分配额小于服务设置的最小资源数量(Request),服务无法调度到节点上。
解决方案:检查服务配置的最小资源(CPU和内存)数量是否正确,值是否过大,若设置没有问题,请联系技术容器运营支撑团队协助排查。
- 未设置污点容器
原因:若服务使用项目专用节点部署,容器云通常会为专用节点设置污点,以防止节点被其他服务占用。此时,若服务没有设置对应的污点容器,是无法调度到专用节点上。
解决方案:检查服务是否配置了专用节点对应的污点容忍,污点的名称、值和类似是否正确。
容器云服务Failed状态异常问题排查
当某个容器云服务异常时,可登录容器云平台,进入“服务管理/无状态服务|有状态服务”,点击服务名称,查看服务实例列表中各实例状态。如状态为Failed,用户可以查看该服务的事件日志,根据事件日志中的错误信息进行处理,常见错误及处理方案如下:
- Pod was OOM killed
原因:云应用容器实例发生OOM。
解决方案:检查服务的内存配置,如Java的jvm参数,对比容器云平台服务监控的内存指标,判断是否是参数设置低导致进程内存不够用,适当进行参数优化。
- Out of memory: Kill process
原因:一般是操作系统把容器内进程Kill而导致的系统内核事件。比如一个Java应用,当实际占用内存超过堆内存配置大小时,就会出现OOM错误。发生进程被Kill之后,容器依旧是存活状态,容器的健康检查还会继续进行。所以后面通常会伴随出现健康检查失败的错误。
解决方案:要具体分析服务实例被Kill的原因,适当的调整进程内存的限制值。可以结合应用监控来参考进程内存的变化趋势。
- Memory cgroup out of memory: Kill process
原因:一般是由于容器的内存实际使用量超过了容器内存限制值而导致的事件。比如容器的内存限制值配置了1Gi,而容器的内存随着容器内进程内存使用量的增加超过了1Gi,就会导致容器被操作系统Cgroup Kill。发生容器被Kill之后,容器已经被停止,所以后续会出现应用实例被重启的情况。
解决方案:检查容器内进程是否有内存泄漏问题,同时适当调整容器内存的限制值大小。可以结合服务监控来看变化趋势。需要注意的是,容器内存限制值大小不应该过大,否则可能导致极端资源争抢情况下,容器被迫驱逐的问题。
- failed to garbage collect required amount of images
原因:当容器集群中的节点(宿主机)磁盘使用率达到85%之后,会触发自动的容器镜像回收策略,以便于释放足够的宿主机磁盘。该事件发生于当触发镜像回收策略之后,磁盘空间仍然不足以达到健康阈值(默认为80%)。通常该错误是由于宿主机磁盘被占用太多导致。当磁盘空间占用率持续增长(超过90%),会导致该节点上的所有容器被驱逐,也就是当前节点由于磁盘压力不再对外提供服务,直到磁盘空间释放。
解决方案:检查服务是否输出了大量的日志文件或使用了本地存储。若输出了大量日志,请关闭日志文件输出,只采用控制台输出日志,容器平台会自动采集和存储服务的控制台日志,用户可以通过日志管理模块的控制台日志进行查询;若使用了本地存储,请联系技术中台运营支撑团队,改用分布式存储。
- Attempting to reclaim ephemeral-storage
原因:ephemeral storage是临时存储空间,当磁盘空间使用率达到阈值,会触发临时存储空间的回收任务。回收任务会尝试回收系统日志,以及没有正在使用的镜像缓存等数据。当磁盘空间占用率持续增长(超过90%),会导致该节点上的所有容器被驱逐,也就是当前节点由于磁盘压力不再对外提供服务,直到磁盘空间释放。
解决方案:请注意磁盘空间的使用,避免使用“宿主机目录”类型的挂载方式,避免使用“空目录”类型的挂载方式,若有需要,可以使用分布式存储代替。以便于保证容器是无状态的,可以迁移的。
- 节点磁盘资源不足 InvalidDiskCapacity
原因:节点磁盘不足,无法分配空间给容器镜像
解决方案:请联系技术中台运营人员,检查节点的磁盘使用情况。
- Container Restart
原因:该事件表示应用实例重启,一般是由于配置了健康检查且健康检查失败导致,会伴随有Readiness probe failed和Liveness probe failed等事件。健康检查失败的原因有很多,通常情况下,比如进程OOM被Kill、比如高负载情况下应用无法正常响应(例如RDS瓶颈导致应用线程全部hang住),都可能会导致健康检查失败。
解决方案:需要结合临近的相关事件定位具体的实例重启原因。如伴随有集群相关的Out of memory事件,参考此文档上面Out of memory事件的解决方案;其他情况下,结合应用监控或者云产品自身监控来定位问题。
- The node had condition: [XXX]
原因:该事件表示实例由于节点上的异常情况被驱逐,比如The node had condition: [DiskPressure],表示节点磁盘使用率比较高,通常会伴随有 failed to garbage collect required amount of images 和 Attempting to reclaim ephemeral-storage 等集群维度(节点)的异常事件。
解决方案:需要结合临近的相关事件定位具体的驱逐原因。请联系技术中台运营支撑团队协助排查。
- Readiness probe failed
原因:由于应用就绪探针失败而引发的异常事件。应用就绪探针失败会导致相应容器的流量被摘除,例如被动从SLB摘掉该容器的流量入口。
解决方案:需要结合应用就绪探针的配置,定位应用就绪探针失败的原因。
- Liveness probe failed
原因:由于应用存活探针失败而引发的异常事件。该事件可能会导致后续达到一定阈值之后,容器被动重启。具体要看应用就绪探针的配置。
解决方案:需要结合应用存活探针的配置,定位探针检查失败的原因。
- Back-off restarting failed container
原因:此事件表示容器启动失败,而被再次拉起尝试启动。通常常见与应用发布过程中的容器启动失败。具体的原因常见为镜像拉取失败,或者容器启动失败(容器没有打到running状态)。
解决方案:需要在发布页查看容器启动日志或者调度日志,进一步定位容器启动失败的原因。
容器云服务Unkonwn状态异常问题排查
该状态表明,容器云API Server无法正常获取到实例的状态信息,通常是由于其无法与所在工作节点的kubelet通信所致,请联系技术中台运营支撑团队进行排查。
容器云服务间歇性无法连通问题排查
当某个容器云服务间歇性无法连通时,可登录容器云平台,进入“服务管理/无状态服务|有状态服务”,点击服务名称,查看服务实例列表中各实例状态,并查看实例创建时间,以判断实例最近是否重启过。若发现实例状态异常或最近重启过,请按照《3.6.1.3.10容器云服务Failed状态异常排查》步骤检查,步骤检查,否则按如下方法排查:
查看实例控制台日志:若实例状态均为Running且未最近重启过,则挨个点击查看实例名称,查看实例详情,在详情中可以实时滚动查看实例的控制台日志,根据控制台日志判断业务处理是否正常。
查询历史日志:若实例当前状态正常,想查询过去时间发生的故障,可以进入容器云平台的“日志管理/控制台日志(或业务日志)”模块,按关键字查询历史日志来判断服务业务处理是否发生过错误。
访问集群内其他服务异常
当某个业务服务无法访问同一集群内的其他服务时,一般是目标服务状态异常,可以按“服务状态异常问题排查”说明排查目标服务状态。
访问集群外部服务异常
当某个业务服务无法访问集群外部服务时,可以按照如下步骤排查:
测试目标服务网络:进入“服务管理/无状态服务|有状态服务”,点击服务名称,点击其中一个实例,查看实例容器列表,点击容器控制台图标,进入实例容器控制台,执行curl
http://目标地址:端口
,测试网络连通性。若返回http错误信息,则证明网络连通正常,重点进行业务逻辑排查。若提示域名无法识别错误,请联系运营人员,确认域名是否正确,DNS服务是否正常。
若回车后卡顿,没有收到错误信息,则证明网络不通,请联系运营人员确认网络进行排查。
中间件MySQL死锁问题
- 当使用技术中台MySQL时,若SQL操作出现长期等待现象,可以登录中间件管理平台,选择MySQL菜单,选择对应MySQL的主实例,查看详情中的“性能/锁”列表中是否有死锁出现。若出现死锁,可通过重启相应实例的方式释放锁。
中间件MySQL慢SQL问题
当使用技术中台MySQL时,若SQL操作出现响应慢问题,可以登录中间件管理平台,选择MySQL菜单,选择对应MySQL的主实例,查看详情中的“TOPSQL/慢SQL”页,协助分析和定位。
附录
附录1 技术中台支持团队
表 16技术中台支持团队表
团队名称 | 职责 | 负责人 | 联系方式 | 备注 |
架构咨询团队 | 提供架构设计、方案编写等技术咨询服务 | 李树辉 | 13311110680 | |
实施交付团队 | 负责项目实施方案制定及实施工作 | 交付经理 | 按项目指定具体人员 | |
运营支撑团队 | 负责技术中台运营工作 | 徐庆洲 | 18500137131 | |
运维团队 | 负责技术中台运维工作 | 马伟 | 18010383223 |