运维平台建设流程和规范大纲
平台规划
通过容器平台的搭建,来支持微服务架构应用,满足业务的快速开发和迭代需求,逐步建立标准的开发、 测试,、生成环境, 形成统一的规范和标准,为快速交付赋能。同时需适应公司DevOps过程, 完善开发、测试、部署、运维监控工具链和自动化流程,提升敏捷研发、持续集成的能力;
目标
容器平台搭建,并适应devops流程,推进个项目的接入
职责
IT服务
IDC机房
- 服务器,网络服务,存储等基础服务的稳定,用来支撑上层业务
硬件服务器维护 / 虚拟化资源维护 / 操作系统的安装部署
内部AD管理
ldap
dns
jms
gitlab
其他
安全管理
域名
证书
网络策略
防火墙策略
VPN
其他
- 待定
SRE
业务运维规范和维护
CICD 工作流的创建, 辅助产品快速迭代和发布
搭建监控平台 , ( 后续可配合SLO (SLI) 进行监控 )
业务监控 ( 产品维度 )
应用监控 ( 中间件 )
链路追踪
资源监控(应用以及基础)
搭建日志平台, ( 后续可配合SLO (SLI) 进行监控 )
日志收集
日志监控
日志分析
故障定位
infra服务(中间件)维护-安全,稳定,高效. ( 目前选型 bitnami )
数据库
架构
微服务
微服务更多的是开发规范和标准, 有基础设施组负责。
容器化
目标: 以容器化方式运行产品
容器规范大纲
容器化规范对象
容器规范的价值及作用
容器规范的目标镜像规范
镜像规范的作用
镜像规范的目标
镜像存储规范
镜像 Tag 规范
墓础镜像规范
镜像命名规范
镜像使用规范
墓础镜像清单
容器命名规范
Dockerfile 规范
FROM 指令:
RUN 指令
WORKDIR 指令
初始镜像
Distroless Containers: Hype or True Value?
不要轻易使用 Alpine 镜像来构建 Docker 镜像,有坑!
crond
暂不需要
ntp依赖于宿主机系统时间
- 时区设置 (Shanghai)
https://cloud.tencent.com/developer/article/1626811
ENV TZ Asia/Shanghai
RUN apk add tzdata && cp /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && apk del tzdata
- 字符集(UTF-8)
ENV LANG="en_US.UTF-8"
- 应用环境变量
业务&中间件
关键字 | 说明 | 备注 |
---|---|---|
DB | 数据库 | |
ES | elasticsearch | |
MINIO | minio服务器 | |
REDIS | redis服务 | |
MQ | 消息队列 | |
NACOS | 配置中心 | |
KAFKA | kafka服务 | |
ZABBIX | zabbix服务 | |
ZOOKEEPER | ZooKeeper服务 | |
SKYWALKING | SkyWalking服务 | |
属性关键字
关键字 | 说明 | 备注 |
---|---|---|
ADDR | 地址,此地址为域名或IP | 127.0.0.1 、 example.jkstack.com |
USER | 用户名 | |
PASSWD | 密码 | |
URL | 此参数为url | http://xxx |
- 启动脚本 - (挂载目录)
原则: 单容器单进程
基础镜像时打入 - 服务统一,一个脚本通吃所有
发版镜像时打入 - 服务无法统一,每个服务镜像封装时打入.
制品位置&名称
数据挂载目录
日志路径固定 ( 统一脚本 )
制品路径固定 (规范)
端口规划
http:80
https:443
metrics:5000
tcp:
udp:
Dockerfile
推送地址:
harbor.example.com/commons/openjdk:8-alpine
entrypoint.sh
#!/bin/sh
set -euo pipefail
JAVA_OPTS="${JAVA_OPTS}"
JAVA_HEAP_DUMP="${JAVA_HEAP_DUMP:-false}"
WORKDIR="${WORKDIR%/$*}"
JAR_FILE="${JAR_FILE}"
JAVA_AGENT="${JAVA_AGENT:-}"
# Check current working dir
if [ -z "${WORKDIR}" ]; then
WORKDIR="$(dirname "$0")"
echo "Current working directory: ${WORKDIR}"
elif
[ "${WORKDIR}" != "$(pwd)" ]; then
echo "Current working directory: $(pwd)"
exit 1
else
echo "Current working directory: ${WORKDIR}"
fi
# Check jar file if exist
JAR_FILE_EXIST="$(find . -type f -name "*.jar")"
if [ -z "${JAR_FILE_EXIST}" ] && ([ -z "${JAR_FILE}" ] || [ ! -f "${WORKDIR}/lib/app.jar" ]); then
echo "error: Spring boot application missed a fat jar."
exit 1
fi
# Which java to use
if [ -z "${JAVA_HOME}" ]; then
JAVA_BIN="java"
else
JAVA_BIN="${JAVA_HOME}/bin/java"
fi
# Setting jvm parameters
if [ -z "${JAVA_OPTS}" ]; then
JAVA_OPTS="-Xms512m -Xmx1024m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -server"
else
JAVA_OPTS="${JAVA_OPTS} -server -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+UseG1GC -XX:+UseStringDeduplication"
fi
if [ "${JAVA_HEAP_DUMP}" = "true" ]; then
JAVA_OPTS="${JAVA_OPTS} -XX:+HeapDumpOnOutOfMemoryError -XX:ErrorFile=${WORKDIR}/logs/app_error_%p.log -XX:HeapDumpPath=${WORKDIR}/logs/app_error.hprof"
fi
if [ -n "${JAVA_AGENT}" ]; then
JAVA_AGENT="$(echo ${JAVA_AGENT} \
| sed -n '
s#QA_PLATFORM_ADDRESS#'"${QA_PLATFORM_ADDRESS}"'#;
s#INCLUDES_PACKAGE#'"${INCLUDES_PACKAGE}"'#;
s#SERVICE_NAME#'"${SERVICE_NAME}"'#;
s#PROJECT_URL#'"${PROJECT_URL}"'#;
s#PROJECT_COMMIT_REF_NAME#'"${PROJECT_COMMIT_REF_NAME}"'#;
s#PROJECT_COMMIT_SHORT_SHA#'"${PROJECT_COMMIT_SHORT_SHA}"'#;
p')"
JAVA_OPTS="${JAVA_OPTS} ${JAVA_AGENT}"
fi
export JAVA_OPTS="${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
# Kinking off java service
echo "Kicking off instance...."
echo "${JAVA_BIN} ${JAVA_OPTS} -jar ${WORKDIR}/lib/app.jar"
# JAVA_OPTS should be splitting when do shell variable expansion, then delivery to JAVA VM as jvm parameters, never single or double quote it.
exec "${JAVA_BIN}" ${JAVA_OPTS} -jar "${WORKDIR}/lib/app.jar" "$@"
helm
基础镜像
FROM harbor.jkservice.org/infra/openjdk:8u312-jdk-alpine
LABEL maintainer="R&D Platform Developers <rd@jkstack.com>"
ARG TZ="Asia/Shanghai"
ARG APK_MIRROR="mirrors.tuna.tsinghua.edu.cn"
ENV TZ="${TZ}" \
APK_MIRROR="${APK_MIRROR}"
RUN set -eux \
&& sed -i -r "s#dl-cdn.alpinelinux.org#${APK_MIRROR}#g" /etc/apk/repositories \
&& apk add --update --no-cache \
tzdata \
tini \
font-adobe-100dpi \
ttf-dejavu \
fontconfig \
&& ln -snf /usr/share/zoneinfo/"${TZ}" /etc/localtime \
&& echo "${TZ}" > /etc/timezone
ENV JAVA_USER="${JAVA_USER:-java}" \
WORKDIR="${WORKDIR:-/opt/jkstack}" \
JAR_FILE="${JAR_FILE}"
RUN set -eux \
&& addgroup -g 101 -S "${JAVA_USER}" \
&& adduser -S -D -H -u 101 -h "${WORKDIR}" -s /sbin/nologin -G "${JAVA_USER}" -g "${JAVA_USER}" "${JAVA_USER}" \
&& mkdir -p "${WORKDIR}"/lib \
"${WORKDIR}"/etc \
"${WORKDIR}"/logs \
"${WORKDIR}"/tmp \
"${WORKDIR}"/agents \
"${WORKDIR}"/jmx-ssl \
"${WORKDIR}"/jmx-exporter/lib \
"${WORKDIR}"/jmx-exporter/etc \
&& chown -R "${JAVA_USER}":"${JAVA_USER}" "${WORKDIR}"
COPY --chown="${JAVA_USER}":"${JAVA_USER}" docker-entrypoint.sh "${WORKDIR}"/docker-entrypoint.sh
RUN chmod +x "${WORKDIR}"/docker-entrypoint.sh
## Maven: copy maven target/ jar file
# COPY --chown="${JAVA_USER}":"${JAVA_USER}" ./target/${JAR_FILE} "${WORKDIR}"/lib/app.jar
## Gradle: copy gradle build/libs jar file
# COPY --chown="${JAVA_USER}":"${JAVA_USER}" ./build/libs/${JAR_FILE} "${WORKDIR}"/lib/app.jar
USER "${JAVA_USER}"
WORKDIR "${WORKDIR}"
VOLUME "${WORKDIR}"/logs
# EXPOSE 8080
STOPSIGNAL SIGQUIT
CMD ["./docker-entrypoint.sh"]
ENTRYPOINT ["/sbin/tini", "--"]
业务镜像
FROM harbor.jkservice.org/base/base-java-no-nacos:latest
MAINTAINER "JKstack Developers <rd@jkstack.com>"
ARG QA_PLATFORM_ADDRESS
ARG SERVICE_NAME
ARG INCLUDES_PACKAGE
ARG PROJECT_URL
ARG PROJECT_COMMIT_REF_NAME
ARG PROJECT_COMMIT_SHORT_SHA
ENV QA_PLATFORM_ADDRESS="${QA_PLATFORM_ADDRESS}" \
SERVICE_NAME="${SERVICE_NAME}" \
INCLUDES_PACKAGE="${INCLUDES_PACKAGE}" \
PROJECT_COMMIT_REF_NAME="${PROJECT_COMMIT_REF_NAME}" \
PROJECT_COMMIT_SHORT_SHA="${PROJECT_COMMIT_SHORT_SHA}" \
PROJECT_URL="${PROJECT_URL}"
ENV JAVA_OPTS="${JAVA_OPTS}" \
JAVA_HEAP_DUMP="${JAVA_HEAP_DUMP:-false}" \
JAVA_USER="java" \
WORKDIR="/opt/jkstack"
ENV JAR_FILE="domain-process.jar" \
SVC_PORT="${SVC_PORT:-8084}"
COPY --chown="${JAVA_USER}":"${JAVA_USER}" ./build/libs/"${JAR_FILE}" "${WORKDIR}"/lib/app.jar
EXPOSE "${SVC_PORT}"
中间件镜像
- 规范与产品镜像相同 或使用官网/开源的
K8S
部署前
操作系统选型
分区规划
容器选型
docker
containerd
存储选型
- GFS/longhorn
网络选型
flannel
calico
命名规范
高可用方案
- RKE
集群(数据)备份方案
- velero
环境隔离 ( 集群? NS? )
物理隔离
- 资源复用低
NS
- 额外配置PSP
系统
操作系统:
CentOS Linux release 7.7.1908 (Core) 内核:
3.10.0-1062.el7.x86_64
容器
docker版本
Docker version 20.10.4, build d3cb89e
分区
LVM卷管理
通常配置如下
虚拟磁盘 | 挂载点 | 类别 | 大小 | 说明 |
---|---|---|---|---|
/boot | 分区 | xfs | ||
swap | LVM LV | swap | ||
/ | LVM LV | ext4 | ||
sdb | /opt | LVM LV |
部署时
版本选择
存储方案 ( 分布式存储 ?)
网络选型 ( flannel ? )
自动化
RKE
自研
离线方案
离线包管理
离线自动部署
离线包版本管理 (自动化)
部署后
升级
- 版本升级
扩容
日志 (延后)
监控 (延后)
部署接管
DevOps(GitOps)
组织文化
略
业务协作
业务迭代流程 ( 自动化发布流程)
软件架构
云原生
流程图
自动化验证
UI自动化
接口自动化
性能?
输出:测试报告
环境与配置
环境隔离
版本控制
变更管理
部署与监控
自动部署
helm
部署策略 ( 滚动、蓝绿、灰度)
监控方案
可考虑部署工具rancher或kubesphere或后面开发的DP
混合云管理
支持发布策略
支持可观测性
......
回退方案
流程 ( 触发机制等)
配置
DB
产品
自动化流水线
应用、项目自动化
基础设施自动化
稳定性管理
故障管理
故障自愈
容量设计
弹性设计
性能规划
亲和
可视化
CI CD 过程
监控
业务指标
消息通知
钉钉
邮件
工具类型
项目管理:禅道、 Jira 、 tapd 等
知识管理:MediaWiki 、 Confluence 等
源代码版本控制( SCM ):GitHub 、 Gitlab 、 BitBucket 、 SubVersion 等
代码复审:Gitlab 、 Gerrit 等
构建工具:Ant 、 Maven 、 Gradle 等
持续集成( CI ):Jenkins 、 Argo 、 DPA 等
单元测试:Junit 、 PyUnit 等
静态代码分析:Sonarqube、Findbugs、CppTest 等。
测试用例管理:???
API 测试:Jmeter 、 Postman 等
功能测试:Selenium 、 Katalon Studio 、 Watir 、 Cucumber 等
性能测试:Jmeter 、 Gradle 、 Loadrunner 等
配置管理:Ansible 、 Chef 、 Puppet 、 SaltStack 等
监控告警:Zabbix 、 Prometheus 、 Grafana 等
二进制库:Artifactory 、 Nexus 等
镜像仓库:Docker Distribution 、 Harbor 、 Nexus3 、 Artifactory 等
规范标准
文档
git流程
提交流程
commit规范
项目管理
feat: cloese ID234 ID345
pipeline管理
配置管理(自动化)
SQL管理(自动化)
flyway
版本维护
制品管理
回退方案
checklist
checklist
应用上线
应用名
架构图
容器规范检查
启动参数
组件依赖
业务关注点 ( 响应时间 / 并发 等)
日志格式
数据库规范
sql 规范
配置规范
路由规则
端口列表
应用变更(更新)
更新项
涉及到的规范
波及范围
运维
监控平台
基础监控
容器监控
应用监控
全链路
业务监控
日志平台
日志输出规范
日志收集
日志暂时
日志查看平台
运维大屏
SLO
运营
内部
内部流程
CICD 流程
上线流程
回退流程(机制)
外部
离线方案
如何离线部署?
离线交付流程?
一键下载脚本
下载相关初始化文件,镜像文件,编排文件,初始化脚本等
文档手册
文档既代码