📣
TiDB Cloud Premium 开放公测中。为企业级工作负载提供无限扩展、即时弹性伸缩和高级安全保障。立即体验 →

以非 root 用户运行容器



在某些 Kubernetes 环境中,无法用 root 用户运行容器。本文介绍如何通过配置 securityContext 来以非 root 用户运行容器。

配置 TiDB Operator 相关的容器

对于 TiDB Operator 相关的容器,你可以在 Helm 的 values.yaml 文件中配置安全上下文 (security context)。TiDB operator 的所有相关组件都支持该配置 (<controllerManager/scheduler/advancedStatefulset/admissionWebhook>.securityContext)。

以下是一个配置示例:

controllerManager: securityContext: runAsUser: 1000 runAsGroup: 2000 fsGroup: 2000

配置按照 CR 生成的容器

对于按照 Custom Resource (CR) 生成的容器,你可以配置 Pod 级别或容器级别的安全上下文。不同 CR 支持的字段有所不同。

配置 Pod 级别的安全上下文

podSecurityContext 用于定义 Pod 级别的安全设置,例如卷的所有权,同时也会为 Pod 中所有容器提供默认的安全设置。

对于 TidbClusterDMCluster,你可以在以下级别配置 podSecurityContext

  • 集群级别:配置 spec.podSecurityContext,对所有组件生效:

    spec: podSecurityContext: runAsUser: 1000 runAsGroup: 2000 fsGroup: 2000
  • 组件级别:配置 spec.<component>.podSecurityContext,仅对指定组件生效。例如,为 TidbCluster 的 TiDB 组件配置 spec.tidb.podSecurityContext,或为 DMCluster 的 master 组件配置 spec.master.podSecurityContext

    spec: pd: podSecurityContext: runAsUser: 1000 runAsGroup: 2000 fsGroup: 2000 tidb: podSecurityContext: runAsUser: 1000 runAsGroup: 2000 fsGroup: 2000

如果同时配置了这两个级别,该组件将使用组件级别的 podSecurityContext 替代集群级别的 podSecurityContext

TidbDashboardTidbNGMonitoringTidbInitializerTidbMonitorBackupBackupScheduleRestore 等其他 CR 也支持 Pod 级别的安全上下文设置。有关支持的字段和路径,请参考 API 文档

配置容器级别的安全上下文

从 TiDB Operator v1.6.6 起,以下 CR 支持容器级别的安全上下文

  • 对于 TidbClusterDMCluster,配置 spec.<component>.securityContext,例如 spec.pd.securityContextspec.tidb.securityContextspec.master.securityContextspec.worker.securityContext。这些 CR 不支持集群级别的 spec.securityContext
  • 对于 TidbDashboard,配置 spec.securityContext
  • 对于 TidbNGMonitoring,配置 spec.ngMonitoring.securityContext。在顶层配置 spec.securityContext 不会对生成的容器生效。
  • 对于 TidbMonitor,分别为生成的容器配置 securityContext。支持的路径包括 spec.initializer.securityContextspec.prometheus.securityContextspec.grafana.securityContextspec.reloader.securityContextspec.prometheusReloader.securityContextspec.thanos.securityContextspec.dm.initializer.securityContext

TidbInitializerBackupBackupScheduleRestore 不支持容器级别的 securityContext

有关 ComponentSpec.securityContext 的完整字段说明,请参考 ComponentSpec API 文档

例如,以下配置让 PD 容器以非 root 用户运行,设置其卷的组所有权,并禁止容器进程获得超出其父进程的特权:

spec: pd: podSecurityContext: fsGroup: 2000 securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 2000 allowPrivilegeEscalation: false

文档内容是否有帮助?