UCS 微服务合规性

UCS 规范包含一组微服务必须遵循的规则或指南,以确保服务是 UCS 合规的。这些规则或指南旨在确保微服务是安全且可用于生产环境的。

在构建微服务时,UCS 微服务构建器 CLI 会执行检查,以确定微服务是否遵循这些合规性指南。其中一些检查是完全自动化的,一些是部分自动化的,而其余的是手动的,即微服务开发人员必须手动运行指定的检查并报告结果。

查看微服务合规性 - CLI 工具

CLI 工具的 service info 命令可用于查看合规性信息。默认情况下,会打印报告的摘要。要查看详细报告,请将 --show-compliance-details 添加到命令行

$ ucf_ms_builder_cli service info -n ucf.svc.myservice --show-compliance-details
name: ucf.svc.myservice
...
Compliance Info:
---------------------
Report Generated on 2022-11-08 12:56:36 (UTC) using MSBuilder v2.0.0
Development compliance (Mandatory) 65.38%
Development compliance (Optional) 33.33%

+---------+---------------------------------------------------------------------------------+-------------+--------+
|   ID    | Description                                                                     |  Mandatory  |  Pass  |
+=========+=================================================================================+=============+========+
| DEV-001 | K8S Service resource name must follow RFC 1035 convention                       |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-002 | Containers shall not use root permissions                                       |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-003 | Containers shall not use host network                                           |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-004 | Ports shall not clash in one Pod                                                |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-005 | No hardcoded IPs or service names                                               |      Y      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-006 | Endpoint definition files are available for each endpoint                       |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-007 | Endpoint definitions validation                                                 |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-008 | Parameter's format validation                                                   |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-009 | Liveness and readiness probes for containers                                    |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-010 | Helm chart must pass Helm lint test                                             |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-011 | MS Helm charts must not include any secrets like usernames, passwords, API keys |      Y      |   N    |
|         | in plain-text format                                                            |             |        |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-012 | Containers must not use floating tags like latest, head                         |      Y      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-013 | Components and manifest must pass JSON schema validation                        |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-014 | MS containers must not fetch and install packages at deploy time                |      Y      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-015 | At least one test must be implemented                                           |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-016 | Pods shall not use local directory path or host mount                           |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-017 | MS version updates must follow semantic versioning                              |      Y      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-018 | MS documentation must follow the MS documentation guidelines                    |      Y      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-019 | MS must be able to handle situations where dependent MS restart                 |      Y      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-020 | MS must be able to gracefully handle situations where dependent MS crash / are  |      Y      |   N    |
|         | unresponsive                                                                    |             |        |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-022 | Testapp shouldn't have '.' in the name                                          |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-023 | Microservice shouldn't have '_' in the name; instead use '-'                    |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-024 | Only accepted (key: value) pairs should be present in the manifest              |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-025 | Microservice must have at least one ingress or egress endpoint                  |      Y      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-027 | Microservice must read secrets from files                                       |      Y      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-101 | Log information to stdout or stderr                                             |      N      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-102 | Parameter naming should follow camelCase                                        |      N      |   Y    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-103 | Apply CPU and memory limits to pods                                             |      N      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+
| DEV-104 | If custom metrics need to be used to scale a microservice, it must implement    |      N      |   N    |
|         | metrics endpoint & add info to the metrics section.                             |             |        |
+---------+---------------------------------------------------------------------------------+-------------+--------|
| DEV-105 | Microservices must instrument their applications using OpenTelemetry SDK        |      N      |   N    |
+---------+---------------------------------------------------------------------------------+-------------+--------+

或者,也可以使用 UCS 应用程序构建器 CLI 工具

$ ucf_app_builder_cli service info -n ucf.svc.myservice --show-compliance-details

查看微服务合规性 - UCS Studio

UCS 微服务合规性规则

本节描述了一组 UCS 合规性规则。每个合规性规则都有一个 ID 来标识它。

摘要

在下表中

合规性 ID

描述

强制性

合规性执行者

DEV-001

K8S 服务资源名称必须遵循 RFC 1035 约定

MSB

DEV-002

容器不应使用 root 权限

