名称

podman-kube-play - 基于 Kubernetes YAML 创建容器、Pod 和卷

简介

podman kube play [选项] 文件.yml|-|https://website.io/文件.yml

描述

podman kube play 读取结构化的 Kubernetes YAML 文件。它会重新创建 YAML 中描述的容器、Pod 或卷。然后,Pod 中的容器会被启动,并输出新 Pod 的 ID 或新卷的名称。如果 YAML 文件指定为“-”,则 podman kube play 从标准输入读取 YAML 文件。输入也可以是指向 YAML 文件的 URL,例如 https://podman.org.cn/demo.yml。podman kube play 从 URL 读取 YAML 并从中创建 Pod 和容器。

使用 --down 命令行选项,它还可以销毁由之前运行的 podman kube play 创建的 Pod。

使用 --replace 命令行选项,它会销毁之前运行的 podman kube play 创建的 Pod(如果有),并使用 Kubernetes YAML 文件重新创建 Pod。

理想情况下,输入文件由 Podman 命令创建(参见 podman-kube-generate(1))。这保证了平滑导入和预期结果。

目前支持的 Kubernetes 类型有

  • Pod

  • 部署(Deployment)

  • 持久卷声明(PersistentVolumeClaim)

  • 配置映射(ConfigMap)

  • Secret

  • 守护进程集(DaemonSet)

  • 作业(Job)

Kubernetes Pod 部署

kube play 仅支持五种卷类型:hostPathemptyDirconfigMappersistentVolumeClaimimage 卷类型。

  • 使用 hostPath 卷类型时,仅支持 default (empty)DirectoryOrCreateDirectoryFileOrCreateFileSocketCharDeviceBlockDevice 子类型。当 hostPath path 的值包含至少一个正斜杠时,Podman 将其解释为文件路径;否则,Podman 将该值视为命名卷的名称。

  • 使用 persistentVolumeClaim 时,claimName 的值是 Podman 命名卷的名称。

  • 使用 emptyDir 卷时,Podman 会创建一个匿名卷,该卷附加到在 Pod 内部运行的容器,并在 Pod 移除后删除。

  • 使用 configMap 卷时,Podman 会创建一个匿名卷,该卷附加到在 Pod 内部运行的容器,并在 Pod 移除后删除。

  • 使用 image 卷时,Podman 会创建一个只读镜像卷,其子路径为空(整个镜像被挂载)。该镜像必须已在本地存在。它仅在有根模式下受支持。

注意:容器的默认重启策略是 always。您可以通过在 spec 中设置 restartPolicy 字段来更改默认值。

注意:当播放包含 init 容器的 kube YAML 时,init 容器以 init 类型值 once 创建。要更改默认类型,请使用 io.podman.annotations.init.container.type 注释将类型设置为 always

注意:由 kube play 创建的 hostPath 卷类型被赋予 SELinux 共享标签 (z),绑定挂载不会重新标记(使用 chcon -t container_file_t -R <directory>)。

注意:要设置 Pod 的用户命名空间,请在 Pod/部署定义中使用 io.podman.annotations.userns 注释。例如,io.podman.annotations.userns=keep-id 注释告诉 Podman 创建一个用户命名空间,其中当前无根用户的 UID:GID 映射到容器中的相同值。这可以通过 --userns 标志覆盖。

注意:使用 io.podman.annotations.volumes-from 注释将一个容器的卷绑定挂载到另一个容器。您可以将多个源容器的卷挂载到目标容器。属于同一 Pod 的源容器必须在 kube YAML 中目标容器之前定义。注释格式为 io.podman.annotations.volumes-from/targetContainer: "sourceContainer1:mountOpts1;sourceContainer2:mountOpts2"

注意:如果使用 :latest 标签,Podman 会尝试从注册表拉取镜像。如果镜像是在本地使用 Podman 或 Buildah 构建的,并且其域为 localhost,则 Podman 会使用本地存储中的镜像,即使它带有 :latest 标签。

注意:命令 podman play kubepodman kube play 的别名,执行相同的功能。

注意:命令 podman kube down 可用于停止和移除基于与 podman kube play 创建 Pod 相同的 Kubernetes YAML 文件。

