名称

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

简介

podman kube play [options] file.yml|-|https://website.io/file.yml

描述

podman kube play 读取结构化的 Kubernetes YAML 文件。它会重新创建 YAML 中描述的容器、Pod 或卷。随后启动 Pod 内的容器,并输出新 Pod 的 ID 或新卷的名称。如果 YAML 文件指定为“-”,则 podman kube play 从标准输入 (stdin) 读取 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 Pods Deployments

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

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

  • 当使用 persistentVolumeClaim 时,claimName 的值即为 Podman 命名卷的名称。

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

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

  • 当使用 image 卷时,Podman 创建一个带有空子路径的只读镜像卷(挂载整个镜像)。该镜像必须已存在于本地。仅在 rootful 模式下支持。

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

注意:在播放带有初始化容器(init containers)的 kube YAML 时,初始化容器的创建默认类型值为 once。要更改默认类型,请使用 io.podman.annotations.init.container.type 注解将类型设置为 always

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

注意:要设置 Pod 的 userns,请在 pod/deployment 定义中使用 io.podman.annotations.userns 注解。例如,io.podman.annotations.userns=keep-id 注解告诉 Podman 创建一个用户命名空间,其中当前 rootless 用户的 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,在这种情况下,即使带有 :latest 标签,Podman 也会使用本地存储中的镜像。

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

注意:命令 podman kube down 可用于停止并移除由 podman kube play 创建的 Pod 或容器。

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

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

注意:使用 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 PersistentVolumeClaims

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 将注解值中指定的 tar 包(.tar, .tar.gz, .tgz, .bzip, .tar.xz, .txz, .tar.zst)内容导入到已创建的 Podman 卷中。

如果目录布局和 Containerfiles 正确,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 中环境变量或卷的来源。ConfigMap 在 Podman 中不是独立对象;相反,当容器使用 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 命名密钥。Kubernetes Secret 作为整体保存,可用作 Pod 或 Deployment 中环境变量或卷的来源。

例如,以下 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

向容器或 Pod 添加注解。此选项可以多次设置。

注意:对于 podman kube play--annotation 标志将 Podman 特定的注解添加到由 Podman 创建的容器和 Pod 中,而不是添加到 Kubernetes YAML 本身中。这些注解可用于配置 Podman 特定功能,如用户命名空间 (io.podman.annotations.userns)、volumes-from (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=路径 来完成。

--build

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

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

--cert-dir=path

使用 路径 下的证书(*.crt, *.cert, *.key)连接到仓库。(默认:/etc/containers/certs.d)详情请参阅 containers-certs.d(5)。(此选项在远程 Podman 客户端,包括 Mac 和 Windows(不含 WSL2)机器上不可用)

--configmap=path

使用 Kubernetes ConfigMap YAML 的 path,为 Pod 的容器提供环境变量值。(此选项不适用于远程 Podman 客户端)

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

--context-dir=path

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

--creds=[username[:password]]

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

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

--force

作为 --down 的一部分,销毁链接到 PersistentVolumeClaim 的卷。

--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 日志驱动程序支持。

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

--mac-address=MAC 地址

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

--network=mode, --net

设置 Pod 的网络模式。

有效的 mode 值为:

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

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

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

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

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

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

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

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

    对于无根桥接网络,端口转发默认使用 rootlessport。在 containers.conf(5)[network] 部分中设置 rootless_port_forwarder="pasta" 会切换到 pasta 的内核级转发(通过 pesto),这会保留容器内原始的客户端源 IP 地址。此选项是实验性的,其行为可能会发生变化。

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

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

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

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

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

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

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

  • 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) 中设置;请参阅该文件中 network 部分下的 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: 禁用 IPv6,将 10.0.2.0/24 分配给容器中的 tap0 接口,网关为 10.0.2.3,启用可在 10.0.2.3 访问的 DNS 转发器,将 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: 与上述相同,但保留 MTU 为 65520 字节

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

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

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

--no-hostname

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

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

--no-hosts

不要修改 Pod 中的 /etc/hosts 文件。

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

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

--no-pod-prefix

不要在容器名称前添加 Pod 名称前缀。

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

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

YAML 文件和命令行中的端口列表会合并。匹配通过 containerPort 字段完成。如果 containerPort 同时存在于 YAML 文件和选项中,则后者优先。

--publish-all

将此选项设置为 true 会将所有端口暴露给主机,即使它们仅通过 K8 YAML 中的 containerPort 指定。在端口暴露优先级方面,--publish > hostPort > containerPort

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

--quiet, -q

拉取镜像时抑制输出信息

--replace

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

--seccomp-profile-root=path

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 模式--userns=auto 标志要求在 /etc/subuid 和 /etc/subgid 文件中指定用户名称 containers,并附带 Podman 容器允许分配的未使用的下属用户 ID 范围。示例:containers:2147483647:2147483648

  • rootless 模式:将使用 /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。如果未指定 sizeauto 会估计用户命名空间的大小。

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

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

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

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

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

