容器引擎CCE

集群服务画像

概述

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 探针还可以确保应用程序的运行状况。

参考文档:

错误示例:

没有配置 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

示例页面:

image.png

上一篇
日志管理
下一篇
CCE 集群异常事件报警