在日常使用 Podman 管理 Pod 的过程中,我们经常需要查看 Pod 的详细配置信息,或是将已部署的 Pod 迁移到 Kubernetes(K8s)环境中。下面将分享两个实用的 Podman 命令 —— podman pod inspect 和 podman generate kube。
当我们部署好一个 Pod 后,往往需要了解其内部的详细配置,比如 Pod 的 IP 地址、包含的容器列表、容器的启动参数、挂载的卷信息、网络模式等。这时,podman pod inspect 命令就成了我们的“透视镜”,它能将 Pod 的完整信息以 JSON 格式清晰地呈现出来。
该命令的基本语法非常简洁,只需指定要查看的 Pod 名称或 ID 即可:
podman pod inspect <pod名称/ID>
点击查看 podman pod inspect 命令手册。
其中,Pod 的名称或 ID 可以通过podman pod ls命令获取。例如,我们有一个名为web-redis-pod 的 Pod,要查看其详细信息,只需执行:
podman pod inspect web-redis-pod
输出如下:
[
{
// Pod 的唯一标识符(ID)
"Id": "0c9858859aa8e97fefa2b4839cc1c0f4c589ed40aca1840cbfd66b8f49eae31e",
// Pod 的名称
"Name": "web-redis-pod",
// Pod 的创建时间
"Created": "2025-11-25T16:26:00.105431602+08:00",
// 创建 Pod 时使用的命令
"CreateCommand": [
"podman",
"pod",
"create",
"--name",
"web-redis-pod",
"--publish",
"8080:80",
"--publish",
"6379:6379"
],
// Pod 的退出策略(continue 表示容器退出时 Pod 继续运行)
"ExitPolicy": "continue",
// Pod 当前状态(Running 表示正在运行)
"State": "Running",
// Pod 的主机名
"Hostname": "",
// 是否创建 cgroup 用于资源限制
"CreateCgroup": true,
// cgroup 的父目录
"CgroupParent": "/libpod_parent",
// 是否创建基础设施容器(infra container)
"CreateInfra": true,
// 基础设施容器的ID
"InfraContainerID": "a00c13fb2b32bc1c07e7f3e277e09b6dcd8ba5a1dda62fc8f6a7e9a3c241cb37",
// 基础设施容器的配置
"InfraConfig": {
// 端口映射配置
"PortBindings": {
// Redis 端口映射
"6379/tcp": [
{
"HostIp": "0.0.0.0", // 绑定到主机的所有IP
"HostPort": "6379" // 主机端口
}
],
// Nginx 端口映射
"80/tcp": [
{
"HostIp": "0.0.0.0", // 绑定到主机的所有IP
"HostPort": "8080" // 主机端口
}
]
},
"HostNetwork": false, // 是否使用主机网络(false 表示使用独立网络命名空间)
"StaticIP": "", // 静态IP地址
"StaticMAC": "", // 静态MAC地址
"NoManageResolvConf": false, // 是否不管理 resolv.conf 文件
"DNSServer": null, // DNS服务器配置
"DNSSearch": null, // DNS搜索域
"DNSOption": null, // DNS选项
"NoManageHostname": false, // 是否不管理主机名
"NoManageHosts": false, // 是否不管理 hosts 文件
"HostAdd": null, // 要添加到 hosts 文件的条目
"HostsFile": "", // 自定义 hosts 文件路径
"Networks": null, // 使用的网络列表
"NetworkOptions": null, // 网络选项
"pid_ns": "private", // PID命名空间(private 表示私有)
"userns": "host", // 用户命名空间(host 表示使用主机用户命名空间)
"uts_ns": "private" // UTS命名空间(private 表示私有)
},
"SharedNamespaces": [ // Pod 内容器共享的命名空间
"ipc", // 共享IPC命名空间(进程间通信)
"net", // 共享网络命名空间
"uts" // 共享UTS命名空间(主机名和域名)
],
"NumContainers": 3, // Pod 中包含的容器数量
"Containers": [ // Pod 中的容器列表
{
// 基础设施容器ID
"Id": "a00c13fb2b32bc1c07e7f3e277e09b6dcd8ba5a1dda62fc8f6a7e9a3c241cb37",
"Name": "0c9858859aa8-infra", // 基础设施容器名称
"State": "running" // 基础设施容器状态
},
{
// Redis 容器ID
"Id": "059b42d1d4c26c71753cc396a828a55c4c7e3820ec8971d0dbc97ea2d67dacc4",
"Name": "redis", // Redis 容器名称
"State": "running" // Redis 容器状态
},
{
// Nginx 容器ID
"Id": "0f9dce4e088a7060b3afcda1893ada8d894e987535126ad3937b5438c3c04535",
"Name": "nginx", // Nginx 容器名称
"State": "running" // Nginx 容器状态
}
],
"LockNumber": 0 // 锁编号(用于并发控制)
}
]在实际的生产环境中,我们可能会先在测试环境使用 Podman 部署 Pod 进行验证,验证通过后再迁移到 K8s 集群中进行规模化管理。手动编写 K8s 的 YAML 配置文件不仅耗时,还容易出现错误。而 podman generate kube 命令可以自动将 Podman 中的 Pod 导出为标准的 K8s YAML 配置文件,完美解决了这一痛点。
podman generate kube 命令的核心作用是将 Pod 的配置信息转换为 K8s 能够识别的 Deployment 和 Service(可选)配置。基本语法如下:
podman generate kube <pod名称/ID> [选项]
常用选项:
-f, --filename 指定输出文件路径
-s, --service 生成服务配置
-r, --replicas 设置 Deployment 副本数
点击查看 podman generate kube 命令手册。
示例:将名为 web-redis-pod 的 Pod 生成一个名为 mypod.yaml 的 K8S 部署文件。
podman generate kube web-redis-pod > mypod.yaml
执行上述命令后,当前目录下会生成一个名为mypod.yaml的文件,该文件包含了 K8s 部署该 Pod 所需的完整配置。
mypod.yaml 文件内容如下:
# Save the output of this file and use kubectl create -f to import # it into Kubernetes. # # Created with podman-5.7.0-rc3 apiVersion: v1 kind: Pod metadata: annotations: io.kubernetes.cri-o.SandboxID/nginx: a00c13fb2b32bc1c07e7f3e277e09b6dcd8ba5a1dda62fc8f6a7e9a3c241cb37 io.kubernetes.cri-o.SandboxID/redis: a00c13fb2b32bc1c07e7f3e277e09b6dcd8ba5a1dda62fc8f6a7e9a3c241cb37 creationTimestamp: "2025-11-26T06:23:05Z" labels: app: web-redis-pod name: web-redis-pod spec: containers: - args: - redis-server image: docker.io/library/redis:alpine name: redis ports: - containerPort: 6379 hostPort: 6379 - containerPort: 80 hostPort: 8080 volumeMounts: - mountPath: /data name: 75ea3e45783042a8333d94838ff4bb38001411d065f0cde73ff775465ae67853-pvc - args: - nginx - -g - daemon off; image: docker.io/library/nginx:alpine name: nginx volumes: - name: 75ea3e45783042a8333d94838ff4bb38001411d065f0cde73ff775465ae67853-pvc persistentVolumeClaim: claimName: 75ea3e45783042a8333d94838ff4bb38001411d065f0cde73ff775465ae67853
上述描述了一个名为 web-redis-pod 的 Pod,该 Pod 包含两个容器(Redis 和 Nginx),并配置了端口映射和数据卷挂载。其中:
(1)API 版本和资源类型
apiVersion: v1 kind: Pod
apiVersion: v1: 指定使用 Kubernetes API 的 v1 版本
kind: Pod: 声明这是一个 Pod 资源
(2)元数据(Metadata)
metadata: annotations: io.kubernetes.cri-o.SandboxID/nginx: a00c13fb2b32bc1c07e7f3e277e09b6dcd8ba5a1dda62fc8f6a7e9a3c241cb37 io.kubernetes.cri-o.SandboxID/redis: a00c13fb2b32bc1c07e7f3e277e09b6dcd8ba5a1dda62fc8f6a7e9a3c241cb37 creationTimestamp: "2025-11-26T06:23:05Z" labels: app: web-redis-pod name: web-redis-pod
annotations: 额外的元数据,这里记录了 CRI-O 沙箱 ID(从 Podman 转换而来)
labels: 用于标识和选择 Pod 的标签(app: web-redis-pod)
name: Pod 的名称(web-redis-pod)
(3)Pod 规格(Spec)
spec: containers: - args: - redis-server image: docker.io/library/redis:alpine name: redis ports: - containerPort: 6379 hostPort: 6379 - containerPort: 80 hostPort: 8080 volumeMounts: - mountPath: /data name: 75ea3e45783042a8333d94838ff4bb38001411d065f0cde73ff775465ae67853-pvc
Redis 容器配置:
args: 容器启动参数(redis-server)
image: 使用的镜像(redis:alpine)
name: 容器名称(redis)
ports: 端口映射(容器 6379 端口映射到主机 6379 端口)
volumeMounts: 卷挂载(将 PVC 挂载到 /data 目录,用于 Redis 数据持久化)
- args: - nginx - -g - daemon off; image: docker.io/library/nginx:alpine name: nginx
Nginx 容器配置:
args: Nginx 启动参数(nginx -g daemon off;,确保前台运行)
image: 使用的镜像(nginx:alpine)
name: 容器名称(nginx)
(4)卷配置
volumes: - name: 75ea3e45783042a8333d94838ff4bb38001411d065f0cde73ff775465ae67853-pvc persistentVolumeClaim: claimName: 75ea3e45783042a8333d94838ff4bb38001411d065f0cde73ff775465ae67853
定义了一个基于 PVC(PersistentVolumeClaim)的卷
名称是自动生成的 UUID,对应 Redis 的数据卷
利用 podman generate kube 命令实现 Pod 迁移的流程非常简洁,只需三步即可完成:
导出配置:在 Podman 环境中,使用上述命令将验证通过的 Pod 导出为 K8s YAML 文件。
调整配置(可选):根据 K8s 集群的实际情况,对 YAML 文件进行微调,例如修改资源限制、调整副本数、更换镜像仓库地址等。
部署到K8s:使用 kubectl apply 命令将 YAML 文件部署到 K8s 集群中,命令如下:
kubectl apply -f mypod.yaml
部署完成后,通过kubectl get pods命令即可查看 Pod 在 K8s 中的运行状态,实现了从 Podman 到K8s 的无缝衔接。