跳至主要內容

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

zll2023年4月8日大约 7 分钟工作分享gitops容器平台gitops

平台规划

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

image
image

目标

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

职责

IT服务

SRE

架构

image
image

微服务

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

容器化

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

容器规范大纲

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

初始镜像

Distroless Containers: Hype or True Value?

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

crond

暂不需要

ntp依赖于宿主机系统时间

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

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-charts

K8S

部署前

系统

操作系统:

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

部署时

部署后

部署接管

DevOps(GitOps)

组织文化

业务协作

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

软件架构

云原生

流程图

image
image

自动化验证

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

应用上线

应用变更(更新)

运维

监控平台

基础监控

容器监控

应用监控

全链路

业务监控

日志平台

日志输出规范

日志收集

日志暂时

日志查看平台

运维大屏

SLO

落地方案 参考 CSDN文章

运营

内部

内部流程

CICD 流程

上线流程

回退流程(机制)

外部

离线方案

如何离线部署?

离线交付流程?

一键下载脚本

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

文档手册

文档既代码