集群服务画像
更新时间:2024-05-30
概述
CCE 的服务画像可以查看集群内所有资源的特征和规范性,如镜像检查、应用检查、网络检查、安全检查,并给出对应的评分和详细内容,帮助用户更好的了解集群内服务状况。
注意:服务画像的结果基于前一天的集群数据,且检查规则是一般判定标准,不一定适用于所有业务场景。
检查对象
检查的对象包括:
- 集群内的所有命名空间。
- 资源对象包括:Deployment、DaemonSet、StatefulSet、Service、CronJob、Job。
检查规则
一. 镜像检查
检查项 | 含义 | 影响级别 |
---|---|---|
tagNotSpecified | 镜像地址没有声明 tag或者 tag 为 latest | danger |
pullPolicyNotAlways | 镜像拉取策略不是 always | warning |
解释:
- tagNotSpecified: 如果不声明镜像的版本(tag),则默认为 latest。不指定 tag 可能会导致各种各样的问题,如同一时刻不同 pod 可能运行了不同的程序,尽管他们看起来镜像版本是相同的。另外,没有版本标识的镜像在发布时无法区分版本号,无法进行回滚操作。
- pullPolicyNotAlways: 依赖缓存的镜像可能会成为一个问题,尤其是配置了 latest 的 tag 时会直接使用本地缓存的镜像,不去拉取最新镜像。建议配置为 Always,不配置时默认就是 Always。
参考文档:https://vsupalov.com/docker-latest-tag/
错误示例:
containers:
- name: nginx
image: hub.baidubce.com/cce/nginx-alpine-go:latest
imagePullPolicy: Never
正确示例:
containers:
- name: nginx
image: hub.baidubce.com/cce/nginx-alpine-go:v1
imagePullPolicy: Always
二. 应用检查
检查项 | 含义 | 影响级别 |
---|---|---|
cpuRequestsMissing | 没有声明 cpu resource request 值 | danger |
cpuLimitsMissing | 没有声明 cpu resource limit 值 | danger |
memoryRequestsMissing | 没有声明 memory resource request 值 | danger |
memoryLimitsMissing | 没有声明 memory resource limit 值 | danger |
readinessProbeMissing | 没有声明 readinessProbe | danger |
livenessProbeMissing | 没有声明 livenessProbe | danger |
解释:
- 为运行在 Kubernetes 中的容器配置资源请求(request)和限制(limit)是一个典型实践。设置适当的 request 将确保所有应用程序都有足够的计算资源,设置适当的 limit 将确保应用程序不会占用太多资源。
- readinessProbe 和 livenessProbe 可以帮助维护运行在 Kubernetes 中应用程序的健康状态。默认情况下 Kubernetes 只知道进程是否正在运行,而不知道它是否正常。正确配置 readiness 和 liveness 探针还可以确保应用程序的运行状况。
参考文档:
- https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
- https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-resource-requests-and-limits
- https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
错误示例:
没有配置 resources、livenessProbe、readinessProbe
正确示例:
resources: # 资源限制
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
livenessProbe: # 健康检查:存活探针
httpGet:
path: /
port: 80
initialDelaySeconds: 20
timeoutSeconds: 5
periodSeconds: 5
readinessProbe: # 健康检查:就绪探针
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 5
三. 网络检查
检查项 | 含义 | 影响级别 |
---|---|---|
hostNetworkSet | 设置了 hostNetwork | warning |
hostPortSet | 设置了 hostPort | warning |
解释:
- hostNetworkSet: 尽管 Kubernetes 允许部署一个可以访问主机网络名称空间的 pod,但这并不是一个好的实践。在启用 hostNetwork 属性的情况下运行的 pod 将可以访问环回设备、监听本地主机的服务,并可用于窥探同一节点上其他 pod 的网络活动。一些特殊的系统组件可以将 hostNetwork 设置为 true,如 node-exporter。
- hostPortSet: 在容器上设置 hostPort 属性将确保它可以在部署到的每个节点上的特定端口上访问。但如果指定了 hostPort 将限制在集群中调度 pod 的能力。
参考文档:https://kubernetes.io/docs/concepts/configuration/overview/#services
错误示例:
spec:
hostNetwork: true
containers:
- name: nginx
ports:
- containerPort: 80
hostPort: 80
正确示例:
spec:
hostNetwork: false
containers:
- name: nginx
ports:
- containerPort: 80
四. 安全检查
检查项 | 含义 | 影响级别 |
---|---|---|
hostIPCSet | 设置了 hostPID | danger |
hostPIDSet | 设置了 hostPID | danger |
notReadOnlyRootFileSystem | 没有设置文件系统为只读 | warning |
privilegeEscalationAllowed | 允许了特权升级 | danger |
runAsRootAllowed | 作为 root 账户执行 | danger |
runAsPrivileged | 特权模式执行 | danger |
dangerousCapabilities | capabilities 中有危险选项如 ALL/SYS_ADMIN/NET_ADMIN | danger |
解释:
在 Kubernetes 中保护工作负载是整个集群安全的一个重要部分,总体目标应该是确保容器以尽可能少的特权运行。这包括避免权限提升、不使用 root 用户运行容器以及尽可能使用只读文件系统。
参考文档:https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
错误示例:
spec:
hostPID: true
hostIPC: true
containers:
- name: nginx
securityContext:
capabilities:
add: ["SYS_ADMIN"]
正确示例:
spec:
hostPID: false
hostIPC: false
containers:
- name: nginx
计分规则
结果评分的计算方式为:检测通过数/检测总数 * 100
示例页面: