Podman 教程

Podman Pod 元数据

在日常使用 Podman 管理 Pod 的过程中,我们经常需要查看 Pod 的详细配置信息,或是将已部署的 Pod 迁移到 Kubernetes(K8s)环境中。下面将分享两个实用的 Podman 命令 —— podman pod inspect 和 podman generate kube。

洞察 Pod 的“五脏六腑”

当我们部署好一个 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 // 锁编号(用于并发控制)
     }
]

实现 Pod 到 K8s 的无缝迁移

在实际的生产环境中,我们可能会先在测试环境使用 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 的数据卷

  

迁移到K8s的完整流程

利用 podman generate kube 命令实现 Pod 迁移的流程非常简洁,只需三步即可完成:

  1. 导出配置:在 Podman 环境中,使用上述命令将验证通过的 Pod 导出为 K8s YAML 文件。

  2. 调整配置(可选):根据 K8s 集群的实际情况,对 YAML 文件进行微调,例如修改资源限制、调整副本数、更换镜像仓库地址等。

  3. 部署到K8s:使用 kubectl apply 命令将 YAML 文件部署到 K8s 集群中,命令如下:

kubectl apply -f mypod.yaml

部署完成后,通过kubectl get pods命令即可查看 Pod 在 K8s 中的运行状态,实现了从 Podman 到K8s 的无缝衔接。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号