K8S里的“豌豆荚”:Pod
1. 为什么要有pod
Pod 这个词原意是“豌豆荚”,后来又延伸出“舱室”“太空舱”等含义,你可以看一下这张图片,形 象地来说 Pod 就是包含了很多组件、成员的一种结构。
之前的容器技术让进程在一个“沙盒”环境里运行,具有良好的隔离性,对应用是一个非常好的封装。
不过,当容器技术进入到现实的生产环境中时,这种隔离性就带来了一些麻烦。因为很少有应 用是完全独立运行的,经常需要几个进程互相协作才能完成任务,比如在我们搭建一个网站的时候,就需要Nginx,数据库,应用服务等容器一起工作。这三个应用之间的关系还是比较松散的,它们可以分别调度,运行在不 同的机器上也能够以 IP 地址通信。
但还有一些特殊情况,多个应用结合得非常紧密以至于无法把它们拆开。比如,有的应用运行 前需要其他应用帮它初始化一些配置,还有就是日志代理,它必须读取另一个应用存储在本地 磁盘的文件再转发出去。这些应用如果被强制分离成两个容器,切断联系,就无法正常工作 了。
为了解决这样多应用联合运行的问题,同时还要不破坏容器的隔离,就需要在容器外面再建立 一个“收纳舱”,让多个容器既保持相对独立,又能够小范围共享网络、存储等资源,而且永远 是“绑在一起”的状态。
所以,Pod 的概念也就呼之欲出了,容器正是“豆荚”里那些小小的“豌豆”,你可以在 Pod 的 YAML 里看到,“spec.containers”字段其实是一个数组,里面允许定义多个容器。
2. 为什么 Pod 是 Kubernetes 的核心对象
因为 Pod 是对容器的“打包”,里面的容器是一个整体,总是能够一起调度、一起运行,绝不会 出现分离的情况,而且 Pod 属于 Kubernetes,可以在不触碰下层容器的情况下任意定制修 改。所以有了 Pod 这个抽象概念,Kubernetes 在集群级别上管理应用就会“得心应手”了。
Kubernetes 让 Pod 去编排处理容器,然后把 Pod 作为应用调度部署的最小单位,Pod 也因此成为了 Kubernetes 世界里的“原子”(当然这个“原子”内部是有结构的,不是铁板一块),基于 Pod 就可以构建出更多更复杂的业务形态了。
从这张图中你也应该能够看出来,所有的 Kubernetes 资源都直接或者间接地依附在 Pod 之 上,所有的 Kubernetes 功能都必须通过 Pod 来实现,所以 Pod 理所当然地成为了 Kubernetes 的核心对象。
3. 使用 YAML 描述 Pod
既然 Pod 这么重要,那么我们就很有必要来详细了解一下 Pod,理解了 Pod 概念,我们的 Kubernetes 学习之旅就成功了一半。
在 K8S 中,我们通常使用 YAML 文件来定义和创建 Pod。YAML 文件以简洁、易读的格式描述了 Pod 的各种配置信息,就像是一份详细的建筑蓝图,告诉 K8S 该如何构建我们的 Pod。
下面是一个使用 YAML 文件创建 Pod 的简单示例:
apiVersion: v1
kind: Pod
metadata:name: my-podlabels:app: my-app
spec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80
在这个示例中,apiVersion字段指定了 K8S API 的版本,它就像是一个软件的版本号,不同的版本可能会有不同的功能和特性 。kind字段明确了我们要创建的资源类型是 Pod,这是告诉 K8S 我们要构建的是一个 “房子”,而不是其他类型的资源。
metadata字段则包含了 Pod 的元数据信息,其中name是 Pod 的名称,就像每个人都有自己的名字一样,Pod 也需要一个唯一的名称来标识自己 。labels是标签,它是一种键值对形式的元数据,我们可以给 Pod 添加各种标签,用于对 Pod 进行分类和筛选,比如这里的app: my-app标签,就可以帮助我们快速找到所有属于my-app应用的 Pod。
spec字段是整个 YAML 文件的核心部分,它定义了 Pod 的具体规格和配置。containers字段列出了 Pod 中包含的容器信息,这里我们定义了一个名为my-container的容器,它使用的镜像nginx:latest,这就像是告诉 K8S 我们要在这个 “房间” 里安装什么 “家具” 。ports字段指定了容器要暴露的端口,这里我们将容器的 80 端口暴露出来,这样外界就可以通过这个端口访问到容器内运行的 Nginx 服务。
当我们编写好 YAML 文件后,只需要执行kubectl apply -f my-pod.yaml命令,K8S 就会根据这个文件的描述创建出对应的 Pod。
4. pod管理
创建好 Pod 之后,我们还需要对它进行各种管理操作,以确保它能够稳定运行。kubectl 工具为我们提供了丰富的命令来实现这些操作 。
要查看 Pod 的状态和详细信息,可以使用kubectl get pods命令,它会列出所有 Pod 的基本信息,包括名称、状态、运行的节点等 。如果想要查看某个 Pod 的详细信息,比如容器的运行日志、资源使用情况等,可以使用kubectl describe pod my-pod命令,它就像是一个放大镜,帮助我们深入了解 Pod 的内部状态 。
当我们需要进入 Pod 容器内部进行调试或执行一些命令时,可以使用kubectl exec -it my-pod -- /bin/bash命令,其中-it参数表示以交互模式进入容器,--后面的/bin/bash表示在容器内执行的命令,这里我们进入了容器的 bash 终端,就可以像在本地服务器上一样执行各种命令了 。
如果需要对 Pod 的配置进行修改,可以使用kubectl edit pod my-pod命令,它会打开一个编辑器,让我们直接修改 Pod 的 YAML 配置文件,修改保存后,K8S 会自动应用这些更改,就像是给房子重新装修一样,让 Pod 拥有新的 “面貌” 。
当某个 Pod 不再需要时,我们可以使用kubectl delete pod my-pod命令将其删除,释放集群资源。但要注意,删除 Pod 时要谨慎操作,避免误删重要的应用服务 。
通过这些 kubectl 命令,我们可以轻松地对 Pod 进行创建、查看、管理和删除等操作,让我们能够灵活地掌控 K8S 集群中的应用服务。
5. 小结
通过上面的学习,了解了Kubernetes 里最核心最基本的概念 Pod,知道了应该如何使用 YAML 来定制 Pod,还有如何使用 kubectl 命令来创建、删除、查看、调试 Pod。
虽然 Pod 是 Kubernetes 的核心概念,非常重要,但事实上在 Kubernetes 里通常并不会直接 创建 Pod,因为它只是对容器做了简单的包装,比较脆弱,离复杂的业务需求还有些距离,需 要 Job、CronJob、Deployment 等其他对象增添更多的功能才能投入生产使用。