运维平台建设流程和规范大纲

工作分享gitops容器平台gitops约 2202 字大约 7 分钟

平台规划

通过容器平台的搭建,来支持微服务架构应用,满足业务的快速开发和迭代需求,逐步建立标准的开发、 测试,、生成环境, 形成统一的规范和标准,为快速交付赋能。同时需适应公司DevOps过程, 完善开发、测试、部署、运维监控工具链和自动化流程,提升敏捷研发、持续集成的能力;

image
image

目标

容器平台搭建,并适应devops流程,推进个项目的接入

职责

IT服务

  • IDC机房

    • 服务器,网络服务,存储等基础服务的稳定,用来支撑上层业务
  • 硬件服务器维护 / 虚拟化资源维护 / 操作系统的安装部署

  • 内部AD管理

    • ldap

    • dns

    • jms

    • gitlab

    • 其他

  • 安全管理

    • 域名

    • 证书

    • 网络策略

    • 防火墙策略

    • VPN

  • 其他

    • 待定

SRE

  • 业务运维规范和维护

  • CICD 工作流的创建, 辅助产品快速迭代和发布

  • 搭建监控平台 , ( 后续可配合SLO (SLI) 进行监控 )

    • 业务监控 ( 产品维度 )

    • 应用监控 ( 中间件 )

    • 链路追踪

    • 资源监控(应用以及基础)

  • 搭建日志平台, ( 后续可配合SLO (SLI) 进行监控 )

    • 日志收集

    • 日志监控

    • 日志分析

    • 故障定位

  • infra服务(中间件)维护-安全,稳定,高效. ( 目前选型 bitnami )

  • 数据库

架构

image
image

微服务

微服务更多的是开发规范和标准, 有基础设施组负责。

容器化

目标: 以容器化方式运行产品

容器规范大纲

容器化规范对象
容器规范的价值及作用
容器规范的目标镜像规范
镜像规范的作用
镜像规范的目标
镜像存储规范
镜像 Tag 规范
墓础镜像规范
镜像命名规范
镜像使用规范
墓础镜像清单
容器命名规范
Dockerfile 规范
    FROM 指令:
    RUN 指令
    WORKDIR 指令

初始镜像

Distroless Containers: Hype or True Value?open in new window

不要轻易使用 Alpine 镜像来构建 Docker 镜像,有坑!open in new window

crond

暂不需要

ntp依赖于宿主机系统时间

  • 时区设置 (Shanghai)

https://cloud.tencent.com/developer/article/1626811open in new window

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数据库
ESelasticsearch
MINIOminio服务器
REDISredis服务
MQ消息队列
NACOS配置中心
KAFKAkafka服务
ZABBIXzabbix服务
ZOOKEEPERZooKeeper服务
SKYWALKINGSkyWalking服务

属性关键字

关键字说明备注
ADDR地址,此地址为域名或IP127.0.0.1 、 example.jkstack.com
USER用户名
PASSWD密码
URL此参数为urlhttp://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}"

中间件镜像

  • 规范与产品镜像相同 或使用官网/开源的

bitnami-chartsopen in new window

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
swapLVM LVswap
/LVM LVext4
sdb/optLVM LV

部署时

  • 版本选择

  • 存储方案  ( 分布式存储 ?)

  • 网络选型 ( flannel ? )

  • 自动化

    • RKE

    • 自研

  • 离线方案

    • 离线包管理

    • 离线自动部署

    • 离线包版本管理 (自动化)

部署后

  • 升级

    • 版本升级
  • 扩容

  • 日志 (延后)

  • 监控 (延后)

部署接管

DevOps(GitOps)

组织文化

业务协作

业务迭代流程  ( 自动化发布流程)

软件架构

云原生

流程图

image
image

自动化验证

UI自动化

接口自动化

性能?

输出:测试报告

混沌测试open in new window

环境与配置

环境隔离

版本控制

变更管理

部署与监控

自动部署

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

落地方案 参考 CSDN文章open in new window

运营

内部

内部流程

CICD 流程

上线流程

回退流程(机制)

外部

离线方案

如何离线部署?

离线交付流程?

一键下载脚本

下载相关初始化文件,镜像文件,编排文件,初始化脚本等

文档手册

文档既代码