注意:要自定义 podman kube play 期间创建的基础设施容器的名称,请在 Pod 定义中使用 io.podman.annotations.infra.name 注释。当从使用 --infra-name 标志创建的 Pod 生成 kube yaml 时,此注释会自动设置。

注意:使用 io.podman.annotations.pids-limit/$ctrname 注释来配置 Pod 的 pids 限制。

注意:使用 io.podman.annotations.cpuset/$ctrname 注释将容器的执行限制到特定的 CPU 核心集。这相当于 podman-run(1) 中的 --cpuset-cpus=number 选项。

注意:使用 io.podman.annotations.memory-nodes/$ctrname 注释将容器的内存分配限制到 NUMA 系统上的特定内存节点集。这相当于 podman-run(1) 中的 --cpuset-mems=nodes 选项。

Kubernetes 持久卷声明

Kubernetes PersistentVolumeClaim 表示一个 Podman 命名卷。Podman 创建卷只需要 PersistentVolumeClaim 名称。Kubernetes 注释可用于利用 Podman 卷的可用选项。

  • volume.podman.io/driver

  • volume.podman.io/device

  • volume.podman.io/type

  • volume.podman.io/uid

  • volume.podman.io/gid

  • volume.podman.io/mount-options

  • volume.podman.io/import-source

  • volume.podman.io/image

使用 volume.podman.io/import-source 将注释值中指定的 tarball(.tar、.tar.gz、.tgz、.bzip、.tar.xz、.txz、.tar.zst)内容导入到创建的 Podman 卷中

如果给定正确的目录布局和 Containerfile,Kube play 能够即时构建镜像。此选项目前不适用于远程客户端,包括 Mac 和 Windows(不包括 WSL2)机器。考虑 YAML 文件中的以下摘录

apiVersion: v1
kind: Pod
metadata:
...
spec:
  containers:
  - name: container
    image: foobar
...

如果当前工作目录中存在名为 foobar 的目录,并且其中包含名为 ContainerfileDockerfile 的文件,Podman kube play 会构建该镜像并将其命名为 foobar。此示例的目录结构示例如下

|- mykubefiles
    |- myplayfile.yaml
    |- foobar
         |- Containerfile

构建将 foobar 视为构建的上下文目录。如果本地存储中存在名为 foobar 的镜像,除非使用 --build 标志,否则不会构建该镜像。使用 --build=false 完全禁用构建。

Kube play 支持 CDI(Container Device Interface)设备选择器,以将主机设备(例如 GPU)与容器共享。配置格式遵循 Kubernetes 扩展资源管理

apiVersion: v1
kind: Pod
spec:
  containers:
  - name: container
    resources:
      limits:
        nvidia.com/gpu=all: 1

为了启用共享主机设备,类似于使用 --device 标志,Podman kube 支持自定义 CDI 选择器:podman.io/device=<host device path>

Kubernetes ConfigMap

Kubernetes ConfigMap 可以作为 Pod 或 Deployment 中环境变量或卷的来源。ConfigMaps 在 Podman 中不是独立的 objevt;相反,当容器使用 ConfigMap 时,Podman 会根据需要创建环境变量或卷。

例如,以下 YAML 文档定义了一个 ConfigMap,然后在 Pod 中使用它

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo
data:
    FOO: bar
---
apiVersion: v1
kind: Pod
metadata:
  name: foobar
spec:
  containers:
  - name: container-1
    image: foobar
    envFrom:
    - configMapRef:
        name: foo
        optional: false

结果是容器 container-1 的环境变量 FOO 被设置为 bar

Kubernetes Secret

Kubernetes Secret 表示一个 Podman 命名 Secret。Kubernetes Secret 作为一个整体保存,可以作为 Pod 或部署中环境变量或卷的来源。

例如,以下 YAML 文档定义了一个 Secret,然后在 Pod 中使用它

kind: Secret
apiVersion: v1
metadata:
  name: foo
data:
  foo: YmFy # base64 for bar
---
apiVersion: v1
kind: Pod
metadata:
  name: foobar
spec:
  containers:
  - name: container-1
    image: foobar
    env:
    - name: FOO
      valueFrom:
        secretKeyRef:
          name: foo
          key: foo

