注意:

使用 Podman 和 Oracle Cloud Native Environment 部署 Kubernetes 工作负载

简介

Podman kube provides developers and administrators with a way to test Kubernetes workloads using Podman before deploying them to a Kubernetes cluster.podman kube 命令用于从现有的 Podman 容器或 Pods 生成符合 Kubernetes 的 YAML,或者从 Kubernetes YAML 文件创建容器/pod。这提供了一种方便的方式来轻松在 Podman 和 Kubernetes 环境之间转换,从而利用这两个生态系统的优势来减少开发和测试周期。

注:podman kube play 命令可读取任何有效的 Kubernetes YAML 文件,并在本地运行的 Podman 实例上启动 YAML 文件中定义的 pod、容器或卷。但是,并非所有 Kubernetes YAML 文件类型都受支持;当前支持的 Kubernetes 类型包括:

podman kube play 命令当前支持的 Kubernetes YAML 字段的更详细列表位于此处

Podman 可以使用 podman kube apply 命令将支持的 Kubernetes YAML 文件应用于 Kubernetes 集群。这些步骤适用于任何 Kubernetes 集群。但是,我们建议将 Oracle Cloud Native Environment 作为 Kubernetes 部署选项。有关详细信息,请参阅 Oracle Cloud Native Environment 文档

注:本教程演示如何使用 Podman 生成 Kubernetes YAML 文件,并随后说明如何将它们部署到 Kubernetes 集群。必须使用 kubectl 命令完成对已部署对象的任何进一步管理。有关使用 kubectl 的更多信息,请参见上游文档

目标

在本教程中,您将学习:

先决条件

配置 Oracle Cloud Native Environment

注:如果在您自己的租户中运行,请在部署实验环境之前阅读 linux-virt-labs GitHub 项目 README.md 并完成先决条件。

  1. 在 Luna Desktop 上打开一个终端。

  2. 克隆 linux-virt-labs GitHub 项目。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 转到工作目录。

    cd linux-virt-labs/ocne2
    
  4. 安装所需集合。

    ansible-galaxy collection install -r requirements.yml
    
  5. 部署实验室环境。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e use_podman=true -e install_ocne_rpm=true -e create_ocne_cluster=true -e "ocne_cluster_node_options='-n 1 -w 1'"
    

    免费的实验环境需要额外的变量 local_python_interpreter,该变量为在 localhost 上运行的播放设置 ansible_python_interpreter。此变量是必需的,因为环境安装了适用于 Python 的 Oracle Cloud Infrastructure SDK 的 RPM 程序包,该程序包位于 python3.6 模块下。

    默认部署配置使用 AMD CPU 和 Oracle Linux 8。要使用 Intel CPU 或 Oracle Linux 9,请将 -e instance_shape="VM.Standard3.Flex"-e os_version="9" 添加到部署命令。

    重要提示:等待手册成功运行并到达暂停任务。在手册的这一阶段,Oracle CNE 安装已完成,实例已准备就绪。记下之前的剧集,其中输出其部署的节点的公共和专用 IP 地址,以及运行实验时所需的任何其他部署信息。

访问 Kubernetes 集群

  1. 打开终端并通过 SSH 连接到 ocne 实例。

    ssh oracle@<ip_address_of_instance>
    
  2. 等待集群稳定下来,所有云池将报告它们正在运行。

    watch kubectl get pods -A
    

    当所有 pod 显示 STATUSRunning 时,键入 Ctrl-C 以退出 watch 命令。

  3. 确认存在多少个节点。

    kubectl get nodes
    

