名称¶
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,当主机路径为文件时为File。persistentVolumeClaim 的claimName 值是在 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
只能设置为OnFailure
或Never
。默认情况下,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 规范是Pod
、Deployment
、Job
和DaemonSet
。默认情况下,会生成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)编写