为 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 用户名不区分大小写。此外,关于 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 shortcode 替换 code shortcode (e8b136c3b3)