跳到主要内容

基于 Kubernetes YAML 创建容器、pod 和卷

概要

podman kube play [选项] file.yml|-|https://demo.io/file.yml

描述

podman kube play 读取 Kubernetes YAML 结构化文件。它会重新创建 YAML 中描述的容器、pod 或卷。在 pod 内的容器启动后,将输出新 Pod 的 ID 或新卷的名称。如果 YAML 文件指定为 "-",则 podman kube play 将从标准输入读取 YAML 文件。

输入也可以是指向 YAML 文件的 URL,例如 https://podman.io/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

Kubernetes Pods 或 Deployments

kube play 仅支持三种卷类型,即 hostPathemptyDirpersistentVolumeClaim 卷类型。

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

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

  • 当使用 emptyDir 卷时,Podman 会创建一个匿名卷,该卷附加到在 pod 中运行的容器,并在 pod 被删除后自动删除。

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

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

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

注意:要为 pod 设置用户命名空间,请在 pod/deployment 定义中使用 io.podman.annotations.userns 注解。这可以通过 --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 命令停止和删除基于相同 Kubernetes YAML 创建的 pod 或容器,该 YAML 由 podman kube play 使用。

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

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)的内容导入到创建的 Podman 卷中。

Kube play 能够根据正确的目录布局和 Containerfiles 实时构建镜像。然而,这个选项对于远程客户端(包括 Mac 和 Windows(不包括 WSL2)机器)尚不可用。请考虑以下 YAML 文件中的摘录:

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

在当前工作目录中存在一个名为 foobar 的目录,其中包含名为 ContainerfileDockerfile 的文件时,Podman kube play 会构建该镜像并将其命名为 foobar。以下是该示例的目录结构示例: 这个 YAML 片段定义了一个 Kubernetes Pod,其中包含一个名为 container 的容器,该容器将使用 foobar 镜像。如果您想要 Podman 使用 kube play 功能来启动这个 Pod,并实时构建 foobar 镜像(如果它不存在于本地存储中),您需要确保本地目录结构符合 Podman 的期望,并包含相应的 Containerfile(或 Dockerfile)来描述如何构建该镜像。然而,请注意,实时构建功能在远程客户端上可能不可用,这取决于您的具体设置和操作系统。

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

构建过程中,foobar 目录被视为构建上下文目录。如果本地存储中已经存在一个名为 foobar 的镜像,则不会重新构建该镜像,除非使用了 --build 标志。使用 --build=false 可以完全禁用构建过程。

Kubernetes ConfigMap

Kubernetes ConfigMap 可以作为 Pods 或 Deployments 中环境变量或卷的来源。在 Podman 中,ConfigMap 并不是一个独立的对象;相反,当容器使用 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 会整体保存,并可作为 Pods 或 Deployments 中环境变量或卷的来源。

例如,下面的 YAML 文档定义了一个 Secret 并在 Pod 中使用它:

kind: Secret
apiVersion: v1
metadata:
name: foo
data:
foo: YmFy # bar 的 base64 编码
---
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。请注意,Secret 数据通常以 base64 编码形式存储,在上述示例中,YmFybar 的 base64 编码。

选项说明