此外,容器内的初始进程将以当前用户的 UID 运行。此行为会覆盖镜像的 USER 指令,除非您显式设置了 --user

有效的keep-id选项

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

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

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

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

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

--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

提供多个 ConfigMap 文件作为指定 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

创建一个连接到两个网络并为每个网络分配静态 IP 的 Pod。

$ 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

podman kube play --down 如果 URL 指向的 YAML 文件已被更改或篡改,则无法正常工作。

Podman Kube Play 支持

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

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

Pod 字段

字段

支持情况

containers

initContainers

imagePullSecrets

no

enableServiceLinks

no

os.name

no

volumes

nodeSelector

N/A

nodeName

N/A

affinity.nodeAffinity

N/A

affinity.podAffinity

N/A

affinity.podAntiAffinity

N/A

tolerations.key

N/A

tolerations.operator

N/A

tolerations.effect

N/A

tolerations.tolerationSeconds

N/A

schedulerName

N/A

runtimeClassName

no

priorityClassName

no

priority

no

topologySpreadConstraints.maxSkew

N/A

topologySpreadConstraints.topologyKey

N/A

topologySpreadConstraints.whenUnsatisfiable

N/A

topologySpreadConstraints.labelSelector

N/A

topologySpreadConstraints.minDomains

N/A

restartPolicy

terminationGracePeriodSeconds

activeDeadlineSeconds

no

readinessGates.conditionType

no

hostname

setHostnameAsFQDN

no

subdomain

no

hostAliases.hostnames

hostAliases.ip

dnsConfig.nameservers

dnsConfig.options.name

dnsConfig.options.value

dnsConfig.searches

dnsPolicy

no

hostNetwork

hostPID

hostIPC

shareProcessNamespace

serviceAccountName

no

automountServiceAccountToken

no

securityContext.runAsUser

securityContext.runAsNonRoot

no

securityContext.runAsGroup

securityContext.supplementalGroups

securityContext.fsGroup

no

securityContext.fsGroupChangePolicy

no

securityContext.seccompProfile.type

no

securityContext.seccompProfile.localhostProfile

no

securityContext.seLinuxOptions.level

securityContext.seLinuxOptions.role

securityContext.seLinuxOptions.type

securityContext.seLinuxOptions.user

securityContext.sysctls.name

securityContext.sysctls.value

securityContext.windowsOptions.gmsaCredentialSpec

no

securityContext.windowsOptions.hostProcess

no

securityContext.windowsOptions.runAsUserName

no

Container 字段

字段

支持情况

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

no

envFrom.secretRef.name

envFrom.secretRef.optional

volumeMounts.mountPath

volumeMounts.name

volumeMounts.mountPropagation

no

volumeMounts.readOnly

volumeMounts.subPath

volumeMounts.subPathExpr

no

volumeDevices.devicePath

no

volumeDevices.name

no

resources.limits

resources.requests

lifecycle.postStart

no

lifecycle.preStop

no

lifecycle.stopSignal

terminationMessagePath

no

terminationMessagePolicy

no

livenessProbe

readinessProbe

no

startupProbe

no

securityContext.runAsUser

securityContext.runAsNonRoot

no

securityContext.runAsGroup

securityContext.readOnlyRootFilesystem

securityContext.procMount

securityContext.privileged

securityContext.allowPrivilegeEscalation

securityContext.capabilities.add

securityContext.capabilities.drop

securityContext.seccompProfile.type

no

securityContext.seccompProfile.localhostProfile

no

securityContext.seLinuxOptions.level

securityContext.seLinuxOptions.role

securityContext.seLinuxOptions.type

securityContext.seLinuxOptions.user

securityContext.windowsOptions.gmsaCredentialSpec

no

securityContext.windowsOptions.hostProcess

no

securityContext.windowsOptions.runAsUserName

no

stdin

no

stdinOnce

no

tty

no

PersistentVolumeClaim 字段

字段

支持情况

volumeName

no

storageClassName

volumeMode

no

accessModes

selector

no

resources.limits

no

resources.requests

ConfigMap 字段

字段

支持情况

binaryData

data

immutable

no

Deployment 字段

字段

支持情况

replicas

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

selector

template

minReadySeconds

no

strategy.type

no

strategy.rollingUpdate.maxSurge

no

strategy.rollingUpdate.maxUnavailable

no

revisionHistoryLimit

no

progressDeadlineSeconds

no

paused

no

DaemonSet 字段

字段

支持情况

selector

template

minReadySeconds

no

strategy.type

no

strategy.rollingUpdate.maxSurge

no

strategy.rollingUpdate.maxUnavailable

no

revisionHistoryLimit

no

Job 字段

字段

支持情况

activeDeadlineSeconds

no

selector

no (由 k8s 自动设置)

template

backoffLimit

no

completionMode

no

completions

no (使用 kube generate 时设置为 1)

manualSelector

no

parallelism

no (使用 kube generate 时设置为 1)

podFailurePolicy

no

suspend

no

ttlSecondsAfterFinished

no

另请参阅

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