结果是容器 container-1 的环境变量 FOO 被设置为 bar

自动挂载卷 (已弃用)

注意:自动挂载注释已弃用。Kubernetes 原生支持镜像卷,应使用它而不是此 Podman 特定注释。

如果给定注释 io.podman.annotations.kube.image.automount/$ctrname,镜像可以自动挂载到容器中。适用以下规则

  • 镜像必须已在本地存在。

  • 镜像必须至少有 1 个卷指令。

  • 卷指令给定的路径将从镜像挂载到容器中。例如,卷位于 /test/test_dir 的镜像会将镜像中的 /test/test_dir 挂载到容器中的 /test/test_dir

  • 可以指定多个镜像。如果多个镜像在特定路径上有一个卷,则最后一个指定的镜像优先。

  • 镜像始终以只读方式挂载。

  • 要挂载的镜像在注释“io.podman.annotations.kube.image.automount/$ctrname”中定义为分号分隔的列表。它们被挂载到 Pod 中的单个容器中,而不是整个 Pod。如果需要额外的挂载,可以为其他容器指定注释。

选项

--annotation=key=value

为容器添加一个注解。此选项可以多次设置。

注意:对于 podman kube play--annotation 标志将 Podman 特定的注释添加到由 Podman 创建的容器和 Pod,而不是 Kubernetes YAML 本身。这些注释可用于配置 Podman 特定的功能,如用户命名空间 (io.podman.annotations.userns)、卷来源 (io.podman.annotations.volumes-from) 和其他容器行为。

--authfile=path

认证文件的路径。在 Linux 上默认为 ${XDG_RUNTIME_DIR}/containers/auth.json,在 Windows/macOS 上默认为 $HOME/.config/containers/auth.json。该文件由 podman login 创建。如果在此处找不到授权状态,则会检查 $HOME/.docker/config.json,该文件是使用 docker login 设置的。

注意:还可以通过设置 REGISTRY_AUTH_FILE 环境变量来覆盖认证文件的默认路径。这可以通过 export REGISTRY_AUTH_FILE=path 完成。

--build

即使在本地存储中找到镜像,也构建镜像。使用 --build=false 完全禁用构建。(此选项不适用于远程 Podman 客户端)

注意:您还可以通过设置 BUILDAH_ISOLATION 环境变量来覆盖默认的隔离类型。export BUILDAH_ISOLATION=oci。有关更多信息,请参阅 podman-build.1.md。

--cert-dir=path

使用 path 处的证书 (*.crt, *.cert, *.key) 连接到注册表。(默认值:/etc/containers/certs.d)有关详细信息,请参阅 containers-certs.d(5)。(此选项不适用于远程 Podman 客户端,包括 Mac 和 Windows(不包括 WSL2)机器)

--configmap=路径

使用路径处的 Kubernetes 配置映射 YAML,为 Pod 容器内的环境变量值提供来源。(此选项不适用于远程 Podman 客户端)

注意:可以使用 --configmap 选项多次,或者使用逗号分隔的路径列表来传递多个 Kubernetes 配置映射 YAML。YAML 文件可以是多文档 YAML 格式。但是,它必须只包含配置映射。

--context-dir=路径

使用 path 作为每个镜像的构建上下文目录。需要 --build 选项为 true。(此选项不适用于远程 Podman 客户端)

--creds=[username[:password]]

用于向镜像仓库进行身份验证的 [username[:password]](如果需要)。如果未提供一个或两个值,则会出现命令行提示,可以输入该值。密码输入时无回显。

请注意,指定的凭据仅用于对目标注册表进行身份验证。它们不用于镜像或注册表被重写时(请参阅 containers-registries.conf(5));要对这些进行身份验证,请考虑使用 containers-auth.json(5) 文件。

--force

作为 --down 的一部分,拆除链接到 PersistentVolumeClaims 的卷

--help, -h

打印用法说明

--ip=IP 地址

为 Pod 分配一个静态 IP 地址。当 kube play 创建多个 Pod 时,此选项可以指定多次。注意:当加入多个网络时,使用 --network name:ip=<ip> 语法。