MSB

DEV-003

容器不应使用主机网络

MSB

DEV-004

端口不应在一个 Pod 中冲突

MSB

DEV-005

没有硬编码的 IP 地址或服务名称

开发者

DEV-006

每个端点都有端点定义文件

MSB

DEV-007

端点定义验证

MSB

DEV-008

参数格式验证

MSB

DEV-009

容器的存活和就绪探针

MSB

DEV-010

Helm chart 必须通过 Helm lint 测试

MSB

DEV-011

MS Helm chart 不得包含任何秘密,例如用户名、密码、API 密钥的纯文本格式

开发者

DEV-012

容器不得使用浮动标签,例如 latesthead

MSB

DEV-013

组件和 manifest 必须通过 JSON schema 验证

MSB

DEV-014

MS 容器不得在部署时获取和安装软件包

开发者

DEV-015

必须至少实现一个测试

MSB

DEV-016

Pod 不得使用本地目录路径或主机挂载,必须通过 PV/PVC 使用

MSB

DEV-017

MS 版本更新必须遵循语义版本控制

MSB & 开发者

DEV-018

MS 文档必须遵循 MS 文档指南

MSB & 开发者

DEV-019

MS 必须能够处理依赖的 MS 重启的情况

开发者

DEV-020

MS 必须能够优雅地处理依赖的 MS 崩溃/无响应的情况

开发者

DEV-022

测试名称不应包含句点 (.)

MSB

DEV-023

服务名称不应包含下划线 (_)

MSB

DEV-024

检查 manifest 文件中无法识别的键

MSB

DEV-025

微服务必须至少有一个入口或出口端点

MSB

DEV-027

微服务必须从文件中读取密钥

开发者

DEV-101

将信息记录到 stdout 或 stderr

开发者

DEV-102

参数命名应遵循 camelCase

MSB

DEV-103

对 pod 应用 CPU 和内存限制

MSB

DEV-104

如果需要使用自定义指标来扩展微服务,则必须实现指标端点并向指标部分添加信息

开发者

DEV-105

微服务必须使用 OpenTelemetry SDK 来检测其应用程序

开发者

详细信息

DEV-001 - 服务名称

UCS 微服务中的 Kubernetes 服务资源名称必须遵循 RFC 1035 DNS 标签标准。这是 Kubernetes 本身的要求。这意味着名称必须

  • 最多包含 63 个字符

  • 仅包含小写字母数字字符或 ‘-’

  • 以字母字符开头

  • 以字母数字字符结尾

UCS 微服务构建器 CLI 工具将检查 UCS 微服务中的所有 Kubernetes 服务资源是否符合上述标准。


DEV-002 - 容器不应使用 root 权限

  • UCS 微服务中必须使用非 root 容器。这可以通过在容器的 Dockerfile 中添加 USER 指令来完成

  • 必须在部署中设置 PodSecurityContext,并根据需要设置最小权限。

  • 必须设置 runAsUser

  • privileged 必须为 false / 未设置

UCS 微服务构建器 CLI 工具将使用 docker / helm 命令来检查是否遵循了上述指南


DEV-003 - 无主机网络

UCS 微服务中的 Pod 不得使用主机网络。这可以通过将 pod 规范中的 hostNetwork 设置为 false 或保持未设置来完成。

UCS 微服务构建器 CLI 工具将检查 UCS 微服务中的所有工作负载资源中是否存在 pod 规范中的 hostNetwork: True


DEV-004 - 端口不应在一个 pod 中冲突

UCS 微服务 pod 中指定的任何两个容器都不应暴露相同的端口。

UCS 微服务构建器 CLI 工具将检查 pod 规范以检查端口冲突


DEV-005 - 无硬编码 IP 地址或服务名称

UCS 微服务不得硬编码 IP 地址或服务名称以连接到其他微服务。它们必须使用出口端点和 $egress 占位符,这些占位符由 UCS 应用程序构建器工具替换为连接的入口端点详细信息。

由于很难检查 helm chart 中的字符串是否为 IP 地址/服务名称,因此 UCS 微服务构建器 CLI 工具不会对此规则进行检查。开发人员必须确保自己遵循此规则。


