为 Windows Pod 和容器配置 RunAsUserName
Kubernetes v1.18 [稳定]
本页介绍了如何在 Windows 节点上运行的 Pod 和容器中使用 runAsUserName
设置。它大致等同于特定于 Linux 的 runAsUser
设置,允许你以非默认用户名在容器中运行应用程序。
准备工作
你需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与你的集群通信。该集群应具有 Windows 工作节点,以便调度运行 Windows 工作负载的 Pod。
为 Pod 设置用户名
要指定执行 Pod 容器进程所使用的用户名,请在 Pod 规约中包含 securityContext
字段 (PodSecurityContext),并在其内部包含 windowsOptions
(WindowsSecurityContextOptions) 字段,该字段包含 runAsUserName
字段。
你为 Pod 指定的 Windows 安全上下文选项适用于 Pod 中的所有容器和初始化容器。
下面是一个配置示例,展示了一个设置了 runAsUserName
字段的 Windows Pod 的配置文件:
apiVersion: v1
kind: Pod
metadata:
name: run-as-username-pod-demo
spec:
securityContext:
windowsOptions:
runAsUserName: "ContainerUser"
containers:
- name: run-as-username-demo
image: mcr.microsoft.com/windows/servercore:ltsc2019
command: ["ping", "-t", "localhost"]
nodeSelector:
kubernetes.io/os: windows
创建 Pod
kubectl apply -f https://k8s.io/examples/windows/run-as-username-pod.yaml
验证 Pod 的容器正在运行
kubectl get pod run-as-username-pod-demo
获取运行中容器的 shell
kubectl exec -it run-as-username-pod-demo -- powershell
检查 shell 是否以正确的用户名运行
echo $env:USERNAME
输出应为
ContainerUser
为容器设置用户名
要指定执行容器进程所使用的用户名,请在容器清单中包含 securityContext
字段 (SecurityContext),并在其内部包含 windowsOptions
(WindowsSecurityContextOptions) 字段,该字段包含 runAsUserName
字段。
你为容器指定的 Windows 安全上下文选项仅适用于该单个容器,并会覆盖在 Pod 级别所做的设置。
下面是一个配置示例,展示了一个 Pod,其中包含一个容器,并且在 Pod 级别和容器级别都设置了 runAsUserName
字段:
apiVersion: v1
kind: Pod
metadata:
name: run-as-username-container-demo
spec:
securityContext:
windowsOptions:
runAsUserName: "ContainerUser"
containers:
- name: run-as-username-demo
image: mcr.microsoft.com/windows/servercore:ltsc2019
command: ["ping", "-t", "localhost"]
securityContext:
windowsOptions:
runAsUserName: "ContainerAdministrator"
nodeSelector:
kubernetes.io/os: windows
创建 Pod
kubectl apply -f https://k8s.io/examples/windows/run-as-username-container.yaml
验证 Pod 的容器正在运行
kubectl get pod run-as-username-container-demo
获取运行中容器的 shell
kubectl exec -it run-as-username-container-demo -- powershell
检查 shell 是否以正确的用户名运行(在容器级别设置的那个)
echo $env:USERNAME
输出应为
ContainerAdministrator
Windows 用户名限制
为了使用此功能,在 runAsUserName
字段中设置的值必须是有效的用户名。它必须具有以下格式:DOMAIN\USER
,其中 DOMAIN\
是可选的。Windows 用户名不区分大小写。此外,关于 DOMAIN
和 USER
还有一些限制:
runAsUserName
字段不能为空,并且不能包含控制字符(ASCII 值:0x00-0x1F
,0x7F
)。DOMAIN
必须是 NetBios 名称或 DNS 名称之一,每种都有自己的限制。- NetBios 名称:最多 15 个字符,不能以
.
(点)开头,并且不能包含以下字符:\ / : * ? " < > |
。 - DNS 名称:最多 255 个字符,只能包含字母数字字符、点和破折号,并且不能以
.
(点)或-
(破折号)开头或结尾。
- NetBios 名称:最多 15 个字符,不能以
USER
最多包含 20 个字符,不能**只**包含点或空格,并且不能包含以下字符:" / \ [ ] : ; | = , + * ? < > @
。
runAsUserName
字段的可接受值示例:ContainerAdministrator
、ContainerUser
、NT AUTHORITY\NETWORK SERVICE
、NT AUTHORITY\LOCAL SERVICE
。