确认 Podman 工作

  1. 检查 Podman 的版本。

    podman -v
    
  2. 确认 Podman CLI 正在工作。

    podman run quay.io/podman/hello
    

    输出示例:

    [oracle@ol-server ~]$ podman run quay.io/podman/hello
    Trying to pull quay.io/podman/hello:latest...
    Getting image source signatures
    Copying blob f82b04e85914 done
    Copying config dbd85e09a1 done
    Writing manifest to image destination
    Storing signatures
    !... Hello Podman World ...!
    
             .--"--.
           / -     - \
          / (O)   (O) \
       ~~~| -=(,Y,)=- |
        .---. /`  \   |~~
     ~/  o  o \~~~~.----. ~~
      | =(X)= |~  / (O (O) \
       ~~~~~~~  ~| =(Y_)=-  |
      ~~~~    ~~~|   U      |~~
    
    Project:   https://github.com/containers/podman
    Website:   https://podman.io
    Documents: https://docs.podman.io
    Twitter:   @Podman_io
    

创建 Kubernetes YAML 文件

Podman Kube 功能可以与 Podman 生成的 Kubernetes YAML 文件或原生 Kubernetes YAML 文件一起使用。让我们反过来看看两者。

使用容器创建 Podman 云池并生成 Kubernetes YAML

首先,在本地将容器部署到 Podman pod 中。然后,使用该部署生成可部署到 Kubernetes 集群的 Kubernetes YAML 文件。

  1. 使用将端口 8081 映射到主机的 Nginx 服务器创建 pod。

    podman run -dt --pod new:my-nginx --name nginx-container -p 8081:80 ghcr.io/oracle/oraclelinux9-nginx:1.20
    

    这将创建一个名为 ‘ my-nginx ’ 的新 pod,在 pod 中部署一个 Nginx 容器,并将容器映射到主机上的端口 8081。

  2. 验证 Pod 是否已创建。

    podman pod ps
    

    输出示例:

    [oracle@ocne ~]$ podman pod ps
    POD ID        NAME        STATUS      CREATED         INFRA ID      # OF CONTAINERS
    e5248f6968b3  my-nginx    Running     48 seconds ago  5e41ad85e232  2
    
  3. 确认您可以从主机访问新 pod 及其容器。

    curl http://localhost:8081
    
  4. 从正在运行的云池生成 Kubernetes 文件 YAML。

    podman kube generate my-nginx --type pod > nginx-pod.yaml
    

    Podman generate 命令从包含容器的正在运行的 Podman pod 中创建符合 Kubernetes 的文件。可以将其部署到 Kubernetes 集群,使其对本地原型创建非常有用,并随后创建符合 Kubernetes 的清单文件。

  5. 检查生成的文件。

    cat nginx-pod.yaml
    

    输出示例:

    [oracle@ocne ~]$ cat nginx-pod.yaml
    # Save the output of this file and use kubectl create -f to import
    # it into Kubernetes.
    #
    # Created with podman-4.9.4-rhel
    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: "2025-08-11T14:08:13Z"
      labels:
        app: my-nginx
      name: my-nginx
    spec:
      containers:
      - env:
        - name: TERM
          value: xterm
        image: ghcr.io/oracle/oraclelinux9-nginx:1.20
        name: zenbardeen
        ports:
        - containerPort: 80
          hostPort: 8081
        tty: true
    

删除使用 Podman Kube 部署的云池和容器

云池及其相关容器在完成处理后可以轻松删除。

  1. 删除 my-nginx 云池。

    podman kube down nginx-pod.yaml
    
  2. 确认两个 pod 都已删除。

    podman pod ps
    

    输出示例:

    [oracle@ocne ~]$ podman pod ps
    POD ID      NAME        STATUS      CREATED     INFRA ID    # OF CONTAINERS
    

    这确认您之前创建的 Podman 生成的 Kubernetes YAML 文件有效。

使用 Podman Kube 将 Kubernetes YAML 部署到 Kubernetes 集群

只有当主机的 kubeconfig 文件位于 $HOME/.kube 目录中时,Podman 才能部署到 Kubernetes 集群。

确认您的环境有效

  1. 确认已设置 KUBECONFIG 环境变量。

    env | grep KUBE
    

    输出示例:

    [oracle@ocne ~]$ env | grep KUBE
    KUBECONFIG=/home/oracle/.kube/kubeconfig.ocne.local
    

    信息:如果已安装 kubectl,并且 ${HOME}/.kube 目录中有多个配置文件,请执行此命令以确认 kubectl 当前正在使用哪个配置文件:

    kubectl get pod  -v6 2>&1 | awk '/Config loaded from file:/{print $NF}'
    

    输出示例:

    [oracle@ocne ~]$ kubectl get pod  -v6 2>&1 | awk '/Config loaded from file:/{print $NF}'
    /home/oracle/.kube/kubeconfig.ocne.local
    

    注:verbosity 设置为 6 级或更高级别的情况下执行任何 kubectl 命令,并且当前使用的 kubeconfig 将包含在输出中。

部署有效的 Kubernetes YAML 文件

  1. 创建 Kubernetes YAML 文件。

    cat << EOF | tee testpod.yaml > /dev/null
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: test-container
        image: ghcr.io/oracle/oraclelinux9-nginx:1.20
        ports:
        - containerPort: 8080
    EOF
    
  2. 使用 Podman 将 testpod.yaml 文件部署到 Kubernetes 集群。

    podman kube apply -f testpod.yaml
    

    输出示例:

    [oracle@ocne ~]$ podman kube apply -f testpod.yaml
    Deploying to cluster...
    Successfully deployed workloads to cluster!
    

    注:默认情况下,这会部署到 default 名称空间。

  3. 确认 Pod 已部署到您的集群。

    kubectl get pods
    

    输出示例:

    [oracle@ocne ~]$ kubectl get pods
    NAME      READY   STATUS    RESTARTS   AGE
    my-pod    1/1     Running   0          23s
    

    这确认 podman 已将名为 my-pod 的 pod 部署到集群。

  4. 确认 Nginx 已按预期部署。

    kubectl describe pods/my-pod
    

    输出示例:

    [oracle@ocne ~]$ kubectl describe pods/my-pod
    Name:             my-pod
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             ocne-worker-1/192.168.122.122
    Start Time:       Wed, 06 Aug 2025 15:09:55 +0000
    Labels:           <none>
    Annotations:      <none>
    Status:           Running
    IP:               10.244.1.6
    IPs:
      IP:  10.244.1.6
    Containers:
      test-container:
        Container ID:   cri-o://c2ea59274a702f9cdb044d92869b63da27249370a0c55bef2994f49a092e527a
        Image:          ghcr.io/oracle/oraclelinux9-nginx:1.20
        Image ID:       ghcr.io/oracle/oraclelinux9-nginx@sha256:16b15a609a172059f9e66ae412dde3b9febe0b0fdd4eb1084eac2783088de6f1
        Port:           8080/TCP
        Host Port:      0/TCP
        State:          Running
    ...
    ...
    ...
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  48m   default-scheduler  Successfully assigned default/my-pod to ocne-worker-1
      Normal  Pulling    48m   kubelet            Pulling image "ghcr.io/oracle/oraclelinux9-nginx:1.20"
      Normal  Pulled     48m   kubelet            Successfully pulled image "ghcr.io/oracle/oraclelinux9-nginx:1.20" in 10.66s (10.66s including waiting). Image size: 267010601 bytes.
      Normal  Created    48m   kubelet            Created container: test-container
      Normal  Started    48m   kubelet            Started container test-container
    

    这证实了 podman kube play 命令使用 Kubernetes YAML 文件将 pod 直接部署到 Kubernetes 集群。

将 Podman 生成的 Kubernetes YAML 部署到 Kubernetes 集群

将您在教程开始时创建的 Podman 生成的 Kubernetes YAML 文件部署到 Kubernetes 集群。

  1. nginx-pod.yaml 文件部署到 Kubernetes 集群。

    podman kube apply -f nginx-pod.yaml
    

    输出示例:

    [oracle@ocne ~]$ podman kube apply -f nginx-pod.yaml
    Deploying to cluster...
    Successfully deployed workloads to cluster!
    
  2. 确认 Pod 已部署到您的集群。

    kubectl get pods
    

    输出示例:

    [oracle@ocne ~]$ kubectl get pods
    NAME       READY   STATUS    RESTARTS   AGE
    my-nginx   1/1     Running   0          1m59s
    my-pod     1/1     Running   0          5m12s
    
  3. 确认 Nginx 已按预期部署。

    kubectl describe pods/my-nginx
    

    这证实 Podman 已成功将 podman 生成的 Kubernetes YAML(称为 my-nginx )部署到 Kubernetes 集群。

后续步骤

本教程演示了如何使用 Podman 使用 Oracle Cloud Native Environment 将 Kubernetes 工作负载部署到 Kubernetes 集群。有关其他教程和内容,请查看 Oracle Linux 培训站。

更多学习资源

通过 docs.oracle.com/learn 浏览其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心