podman pod

简介: podman pod

podman pod


什么是podman pod

注意,这里提及的是podman pod,而非kubernetes pod




什么是pod

要搞清楚pod定义之前,必须要搞懂容器容器再次之前,我们已经定义过了,是docker或者是podman能够管理的最小单位,而pod则是可以装一个或多个容器的盒子。


pod最早定义于kubernetes,是其可部署和管理以及调度的最小单元,kubernetes pod中的容器可以共享存储、网络等。


podman pod

podman pod定于基本上与kubernetes一致,甚至,你可以根据kubernetes yaml描述文件来创建podman pod,和kubernetes不同的是,podman pod会创建名为infra容器,它是podman pod的默认容器。(要不要挖个坑,后面讲讲kubernetes)




前期准备


代码案例

我们就用之前我们的实例来改下,我们将返回“阅读量”从变量的形式,我们更改为从 Redis数据库获取,具体代码如下

该案例需要我们指定一个redis数据库的地址,可以将“阅读量”存入数据库

image.png



Dockerfile案例

由于增加了一个变量,所以我们需要重写Docerfile

为什么是Dockerfile ,而不是BuildAH,嘿嘿,因为我还没看buildah,留个坑 可以看到,Dockerfile定义了一个ENV变量,我们可以在run容器的时候,使用-e去定义具体的值

image.png



我们build后,将它推送到docker hub,以便我们后续podman拉取

image.png

为什么不支持从docker导出,然后导入podman,之前测试过,失败了,可以翻翻看前面的文章,要不留个坑,后面专门看看这个问题? 以及解决方案?



以非pod的形式起容器组


启动容器组


启动redis容器

使用命令: podman run -d --name myredis redis

启动一个redis容器

image.png


启动主容器


我们在启动容器之前,我们需要先获取redisip地址

使用如下命令可以获取: podman inspect -f "{{.NetworkSettings.Networks.podman.IPAddress}}" myredis

具体含义可以参考之前的podman文章,《podman 容器操作(下)》

image.png


我们得到IP地址后,我们就可以启动主容器了

命令: podman run -d --name mypdudojuejin2 -e redisHost="10.88.0.23:6379" -p 9091:9091 容器images

image.png




相关测试


测试相关功能

可以发现,成功了,没得问题

image.png


模拟容器挂掉重启后再次访问

我们可以发现,容器重启后,再次访问,已经从redis数据库中获取相应数据了

image.png


模拟数据库挂掉后访问路由

image.png


查看主容器Log

原来是连不上数据库,抛panic

image.png




以pod的形式启动容器组


创建空pod


使用命令: podman pod create -n mypod1 -p 9091:9091

-n: 指定pod名称

-p: 确认映射端口(通过infra)

注意: 在pod中使用pdoman run 不能携带-p参数,需要需要在创建pod便指定好,因为pod会创建一个infra,它的作用为可以共享pod中所有的网络,即: 该Pod可以使用localhost进行通信。

image.png



创建redis容器并且加入到pod

使用命令: podman run -d --name myredis --pod mypod1 redis

image.png


查看下启动的容器

使用命令: podman ps --pod可以将pod列出来

image.png



启动主容器


命令: podman run -d --name mypdudojuejin2 -e redisHost="localhost:6379" --pod mypod1 容器image

为什么要将 redisHost 置定为本机,因为这是podman pod 特性

image.png



我们再次查看启动的容器


image.png



相关测试


测试相关功能

可以发现,正常输出

image.png


模拟挂掉重启再次访问

可以发现也是可以的

image.png


查看pod负载


显示pod的运行进程

使用命令: podman pod top mypod1

image.png


显示pod容器使用资源


使用命令: podman pod stats --all --no-reset

除非按下ctrl+ c,否则,会持续输出pod的进程资源占用信息

image.png


停止pod

我们想停掉mypod1下的所有容器

我们使用podman pod stop mypod1 即可


image.png


我们再次查看正在运行的容器

可以发现,mypod1下的所有进程都被停掉了

image.png



非Pod启动容器组弊端


不能为一个整体

非pod的方式启动容器组,容器无法组成一个整体,是单个单个的,例如,如上例子,我有100个实例组,那么换句话说,就有100redis100pdudojuejin2 进程,我们如何管理才是最大的问题,而以pod来启动,它会管理自身下的容器,为我们减少了麻烦。


网络复杂化

就像我们第一个实例一样,我们启动redis,但是我们需要拿到它的ip,要不redis也将端口映射出来,我们才能供pdudojuejin2容器连接,当机器迁移后,问题会变得复杂化,主要是因为网络引起的。


kube yaml的形式启动podman pod

