为 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 中的所有容器和 init 容器。

以下是一个具有 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 具有一个容器,并且 runAsUserName 字段在 Pod 级别和容器级别都设置了

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 用户名不区分大小写。此外,还有一些关于 DOMAINUSER 的限制

  • runAsUserName 字段不能为空,并且不能包含控制字符(ASCII 值:0x00-0x1F0x7F
  • DOMAIN 必须是 NetBios 名称或 DNS 名称,每个名称都有其自己的限制
    • NetBios 名称:最多 15 个字符,不能以 .(点)开头,并且不能包含以下字符:\ / : * ? " < > |
    • DNS 名称:最多 255 个字符,仅包含字母数字字符、点和连字符,并且不能以 .(点)或 -(连字符)开头或结尾。
  • USER 最多包含 20 个字符,不能包含点或空格,并且不能包含以下字符:" / \ [ ] : ; | = , + * ? < > @

runAsUserName 字段的可接受值的示例:ContainerAdministratorContainerUserNT AUTHORITY\NETWORK SERVICENT AUTHORITY\LOCAL SERVICE

有关这些限制的更多信息,请查看 此处此处

下一步

上次修改时间:2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 短代码代替 code 短代码 (e8b136c3b3)