API对象--Pod的理解(chrono《kubernetes入门实战课》笔记整理)

 

【为什么要有pod】

pod,直译为豌豆荚,形象地描述了它的功能,它内部包含很多豆子,这一颗颗豆子,就是每个组件、成员。既然pod也是为了运行容器,为什么不直接用docker运行呢?因为docker运行的容器,每个容器是完全隔离的,当拥有不同服务的容器互相之间要频繁进行通信,甚至有依赖关系,要根据需要灵活做好调度,容器之间毕竟是完全隔离的,就不是非常方便了。那么干脆把需要的服务都放在一个容器是不是可以呢?是的,但是这就不是容器存在的意义了,容器就是为了对每个应用独立封装,好管理。

那么,又需要联合运行,又要不破坏容器的隔离,就需要在容器外面,做一个大的豌豆荚,包裹为了某种应用,组织起来的一个系列的容器,每个容器,就像一颗颗豌豆。它们既可以相对独立,又能小范围共享网络、存储等资源,而且一个豌豆荚可以是一个用途的“应用”,逻辑上也非常清晰。在YAML文件里,我们看到spec.containers,这是一个数组,这意味着,一个Pod是可以定义很多容器的。

 

 

【Pod为什么在k8s中如此重要】

pod是k8s调度部署的最小单位,也就是说,k8s只对pod进行操作。每个pod里有很多的不同功能的容器,集合起来做到pod想做到的服务能力。下图是k8s各个元素之间的一个关系,可以看出,k8s的资源,都直接或者间接通过pod来进行实现和中转,所以pod也就很自然称为k8s中最核心的对象了。(现在理解这个图,还有点点难,后面我要是学得更多了,会回来对这张图做更进一步地说明)

 

【如何使用YAML描述Pod】

上节课我们学了Pod也是一种API对象,所以它的YAML文件,也需要遵守YAML文件的格式,需要有apiserver,kind,metadata,spec。下面针对几个需要特别注意的参数做进一步说明。

1、metadate字段:在k8s里,pod的创建,必须要有一个名字,就是metadata里面的name,这是一个必须要遵守的约定。而name毕竟信息有限,需要metadata的lable进一步进行描述和说明,这样我们对于这个pod就有非常清晰的分别了。标签可以是不同的运行环境env=xxx,所在的物理位置region:xxxx等等。如:

 2、spec字段:由于spec需要管理、维护pod,里面必须要包含很多关键信息,这里最重要的一个概念就是containers。containers是一个数组,里面每个元素又是一个container对象,也就是容器。和pod一样,container对象,也必须要有一个name标识名字,然后还要用image说明使用的镜像,这两个字段是必须要有的,否则k8s会报错数据验证错误。container的其他字段,都可以类比docker去理解,比如:

  • ports:就是容器对外暴露的端口;
  • imagepullpolicy:制定镜像的拉取策略,可以是Always/Never/IfNotPresent,一般默认是IfNotPresent,也就是说只有本地不存在,才会远程拉取镜像,这样可以减少网络消耗;
  • env:定义pod的环境变量,和dockerfile的ENV指令有点类似;
  • command:定义容器启动时要执行的命令,相当于dockerfile的entrypoint指令;
  • args:是command运行时的参数,相当于dockerfile里面的cmd指令

如下是一个spec的示例。如下信息意思为:我为 Pod 指定使用镜像 busybox:latest,拉取策略是 IfNotPresent ,然后定义了 os 和 debug 两个环境变量,启动命令是 /bin/echo,参数里输出刚才定义的环境变量。相比docker run加很多的参数来说明启动要做的事儿,用YAML 在 spec.containers 字段里用“声明式”定义,可以把容器的运行状态描述得非常清晰准确,结构上也很好阅读。

 

 

【使用kubectl操作pod】

1、可以使用上节课的内容,用kubectl apply/delete -f xx.yml,对pod进行操作;

2、kubectl delete pod xx(YAML里面的name),通过name来删除pod;

3、k8s的pod,不会在前台运行,相当于默认加了-d,所以输出信息看不到,通过kubectl logs,可以把pod的标准输出信息展示出来;

4、kubectl get pod,查看pod列表和运行状态。如果某个pod运行不是很正常,可以用kubectl describe pod xx来看,这个在排错很有。这里要注意,需要注意event部分,这是pod运行中一些关键节点事件;

5、kubectl cp,把本地文件拷贝到pod;kubectl exec -it pod的name -- sh,进入pod内部执行shell;如下是个简单的实验过程:、

 

posted @   1234roro  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示