--log-driver=driver

为所有创建的容器设置日志驱动。

--log-opt=name=value

日志驱动特定选项。

设置自定义日志配置。支持以下 names

path:指定日志文件的路径(例如 --log-opt path=/var/log/container/mycontainer.json);

max-size:指定日志文件的最大大小(例如 --log-opt max-size=10mb);

tag:为容器指定自定义日志标签(例如 --log-opt tag=”{{.ImageName}}”。它支持与 podman inspect --format 相同的键。此选项目前仅受 journald 日志驱动支持。

--mac-address=MAC 地址

为 pod 分配静态 mac 地址。当 kube play 创建多个 pod 时,此选项可以指定多次。注意:当加入多个网络时,使用 --network name:mac=<mac> 语法。

--network=mode, --net

设置容器的网络模式。

有效的 mode 值为:

  • bridge[:OPTIONS,…]:在默认网桥上创建一个网络堆栈。这是 rootful 容器的默认设置。可以指定以下附加选项

    • alias=名称:为容器添加网络范围的别名。

    • ip=IPv4:为该容器指定静态 IPv4 地址。

    • ip6=IPv6:为该容器指定静态 IPv6 地址。

    • mac=MAC:为该容器指定静态 MAC 地址。

    • interface_name=名称:为容器内部创建的网络接口指定名称。

    • host_interface_name=名称:为容器外部创建的网络接口指定名称。

    任何其他选项将直接传递给 netavark,不进行验证。这对于将参数传递给 netavark 插件可能很有用。

    例如,要设置静态 ipv4 地址和静态 mac 地址,请使用 --network bridge:ip=10.88.0.10,mac=44:33:22:11:00:99

  • <网络名称或 ID>[:选项,...]:连接到用户定义的网络;这是由 podman network create 创建的网络的名称或 ID。可以指定上述桥接模式下描述的相同选项。多次使用 --network 选项以指定附加网络。
    为了向后兼容,也可以在第一个 --network 参数上指定以逗号分隔的网络,但这会阻止您使用上面 bridge 部分描述的选项。

  • none:为容器创建一个网络命名空间,但不为其配置网络接口,因此容器没有网络连接。

  • container:id:重用另一个容器的网络堆栈。

  • host:为容器使用主机的网络命名空间,而不是创建隔离的命名空间。警告:这使得容器能够完全访问抽象 Unix 域套接字以及绑定到 localhost 的 TCP/UDP 套接字。由于这些机制通常用于防止访问敏感系统服务,将它们与外部实体隔离,因此使用此选项可能被视为安全漏洞。

  • ns:path:要加入的网络命名空间的路径。

  • private:为容器创建新的命名空间。这对于 rootful 容器使用 bridge 模式,对于 rootless 容器使用 slirp4netns

  • slirp4netns[:选项,...]:使用 slirp4netns(1) 创建用户网络堆栈。可以指定这些附加选项,它们也可以在 containers.conf 中通过 network_cmd_options 设置。

    • allow_host_loopback=true|false:允许 slirp4netns 访问主机回环 IP(默认为 10.0.2.2 或当更改 slirp4netns cidr 子网时的第二个 IP,见下面的 cidr 选项)。默认为 false。

    • mtu=MTU:指定用于此网络的 MTU。(默认值为 65520)。

    • cidr=CIDR:指定用于此网络的 IP 范围。(默认值为 10.0.2.0/24)。

    • enable_ipv6=true|false:启用 IPv6。默认为 true。(outbound_addr6 需要)。

    • outbound_addr=INTERFACE:指定 slirp 绑定的出站接口(仅限 ipv4 流量)。

    • outbound_addr=IPv4:指定 slirp 绑定的出站 ipv4 地址。

    • outbound_addr6=INTERFACE:指定 slirp 绑定的出站接口(仅限 ipv6 流量)。

    • outbound_addr6=IPv6:指定 slirp 绑定的出站 ipv6 地址。

    • port_handler=rootlesskit:使用 rootlesskit 进行端口转发。默认值。
      注意:Rootlesskit 将传入数据包的源 IP 地址更改为容器网络命名空间中的 IP 地址,通常是 10.0.2.100。如果应用程序需要真实的源 IP 地址,例如 Web 服务器日志,请使用 slirp4netns 端口处理程序。rootlesskit 端口处理程序也用于连接到用户定义网络的无根容器。

    • port_handler=slirp4netns:使用 slirp4netns 端口转发,它比 rootlesskit 慢,但保留了正确的源 IP 地址。此端口处理程序不能用于用户定义网络。

  • pasta[:OPTIONS,…]:使用 pasta(1) 创建一个用户模式的网络栈。
    这是无根容器的默认设置,并且仅在无根模式下受支持。
    默认情况下,IPv4 和 IPv6 地址以及路由,以及 pod 接口名称,都从主机复制。端口转发保留原始源 IP 地址。pasta(1) 中描述的选项可以作为逗号分隔的参数指定。
    就 pasta(1) 选项而言,默认情况下会给出 --config-net,以便在容器启动时配置网络,并且默认情况下还会假定 --no-map-gw,以避免容器使用网关地址直接访问主机。后者可以通过在 pasta 特定选项中传递 --map-gw 来覆盖(尽管它不是实际的 pasta(1) 选项)。
    为了更好地与 DNS 处理集成,传递了 --dns-forward 169.254.1.1,并且该地址作为第一个解析器添加到 resolv.conf(5) 中。如果应使用不同的 IP 地址,可以显式传递 --dns-forward。为了使 host.containers.internal /etc/hosts 条目工作并允许连接到主机,传递了 --map-guest-addr 169.254.1.2。同样,可以显式设置它以选择不同的 IP 地址。
    此外,如果未配置从主机到容器的 TCP 或 UDP 端口转发(通过 Podman 的 --publish 或直接传递 pasta -t/-u 选项),则分别传递 -t none-u none,以禁用基于绑定端口的自动端口转发。类似地,给出 -T none-U none 以禁用从容器到主机的相同功能。
    所有选项也可以在 containers.conf(5) 中设置;请参阅该文件中网络部分下的 pasta_options 键。
    一些示例:

    • pasta:--map-gw:允许容器使用网关地址直接访问主机。

    • pasta:--mtu,1500:为容器中的 tap 接口指定一个 1500 字节的 MTU。

    • pasta:--ipv4-only,-a,10.0.2.0,-n,24,-g,10.0.2.2,--dns-forward,10.0.2.3,-m,1500,--no-ndp,--no-dhcpv6,--no-dhcp,相当于默认的 slirp4netns(1) 选项:禁用 IPv6,将 10.0.2.0/24 分配给容器中的 tap0 接口,网关为 10.0.2.3,启用 DNS 转发器,可在 10.0.2.3 访问,将 MTU 设置为 1500 字节,禁用 NDP、DHCPv6 和 DHCP 支持。

    • pasta:-I,tap0,--ipv4-only,-a,10.0.2.0,-n,24,-g,10.0.2.2,--dns-forward,10.0.2.3,--no-ndp,--no-dhcpv6,--no-dhcp,等同于带有 Podman 覆盖的默认 slirp4netns(1) 选项:与上面相同,但将 MTU 保留为 65520 字节

    • pasta:-t,auto,-u,auto,-T,auto,-U,auto:启用基于从主机和容器两侧观察到的绑定端口的自动端口转发

    • pasta:-T,5201:启用从容器到主机的 TCP 端口 5201 的转发,使用回环接口而不是 tap 接口以提高性能

当未指定网络选项且 YAML 文件中未配置 host 网络模式时,会创建一个新的网络堆栈,并将 Pod 附加到该堆栈,从而实现 Pod 到 Pod 的通信。

--no-hostname

不在容器中创建 /etc/hostname 文件。

默认情况下,Podman 管理 /etc/hostname 文件,添加容器自己的主机名。当设置 --no-hostname 选项时,如果镜像的 /etc/hostname 文件存在,它将保持不变。

--no-hosts

不修改容器中的 /etc/hosts 文件。

Podman 默认控制 's /etc/hosts 文件,并为容器的名称(请参阅 --name 选项)和主机名(请参阅 --hostname 选项)、内部 host.containers.internalhost.docker.internal 主机以及使用 --add-host 选项添加的任何主机名添加条目。有关详细信息,请参阅 --add-host 选项。传递 --no-hosts 会禁用此功能,以便镜像的 /etc/hosts 文件保持不变。通过在 containers.conf 中设置 no_hosts=true 也可以全局实现相同的效果。

此选项与 Kubernetes YAML 中添加的主机冲突。

--publish=[[ip:][hostPort]:]containerPort[/protocol]

定义或覆盖 YAML 文件中的端口定义。

YAML 文件和命令行中的端口列表会被合并。匹配通过使用 containerPort 字段进行。如果 containerPort 在 YAML 文件和选项中都存在,则后者优先。

--publish-all

将此选项设置为 true 将所有端口暴露给主机,即使它们仅通过 K8 YAML 中的 containerPort 指定。就哪个端口将被暴露而言,--publish 具有比 hostPort 更高的优先级,而 hostPort 具有比 containerPort 更高的优先级。

如果设置为 false(这是默认值),则只有通过 hostPort--publish 定义的端口才会发布到主机。

--quiet, -q

拉取镜像时抑制输出信息

--replace

销毁先前运行 kube play 创建的 pod,并重新创建 pod。此选项用于根据 Kubernetes YAML 保持现有 pod 的最新状态。

--seccomp-profile-root=路径

seccomp 配置文件的目录路径(默认值:“/var/lib/kubelet/seccomp”)。(此选项不适用于远程 Podman 客户端,包括 Mac 和 Windows(不包括 WSL2)机器)

--start

创建后启动 Pod,设置为 false 则只创建它。

--tls-verify

连接注册表时要求 HTTPS 并验证证书(默认值:true)。如果明确设置为 true,则使用 TLS 验证。如果设置为 false,则不使用 TLS 验证。如果未指定,则使用 TLS 验证,除非目标注册表在 containers-registries.conf(5) 中列为不安全注册表

--userns=mode

设置容器的用户命名空间模式。

如果未设置--userns,则默认值按以下方式确定。

  • 如果设置了--pod,则--userns将被忽略,并使用pod的用户命名空间。

  • 如果环境变量PODMAN_USERNS已设置,则使用其值。

  • 如果containers.conf中指定了userns,则使用此值。

  • 否则,假定为--userns=host

--userns=""(即空字符串)是--userns=host的别名。

此选项与--gidmap--uidmap---subuidname****和---subgidname****不兼容。

无根用户 --userns=Key 映射

主机用户

容器用户

auto

$UID

nil(主机用户UID未映射到容器中。)

主机

$UID

0 (默认用户帐户映射到容器中的 root 用户。)

keep-id

$UID

$UID (将用户帐户映射到容器内的相同 UID。)

keep-id:uid=200,gid=210

$UID

200:210 (将用户帐户映射到容器内指定的 UID, GID 值。)

nomap

$UID

nil(主机用户UID未映射到容器中。)

有效的 mode 值为:

auto[:OPTIONS,…]:自动创建唯一的命名空间。

  • rootful mode--userns=auto 标志要求在 /etc/subuid 和 /etc/subgid 文件中指定用户名为 containers,并使用 Podman 容器允许分配的未使用的从属用户 ID 范围。示例:containers:2147483647:2147483648

  • rootless mode:将使用 /etc/subuid 和 /etc/subgid 文件中的用户范围。请注意,不使用 --userns=auto 运行单个容器将使用所有 UID 范围,并且不允许进一步细分。请参阅 subuid(5)。

Podman 从 containers 从属用户 ID 中分配唯一的 UID 和 GID 范围。范围的大小基于镜像中所需的 UID 数量。UID 和 GID 的数量可以通过 size 选项覆盖。

选项 --userns=keep-id 使用用户的所有 subuids 和 subgids。选项 --userns=nomap 使用用户的所有 subuids 和 subgids,除了用户自己的 ID。当启动新容器时,只要存在使用 --userns=nomap--userns=keep-id 启动的且未限制用户命名空间大小的任何容器,使用 --userns=auto 将不起作用。

有效的auto选项

  • gidmapping=CONTAINER_GID:HOST_GID:SIZE:强制用户命名空间中存在GID映射。

  • size=SIZE:为自动用户命名空间指定显式大小。例如 --userns=auto:size=8192。如果未指定 size,则 auto 会估算用户命名空间的大小。

  • uidmapping=CONTAINER_UID:HOST_UID:SIZE:强制用户命名空间中存在UID映射。

gidmappinguidmapping 中的主机 UID 和 GID 可选择性地以 @ 符号作为前缀。在这种情况下,podman 将查找与主机 ID 对应的中间 ID,并将其映射到容器 ID。有关详细信息,请参阅 --uidmap

container:id:加入指定容器的用户命名空间。

host“”(空字符串):在调用者的用户命名空间中运行。在容器中运行的进程与调用用户启动的任何其他进程在主机上具有相同的权限。

keep-id:创建一个用户命名空间,其中当前用户的UID:GID映射到容器中的相同值。对于由root创建的容器,当前映射将创建到一个新的用户命名空间中。

有效的keep-id选项

  • uid=UID:覆盖容器内部的UID,用于映射当前用户。

  • gid=GID:覆盖容器内部的GID,用于映射当前用户。

  • size=SIZE:覆盖配置用户命名空间的大小。这对于避免耗尽所有可用ID很有用。在以root身份运行时不支持。

nomap:创建一个用户命名空间,其中当前无根用户的UID:GID未映射到容器中。root用户创建的容器不允许此选项。

ns:namespace:在给定现有用户命名空间中运行容器。

--wait, -w

在前台运行 Pod 和容器。默认值为 false。

您可以随时在另一个 shell 中运行 podman pod ps 以查看正在运行的 Pod 和容器列表。

在 tty 模式下连接时,您可以按 Ctrl-C 或接收任何其他中断信号来终止 Pod 和容器。

所有使用 podman kube play 创建的 Pod、容器和卷将在退出时被删除。

示例

重新创建指定主机 YAML 文件中描述的 Pod 和容器。

$ podman kube play demo.yml
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

重新创建发送到标准输入的 YAML 文件中指定的 Pod 和容器。

$ cat demo.yml | podman kube play -
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

销毁指定 YAML 文件中描述的 Pod 和容器。

$  podman kube play --down demo.yml
Pods stopped:
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6
Pods removed:
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

提供多个配置映射文件作为指定 Pod 和容器中环境变量的来源。

$ podman kube play demo.yml --configmap configmap-foo.yml,configmap-bar.yml
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

$ podman kube play demo.yml --configmap configmap-foo.yml --configmap configmap-bar.yml
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

创建一个连接到两个网络的 Pod,每个网络都有一个静态 IP。

$ podman kube play demo.yml --network net1:ip=10.89.1.5 --network net2:ip=10.89.10.10
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

请注意,必须首先使用 podman-network-create(1) 创建网络。

从指向 YAML 文件的 URL 创建和销毁。

$ podman kube play https://podman.org.cn/demo.yml
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

$ podman kube play --down https://podman.org.cn/demo.yml
Pods stopped:
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6
Pods removed:
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

如果 URL 指向的 YAML 文件已被更改或修改,则 podman kube play --down 不适用于 URL。

Podman Kube Play 支持

本文档概述了 podman kube play 命令当前支持的 kube yaml 字段。

注意:N/A 表示该选项在单节点 Podman 环境中不支持。

Pod 字段

字段

支持

容器

init容器

imagePullSecrets

enableServiceLinks

os.name

nodeSelector

不适用

nodeName

不适用

affinity.nodeAffinity

不适用

affinity.podAffinity

不适用

affinity.podAntiAffinity

不适用

tolerations.key

不适用

tolerations.operator

不适用

tolerations.effect

不适用

tolerations.tolerationSeconds

不适用

schedulerName

不适用

runtimeClassName

priorityClassName

priority

topologySpreadConstraints.maxSkew

不适用

topologySpreadConstraints.topologyKey

不适用

topologySpreadConstraints.whenUnsatisfiable

不适用

topologySpreadConstraints.labelSelector

不适用

topologySpreadConstraints.minDomains

不适用

restartPolicy

terminationGracePeriodSeconds

activeDeadlineSeconds

readinessGates.conditionType

hostname

setHostnameAsFQDN

subdomain

hostAliases.hostnames

hostAliases.ip

dnsConfig.nameservers

dnsConfig.options.name

dnsConfig.options.value

dnsConfig.searches

dnsPolicy

hostNetwork

hostPID

hostIPC

shareProcessNamespace

serviceAccountName

automountServiceAccountToken

securityContext.runAsUser

securityContext.runAsNonRoot

securityContext.runAsGroup

securityContext.supplementalGroups

securityContext.fsGroup

securityContext.fsGroupChangePolicy

securityContext.seccompProfile.type

securityContext.seccompProfile.localhostProfile

securityContext.seLinuxOptions.level

securityContext.seLinuxOptions.role

securityContext.seLinuxOptions.type

securityContext.seLinuxOptions.user

securityContext.sysctls.name

securityContext.sysctls.value

securityContext.windowsOptions.gmsaCredentialSpec

securityContext.windowsOptions.hostProcess

securityContext.windowsOptions.runAsUserName

容器字段

字段

支持

name

image

imagePullPolicy

command

args

workingDir

ports.containerPort

ports.hostIP

ports.hostPort

ports.name

ports.protocol

env.name

env.value

env.valueFrom.configMapKeyRef.key

env.valueFrom.configMapKeyRef.name

env.valueFrom.configMapKeyRef.optional

env.valueFrom.fieldRef

env.valueFrom.resourceFieldRef

env.valueFrom.secretKeyRef.key

env.valueFrom.secretKeyRef.name

env.valueFrom.secretKeyRef.optional

envFrom.configMapRef.name

envFrom.configMapRef.optional

envFrom.prefix

envFrom.secretRef.name

envFrom.secretRef.optional

volumeMounts.mountPath

volumeMounts.name

volumeMounts.mountPropagation

volumeMounts.readOnly

volumeMounts.subPath

volumeMounts.subPathExpr

volumeDevices.devicePath

volumeDevices.name

resources.limits

resources.requests

lifecycle.postStart

lifecycle.preStop

lifecycle.stopSignal

terminationMessagePath

terminationMessagePolicy

livenessProbe

readinessProbe

startupProbe

securityContext.runAsUser

securityContext.runAsNonRoot

securityContext.runAsGroup

securityContext.readOnlyRootFilesystem

securityContext.procMount

securityContext.privileged

securityContext.allowPrivilegeEscalation

securityContext.capabilities.add

securityContext.capabilities.drop

securityContext.seccompProfile.type

securityContext.seccompProfile.localhostProfile

securityContext.seLinuxOptions.level

securityContext.seLinuxOptions.role

securityContext.seLinuxOptions.type

securityContext.seLinuxOptions.user

securityContext.windowsOptions.gmsaCredentialSpec

securityContext.windowsOptions.hostProcess

securityContext.windowsOptions.runAsUserName

stdin

stdinOnce

tty

PersistentVolumeClaim 字段

字段

支持

volumeName

storageClassName

volumeMode

accessModes

selector

resources.limits

resources.requests

ConfigMap 字段

字段

支持

binaryData

data

immutable

部署字段

字段

支持

replicas

✅(实际副本数量被忽略并设置为 1)

selector

template

minReadySeconds

strategy.type

strategy.rollingUpdate.maxSurge

strategy.rollingUpdate.maxUnavailable

revisionHistoryLimit

progressDeadlineSeconds

paused

DaemonSet 字段

字段

支持

selector

template

minReadySeconds

strategy.type

strategy.rollingUpdate.maxSurge

strategy.rollingUpdate.maxUnavailable

revisionHistoryLimit

Job 字段

字段

支持

activeDeadlineSeconds

selector

否(由 k8s 自动设置)

template

backoffLimit

completionMode

completions

否(使用 kube generate 设置为 1)

manualSelector

parallelism

否(使用 kube generate 设置为 1)

podFailurePolicy

suspend

ttlSecondsAfterFinished

另请参阅

podman(1), podman-kube(1), podman-kube-down(1), podman-network-create(1), podman-kube-generate(1), podman-build(1), containers-certs.d(5)