名称

podman-kube-generate - 基于容器、Pod 或卷生成 Kubernetes YAML

概要

podman kube generate [选项] 容器... | Pod... | 卷...

描述

podman kube generate 从 Podman 容器、Pod 或卷生成 Kubernetes YAML(v1 规范)。无论输入是容器还是 Pod,Podman 默认情况下都会将规范生成为 Pod。输入可以是容器、Pod 或卷名称或 ID 的形式,可以是一个或多个。

Podman 容器 Pod

卷根据两种不同的卷类型出现在生成的 YAML 中。绑定挂载的卷成为hostPath 卷类型,命名卷成为persistentVolumeClaim 卷类型。生成的hostPath 卷类型根据主机路径的状态分为三种子类型:当主机上不存在文件或目录时为DirectoryOrCreate,当主机路径为目录时为Directory,当主机路径为文件时为FilepersistentVolumeClaimclaimName 值是在 Podman 中注册的命名卷的名称。

通过对每种卷类型使用标准命名方案来避免卷之间潜在的名称冲突。hostPath 卷类型根据主机上的路径命名,将正斜杠替换为连字符,去掉任何前导和尾随正斜杠。文件系统根目录/的特殊情况转换为名称root。此外,该名称后缀为-host,以避免与persistentVolumeClaim 卷的名称冲突。每个persistentVolumeClaim 卷类型都使用与其关联的命名卷的名称,并在后面加上-pvc

请注意,如果使用类型为once的初始化容器,并且 Pod 已经启动,那么它不会出现在生成的 kube YAML 中,因为once类型的初始化容器在运行后会被删除。如果 Pod 只创建了,还没有启动,它会在生成的 kube YAML 中。使用类型为always的初始化容器始终在 kube YAML 中生成,因为它们永远不会被删除,即使在运行完成之后也是如此。

注意:当使用卷并在支持 SELinux 的系统上为非特权和无根的 podman 容器生成 Kubernetes YAML 时,必须完成以下选项之一

  • 在 Pod 规范中添加“privileged: true”选项

  • 在 Pod 规范中的securityContext seLinuxOptions下添加type: spc_t

  • 通过 CLI 命令chcon -t container_file_t -R <directory>重新标记卷

完成之后,在 Kubernetes 集群中创建 Pod/容器时,将拥有正确的权限来访问该卷。

请注意,生成的 Kubernetes YAML 文件可用于通过 podman-play-kube(1) 重新运行部署。

请注意,如果生成的 Pod 使用--infra-name 标志创建,则生成的 kube yaml 将设置io.podman.annotations.infra.name,其值是用户设置的 infra 容器的名称。

请注意,Deployment 和 DaemonSet 的restartPolicy只能设置为Always

请注意,Job 的restartPolicy只能设置为OnFailureNever。默认情况下,podman 在使用kube generate生成 kube yaml 时将其设置为Never

选项

--filename, -f=文件名

输出到给定的文件,而不是 STDOUT。如果文件已经存在,则kube generate会拒绝替换它并返回错误。

--podman-only

在生成的 YAML 文件中添加 podman 专用保留的注释(Kubernetes 不能使用)

--replicas, -r=副本数

在生成Deployment类型时设置replicas的值。注意:这只能与选项--type=deployment一起设置。

--service, -s

除了 Pod 之外,还生成 Kubernetes 服务对象。用于为相应的 Pod 输出生成 Service 规范。特别是,如果对象具有 portmap 绑定,则服务规范将包含一个 NodePort 声明来公开该服务。Podman 在规范中分配了一个随机端口。

--type, -t=pod | deployment | daemonset | job

在 YAML 文件中生成的 Kubernetes 类型。目前,唯一支持的 Kubernetes 规范是PodDeploymentJobDaemonSet。默认情况下,会生成Pod规范。

示例

为指定的容器创建 Kubernetes Pod YAML。

$ podman kube generate some-mariadb
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.8.2

# NOTE: If you generated this yaml from an unprivileged and rootless podman container on an SELinux
# enabled system, check the podman generate kube man page for steps to follow to ensure that your pod/container
# has the right permissions to access the volumes added.
---
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2024-01-09T02:24:55Z"
  labels:
    app: some-mariadb-pod
  name: some-mariadb-pod
spec:
  containers:
  - args:
    - mariadbd
    env:
    - name: MARIADB_ROOT_PASSWORD
      value: x
    image: docker.io/library/mariadb:10.11
    name: some-mariadb
    ports:
    - containerPort: 3306
      hostPort: 34891
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: mariadb_data-pvc
  volumes:
  - name: mariadb_data-pvc
    persistentVolumeClaim:
      claimName: mariadb_data

为指定的容器创建包含 3 个副本的 Kubernetes Deployment YAML。

$ podman kube generate --type deployment --replicas 3 dep-ct
r
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.5.0-dev
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: "2023-03-27T20:45:08Z"
  labels:
    app: dep-ctr-pod
  name: dep-ctr-pod-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dep-ctr-pod
  template:
    metadata:
      annotations:
        io.podman.annotations.ulimit: nofile=524288:524288,nproc=127332:127332
      creationTimestamp: "2023-03-27T20:45:08Z"
      labels:
        app: dep-ctr-pod
      name: dep-ctr-pod
    spec:
      containers:
      - command:
        - top
        image: docker.io/library/alpine:latest
        name: dep-ctr

为指定的容器创建 Kubernetes Pod YAML,并将主机目录/home/user/my-data绑定挂载到容器路径/volume

$ podman kube generate my-container-with-bind-mounted-data
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.1.0-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2021-03-18T16:26:08Z"
  labels:
    app: my-container-with-bind-mounted-data
  name: my-container-with-bind-mounted-data
spec:
  containers:
  - command:
    - /bin/sh
    image: docker.io/library/alpine:latest
    name: test-bind-mount
    volumeMounts:
    - mountPath: /volume
      name: home-user-my-data-host
  restartPolicy: Never
  volumes:
  - hostPath:
      path: /home/user/my-data
      type: Directory
    name: home-user-my-data-host

为指定的容器创建 Kubernetes Pod YAML,并将命名卷priceless-data挂载到容器路径/volume

$ podman kube generate my-container-using-priceless-data
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.1.0-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2021-03-18T16:26:08Z"
  labels:
    app: my-container-using-priceless-data
  name: my-container-using-priceless-data
spec:
  containers:
  - command:
    - /bin/sh
    image: docker.io/library/alpine:latest
    name: test-bind-mount
    volumeMounts:
    - mountPath: /volume
      name: priceless-data-pvc
  restartPolicy: Never
  volumes:
  - name: priceless-data-pvc
    persistentVolumeClaim:
      claimName: priceless-data

为指定的 Pod 创建 Kubernetes Pod YAML,并包含一个服务。

$ sudo podman kube generate -s demoweb
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-0.12.2-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: 2018-12-18T15:16:06Z
  labels:
    app: demoweb
  name: demoweb-libpod
spec:
  containers:
  - command:
    - python3
    - /root/code/graph.py
    image: quay.io/baude/demoweb:latest
    name: practicalarchimedes
    tty: true
    workingDir: /root/code
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2018-12-18T15:16:06Z
  labels:
    app: demoweb
  name: demoweb-libpod
spec:
  ports:
  - name: "8050"
    nodePort: 31269
    port: 8050
    targetPort: 0
  selector:
    app: demoweb
  type: NodePort
status:
  loadBalancer: {}

另请参见

podman(1), podman-container(1), podman-pod(1), podman-kube-play(1), podman-kube-down(1)

历史

2018 年 12 月,最初由 Brent Baude(bbaude at redhat dot com)编写