选项说明
--annotation为 Pod 或其资源添加注解。注解是键值对,用于存储有关资源的额外信息,但不直接影响资源的行为。
--container指定与选项相关的容器。这可能用于选择或操作特定的容器实例。
--authfile指定认证文件的路径,用于认证到容器镜像仓库等服务的访问。
--build即使镜像在本地存储中已经存在,也构建镜像。使用 --build=false 完全禁用构建。此选项不适用于远程 Podman 客户端。
--cert-dir指定证书目录的路径,用于存放与 TLS 相关的证书和密钥文件。
--configmap使用位于指定路径的 Kubernetes ConfigMap YAML 文件,为容器内的环境变量值提供来源。此选项不适用于远程 Podman 客户端。
--context-dir使用指定的路径作为每个镜像的构建上下文目录。这通常是包含 Dockerfile 和其他构建文件的目录。需要 --build 选项为 true。此选项不适用于远程 Podman 客户端。
--creds指定用于访问容器镜像仓库的凭证信息,通常包括用户名和密码。
--force强制执行某些操作,如销毁与 PersistentVolumeClaims 关联的卷,即使这些操作可能导致数据丢失或其他不良后果。
--help, -h显示帮助信息,包括可用选项和它们的基本描述。
--ip为 Pod 分配一个静态 IP 地址。当创建多个 Pod 时,可以多次指定此选项,以确保每个 Pod 都有一个唯一的 IP 地址。
--log-driver设置用于容器日志的驱动程序。不同的驱动程序可能具有不同的日志收集、存储和转发机制。
--log-opt为日志驱动程序提供额外的配置选项。这些选项取决于所选的日志驱动程序,并允许用户进一步定制日志的行为。
--mac-address为 Pod 分配一个静态 MAC 地址。当 kube play 创建多个 Pod 时,可以多次指定此选项。注意:当加入多个网络时,使用 --network name:mac=<mac> 语法。
--network如果没有指定网络选项,并且在 YAML 文件中没有配置 host 网络模式,则会创建一个新的网络堆栈,并将 Pod 附加到它上面,从而实现 Pod 之间的通信。
--no-hosts此选项与 Kubernetes YAML 中添加的主机冲突。
--publish定义或覆盖 YAML 文件中的端口定义。YAML 文件和命令行中的端口列表被合并。匹配是通过使用 containerPort 字段进行的。如果 containerPort 既存在于 YAML 文件中又存在于选项中,则后者优先。
--publish-all设置此选项为 true 将把所有端口暴露给主机,即使仅在 K8 YAML 中通过 containerPort 指定。在哪些端口将被暴露方面,--publish 的优先级高于 hostPorthostPort 的优先级又高于 containerPort。如果设置为 false(这是默认值),则只有通过 hostPort--publish 定义的端口才会在主机上发布。
--quiet, -q在拉取镜像时抑制输出信息。
--replace销毁由之前运行的 kube play 创建的 Pod 并重新创建 Pod。此选项用于根据 Kubernetes YAML 保持现有 Pod 的最新状态。
--seccomp-profile-rootseccomp 配置文件的目录路径(默认值:"/var/lib/kubelet/seccomp")。此选项不适用于远程 Podman 客户端,包括 Mac 和 Windows(不包括 WSL2)机器。
--start在创建 Pod 后启动它,设置为 false 则仅创建它。
--tls-verify启用 TLS 验证(通常用于与远程服务器通信时的安全连接)。
--userns.container指定用户命名空间模式来运行容器。这通常用于控制容器内的用户权限和隔离。
--replace销毁由之前运行的 kube play 创建的 Pod 并重新创建 Pod。此选项用于根据 Kubernetes YAML 保持现有 Pod 的最新状态。
--seccomp-profile-rootseccomp 配置文件的目录路径(默认值:"/var/lib/kubelet/seccomp")。此选项不适用于远程 Podman 客户端,包括 Mac 和 Windows(不包括 WSL2)机器。
--start在创建 Pod 后启动它,设置为 false 则仅创建它。
--tls-verify启用 TLS 验证(通常用于与远程服务器通信时的安全连接)。
--userns.container指定用户命名空间模式来运行容器。这通常用于控制容器内的用户权限和隔离。
--wait, -w在前台运行 Pod 和容器。默认值为 false。在另一个 shell 中,您可以随时运行 podman pod ps 来查看正在运行的 Pod 和容器的列表。当以 tty 模式附加时,您可以通过按 Ctrl-C 或接收任何其他中断信号来终止 Pod 和容器。通过 podman kube play 创建的所有 Pod、容器和卷在退出时都会被移除。

请注意,这个表格是基于您提供的选项描述生成的,并可能需要根据您所使用的 Podman 和 Kubernetes 的具体版本和上下文进行调整。为了获得最准确和最新的信息,请查阅官方文档。

示例

下面是 podman kube play 命令的一些使用示例:

根据指定的主机 YAML 文件重新创建 Pod 和容器

$ podman kube play demo.yml
52182811df2b1e73f36476003a66ec872101ea59034ac0d4d3a7b40903b955a6

根据发送到 stdin 的 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

创建一个连接到两个网络的 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 创建和销毁 Pod

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

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

如果指向的 YAML 文件被更改或修改,podman kube play --down 将不会从 URL 正常工作。

更多关于 Kubernetes 支持的信息,请查看:kubernetes_support

另请参阅

  • podman(1): Podman 主命令的文档,用于管理容器和 Pods。
  • podman-kube(1): Podman 的 Kubernetes 支持命令,用于生成 Kubernetes YAML 描述文件。
  • podman-kube-down(1): Podman 的 Kubernetes 支持命令,用于销毁由 podman kube play 创建的 Pods 和容器。
  • podman-network-create(1): Podman 的网络管理命令,用于创建新的容器网络。
  • podman-kube-generate(1): Podman 的 Kubernetes 支持命令,用于从现有的容器和 Pods 生成 Kubernetes YAML 描述文件。
  • podman-build(1): Podman 的构建命令,用于构建容器镜像。
  • containers-certs.d(5): 容器镜像证书的目录格式文档,描述了如何管理和使用容器镜像的证书。