以非 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 中所有容器提供默认的安全设置。
对于 TidbCluster 和 DMCluster,你可以在以下级别配置 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。
TidbDashboard、TidbNGMonitoring、TidbInitializer、TidbMonitor、Backup、BackupSchedule 和 Restore 等其他 CR 也支持 Pod 级别的安全上下文设置。有关支持的字段和路径,请参考 API 文档。
配置容器级别的安全上下文
从 TiDB Operator v1.6.6 起,以下 CR 支持容器级别的安全上下文:
- 对于
TidbCluster和DMCluster,配置spec.<component>.securityContext,例如spec.pd.securityContext、spec.tidb.securityContext、spec.master.securityContext或spec.worker.securityContext。这些 CR 不支持集群级别的spec.securityContext。 - 对于
TidbDashboard,配置spec.securityContext。 - 对于
TidbNGMonitoring,配置spec.ngMonitoring.securityContext。在顶层配置spec.securityContext不会对生成的容器生效。 - 对于
TidbMonitor,分别为生成的容器配置securityContext。支持的路径包括spec.initializer.securityContext、spec.prometheus.securityContext、spec.grafana.securityContext、spec.reloader.securityContext、spec.prometheusReloader.securityContext、spec.thanos.securityContext和spec.dm.initializer.securityContext。
TidbInitializer、Backup、BackupSchedule 和 Restore 不支持容器级别的 securityContext。
有关 ComponentSpec.securityContext 的完整字段说明,请参考 ComponentSpec API 文档。
例如,以下配置让 PD 容器以非 root 用户运行,设置其卷的组所有权,并禁止容器进程获得超出其父进程的特权:
spec:
pd:
podSecurityContext:
fsGroup: 2000
securityContext:
runAsNonRoot: true
runAsUser: 1000
runAsGroup: 2000
allowPrivilegeEscalation: false