正如开头所述,我们可以使用kubernetes描述文件启动podman pod,如果你暂时还不会编写kubernetes,可以跳过这节,后面我想,我可能会单独出一个章节来介绍kubernetes


将上述翻译为yaml描述文件

image.png


使用play执行yaml描述文件

image.png


查看容器

image.png



测试访问

image.png




问题/解决/想法


无法访问谷歌下载不了pause

例如我们使用命令: podman pod create -n juejin_pdudo_test_pod


问题描述

报错信息: initializing source docker://k8s.gcr.io/pause:3.5: pinging container registry k8s.gcr.io: Get "https://k8s.gcr.io/v2/": dial tcp 64.233.189.82:443: i/o timeout


image.png



问题解决


该问题是无法访问谷歌,导致pull pause镜像失败导致的,我们可以拿着镜像名称,去docker hub上搜索相应的,然后pull下载,修改tag即可,例如: podman 3.4.4使用的是pause:3.5,则我们按照上述执行即可

podman pull docker pull powerds/pause:3.5
podman tag docker.io/powerds/pause:3.5 k8s.gcr.io/pause:3.5


再次启动,则成功

image.png



想法


podman pod相比于kubernetes是在是有点鸡肋,不过有意思的是podman可以执行k8s yaml。如果你想学容器编排,那么建议直接学龙头老大kubernetes就好,不要在podman上绕一回,2个根本不是一回事,要不要挖个坑,后面讲讲k8s?






相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
前端开发 网络安全 网络协议
系统诊断小技巧(10):ssh/sshd的调试模式
网络应用的逻辑一般都是集中在两端。所以端到端的排查思路是解决问题的重要思路。排查ssh问题也是如此。 那么,怎么让ssh两端输出更多信息呢? 如何启动调试选项? ssh和sshd都有配置选项和命令行选项来启动调试。
6916 0
|
人工智能 弹性计算 监控
3分钟部署HiClaw
HiClaw 是基于 OpenClaw 的开源 Agent 团队系统,含 Manager(AI 管家)与可扩展 Worker,通过 Matrix 群聊协作。安全设计(仅用消费者令牌)、开箱即用(内置 Matrix)、一键部署(curl | bash)、丰富技能生态(skills.sh),真正让 AI 团队可控、可信、易用。(239字)
3分钟部署HiClaw
|
存储 安全 Linux
Podman入门全指南:安装、配置与运行容器
Podman入门全指南:安装、配置与运行容器
11431 1
|
数据可视化 JavaScript 前端开发
Python中交互式Matplotlib图表
【10月更文挑战第20天】Matplotlib 是 Python 中最常用的绘图库之一,但默认生成的图表是静态的。通过结合 mpld3 库,可以轻松创建交互式图表,提升数据可视化效果。本文介绍了如何使用 mpld3 在 Python 中创建交互式散点图、折线图和直方图,并提供了详细的代码示例和安装方法。通过添加插件,可以实现缩放、平移和鼠标悬停显示数据标签等交互功能。希望本文能帮助读者掌握这一强大工具。
|
安全 Linux 应用服务中间件
【Podman】podman入门学习 | Docker替代品
【Podman】podman入门学习 | Docker替代品
2478 0
【Podman】podman入门学习 | Docker替代品
【LaTex、markdown】常用语法写出漂亮的blog
【9月更文挑战第9天】本文介绍了使用LaTeX和Markdown编写美观博客的方法。LaTeX方面,需定义文档类型、设置标题与作者,并利用特定命令处理文本格式、列表、数学公式、图片和超链接。Markdown则通过井号表示标题级别,使用星号或下划线标记文本,简化列表和公式的编写,并以直观方式插入图片和链接。两者均可通过合理布局提升博客的可读性和视觉效果。
545 8
|
存储 Kubernetes 网络协议
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件
Kubernetes 对 Pod 进行调度时,以当时集群中各节点的可用资源作为主要依据,自动选择某一个可用的节点,并将 Pod 分配到该节点上。在这种情况下,Pod 中容器数据的持久化如果存储在所在节点的磁盘上,就会产生不可预知的问题,例如,当 Pod 出现故障,Kubernetes 重新调度之后,Pod 所在的新节点上,并不存在上一次 Pod 运行时所在节点上的数
9383 3
Kubernetes 集群部署 NFS-Subdir-External-Provisioner 存储插件
|
人工智能 Linux 应用服务中间件
podman容器操作
podman容器操作
1004 2
|
存储 关系型数据库 MySQL
【MySQL探索之旅】MySQL数据库下载及安装教程
【MySQL探索之旅】MySQL数据库下载及安装教程