DEV-006 - 每个端点都有端点定义文件

必须为添加到 UCS 微服务的每个入口和出口端点指定一个端点定义文件。该文件必须添加到端点目录,并且必须具有名称 <endpoint-name>.<ext>,其中扩展名(和文件格式)取决于端点方案。

UCS 微服务构建器 CLI 工具将检查 manifest 中每个入口/出口端点是否存在端点定义文件。


DEV-007 - 端点定义验证

每个端点定义文件必须遵循基于端点方案的规范。有关端点规范的更多详细信息,请参见 UCS 端点方案

UCS 微服务构建器 CLI 工具将根据规范验证每个端点文件。


DEV-008 - 参数格式验证

参数应遵循 UCS MS 规范的参数规范部分。

UCS 微服务构建器 CLI 工具将验证参数注释是否有效。


DEV-009 - 容器的存活和就绪探针

UCS 微服务中的容器必须指定有效的存活和就绪探针。

UCS 微服务构建器 CLI 工具将检查微服务中所有容器是否指定了存活和就绪探针,但不检查它们是否正确。MS 开发人员有责任确保探针正常工作。


DEV-010 - Helm chart 必须通过 helm lint

UCS 微服务构建器 CLI 工具生成的 helm chart 或预构建的 helm chart 必须通过 helm linter。

UCS 微服务构建器 CLI 工具将在构建微服务时自动对微服务 helm chart 运行 helm lint。


DEV-011 - 无硬编码密钥

密码、API 密钥等密钥不得在 UCS MS 中硬编码。相反,必须使用从密钥创建的 volumeMounts/环境变量。

必须使用 Kubernetes secret、hashicorp vault 等工具。

MS 开发人员有责任正确遵循此指南。


DEV-012 - 容器不得使用浮动标签

UCS 微服务中提到的容器镜像不得使用浮动标签,例如 latesthead 等,因为这些标签引用的实际镜像可能会在发布和部署时间之间发生更改。必须使用引用固定版本的标签字符串。

UCS MS 构建器将执行有限的检查,以确保镜像标签不包含已知的浮动标签,例如 latesthead。MS 开发人员有责任确保使用正确的固定版本标签。


DEV-013 - 组件和 manifest 必须通过 JSON schema 验证

UCS msbuilder 输入 manifest 文件必须遵循 manifest 规范。manifest 中使用的组件必须正确指定组件参数,并通过参数 JSON schema 验证。

UCS MS 构建器将根据组件的参数 schema 验证 manifest 文件和 manifest 中每个组件的参数。


DEV-014 - MS 容器不得在部署时获取和安装软件包

UCS 微服务中的容器不得在部署时获取和安装软件包,因为这会使容器的 CVE 扫描失效。

MS 开发人员有责任正确遵循此指南


DEV-015 - 必须至少实现一个测试

必须至少实现一个测试并将其添加到 UCS 微服务输入 manifest 中。

UCS 微服务构建器 CLI 工具将检查输入 manifest 文件中是否存在至少一个有效的测试规范。


DEV-016 - 无本地主机挂载

UCS MS 中的 Pod 不得使用 hostPath 卷直接挂载主机路径(文件或目录)。UCS 微服务必须使用 PV/PVC 以及 local-path-provisioner 或 mdx-local-path-provisioner 等 provisioner。

UCS 微服务构建器 CLI 工具将检查 UCS 微服务中是否存在 hostPath 卷。


DEV-017 - MS 版本更新必须遵循语义版本控制

UCS 微服务的更新必须遵循语义版本控制指南。有关更多信息,请参阅 https://semver.org/

MS 开发人员有责任正确遵循语义版本控制指南。UCS 微服务构建器 CLI 工具并非总是能够检测到更改是向后兼容的增强功能/错误修复/向后不兼容的更新。


DEV-018 - MS 文档必须遵循 UCS MS 文档指南

UCS 微服务的文档必须遵循 UCS MS 文档指南。微服务必须具有

  • 指定格式的 README.md,其中包含指定的章节列表

  • LICENSE.txt,其中包含微服务许可证信息以及使用的任何第三方软件的许可证

  • changelog.txt,其中包含当前版本相对于先前版本的更改列表

可以使用 ucf_ms_builder_cli service create 命令生成上述文档的模板。

UCS 微服务构建器 CLI 工具将检查上述文件是否存在,以及它们是否包含某些章节。但是,MS 开发人员也有责任正确遵循文档指南并指定正确的信息。


DEV-019 - MS 必须能够处理依赖的 MS 重启的情况

UCS 微服务必须能够处理部署中依赖的微服务重启的情况。这可能是因为依赖的微服务崩溃或 helm 升级导致了重启。建议:

  • 微服务应继续尝试重新连接到依赖的微服务;或者

  • 优雅退出,以便 Kubernetes 将不断重启微服务,直到它能够连接到依赖的微服务并正常运行

UCS 微服务不应在这种情况下陷入停滞/死锁。

MS 开发人员有责任正确遵循此指南。可以实施测试来模拟这种情况。


DEV-020 - MS 必须能够处理依赖的 MS 崩溃/变得无响应/返回不正确结果的情况

UCS 微服务必须能够处理部署中依赖的微服务崩溃或变得无响应或返回不正确结果的情况。建议:

  • 微服务应继续尝试重新连接到依赖的微服务;或者

  • 优雅退出,以便 Kubernetes 将不断重启微服务,直到它能够连接到依赖的微服务并正常运行

记录退出的确切原因,以便易于调试问题

UCS 微服务不应在这种情况下陷入停滞/死锁。

MS 开发人员有责任正确遵循此指南。可以实施测试来模拟这种情况。


DEV-022 - 测试应用程序名称不应包含 .

manifest 文件中指定的测试应用程序名称不得包含点号 .

UCS 微服务构建器 CLI 工具将检查 manifest 中的测试名称是否符合此条件


DEV-023 - 微服务名称不应包含 _

微服务名称不应包含 _。而应使用 - 来分隔单词

UCS 微服务构建器 CLI 工具将在构建时检查微服务名称。


DEV-024 - manifest 中应仅存在接受的(键:值)对

输入 manifest 文件必须仅包含接受的键值对。不允许使用无关的参数。

UCS 微服务构建器 CLI 工具将检查 manifest 文件内容中是否存在无关的参数。


DEV-025 - 微服务必须至少有一个入口或出口端点

微服务必须至少有一个入口或出口端点。不允许使用没有端点的微服务。

UCS 微服务构建器 CLI 工具将检查 manifest 中是否至少有一个端点。


DEV-027 - 微服务必须从文件中读取密钥

微服务必须从文件中读取密钥。

MS 开发人员有责任正确遵循此指南。


DEV-101 - 将信息记录到 stdout 或 stderr

UCS 微服务中的容器必须将信息记录到 stdout/stderr。

MS 开发人员有责任正确遵循此指南


DEV-102 - 参数命名应遵循 camelCase

参数名称应以小写字母开头,并遵循 camelCase 命名约定。

UCS 微服务构建器 CLI 工具将部分检查参数名称是否遵循 camelCase,如果不是,则记录警告。


DEV-103 - 对 pod 应用 CPU 和内存限制

UCS 微服务中的 Pod 必须使用容器部分中的 resources 参数应用 CPU 和内存限制。

UCS 微服务构建器 CLI 工具将检查是否已指定资源限制,如果未指定,则记录警告。

DEV-104 - 如果需要使用自定义指标来扩展微服务,则必须实现指标端点并向指标部分添加信息。

添加到指标部分的信息供 UCS 应用程序构建器用于配置 Prometheus 服务器以从微服务抓取指标。应用程序开发人员也可以查看此信息,包括指标列表及其详细信息。这可以用于创建 Horizontal autoscaling 的配置。

MS 开发人员有责任正确遵循此指南。


DEV-105 - 微服务必须使用 OpenTelemetry SDK 来检测其应用程序

微服务必须使用 OpenTelemetry SDK 来检测其应用程序。这是为了将应用程序与检测后端解耦,并使其保持供应商中立。

MS 开发人员有责任正确遵循此指南。