Kubernetes(k8s)核心资源解析:Pod详解

Kubernetes核心资源解析:Pod详解

  • 1、什么是Pod?
  • [2、Pod 的组成](#2、Pod 的组成)
  • [3、Pod 如何管理多个容器](#3、Pod 如何管理多个容器)
  • [4、Pod 的网络](#4、Pod 的网络)
  • [5、Pod 的存储方式](#5、Pod 的存储方式)
  • [6、Pod 的工作方式](#6、Pod 的工作方式)
    • [6.1 自主式 Pod](#6.1 自主式 Pod)
    • [6.2 监控和管理 Pod](#6.2 监控和管理 Pod)
    • [6.3 Pod 的创建流程](#6.3 Pod 的创建流程)

|-----------------------------|
| 💖The Begin💖点点关注,收藏不迷路💖 |

1、什么是Pod?

Pod是Kubernetes中最小的调度单元,它可以包含一个或多个容器。Pod中的所有容器共享网络和存储卷,它们一起运行在同一个节点上。Pod提供了一种抽象层,使得容器可以作为一个逻辑单元来管理。

Pod中的容器共享IP地址、端口空间和存储,它们可以通过localhost / 127.0.0.1相互通信。

Pod的运行需要根据Kubernetes集群的工作节点来运行,具体调度哪个节点,根据调度器(Scheduler)实现。

2、Pod 的组成

1、容器 :Pod中可以包含一个或多个容器,这些容器共享网络和存储卷。
2、共享网络命名空间 :Pod中的所有容器共享同一个网络命名空间,它们可以相互通信。
3、存储卷:Pod中的容器可以共享存储卷,这些存储卷可以用于数据持久化或共享。

3、Pod 如何管理多个容器

在 Kubernetes 中,Pod 是最小的可部署单元,可以包含一个或多个容器。Pod 内的所有容器共享相同的网络命名空间、IP 地址和存储卷,并在同一主机上调度。

例如:

可以将一个主要容器与一个或多个 Sidecar 容器组合在同一个 Pod 中。主要容器负责应用程序的主要逻辑,而 Sidecar 容器可以处理辅助任务,例如日志收集、监控等。

要管理多个容器的 Pod,需要仔细设计容器之间的交互和共享资源,并利用 Kubernetes 提供的各种功能来简化管理和操作。

比如:Kubernetes 提供了各种资源来管理多容器的 Pod,如 Deployment、StatefulSet、DaemonSet 等。这些资源可以自动管理 Pod 的部署、扩展和更新。

4、Pod 的网络

在容器化应用中,Pod 中的容器需要相互通信,以及与外部系统进行通信。Pod 网络提供了一种机制来管理这种通信,并确保安全、高效地进行网络连接。

Pod 网络的特性:

1、容器间通信:Pod 网络允许 Pod 内的容器相互通信,这使得容器之间可以共享资源和信息。

2、跨节点通信:Pod 可以分布在 Kubernetes 集群的不同节点上,Pod 网络负责确保跨节点的通信。

3、服务发现:Pod 网络通常与 Kubernetes 中的服务发现机制结合使用,使得应用程序能够轻松地发现和连接到其他服务。

4、网络策略:Pod 网络可以实施网络策略,限制 Pod 之间的通信,提高安全性。

Pod 网络实现方式:

1、Overlay 网络:使用 Overlay 网络技术(如 VXLAN、Flannel、Calico 等)创建一个虚拟网络层,使得 Pod 可以透明地跨节点通信。

2、Host 网络:容器直接使用节点的网络命名空间,与节点共享网络配置。这种方式效率高,但缺乏网络隔离性。

3、混合网络:结合 Overlay 网络和 Host 网络的优势,提供更灵活的网络管理方式。

5、Pod 的存储方式

容器是短暂的,它们可以随时启动、停止或重新调度。因此,任何存储在容器中的数据都会随着容器的生命周期而消失。为了持久化存储应用程序的数据,需要一种机制来确保数据的持久性和可靠性。

Pod 存储的特性:

1、持久性:Pod 存储提供持久化的存储机制,确保数据在容器重新启动或迁移时不会丢失。

2、可靠性:Pod 存储通常提供数据的备份、复制和恢复机制,以确保数据的可靠性和安全性。

3、性能:Pod 存储应该具有良好的性能,能够满足应用程序对存储的高吞吐量和低延迟的需求。

4、扩展性:Pod 存储应该能够方便地扩展以应对不断增长的数据量和请求量。

Pod 存储的实现方式:

1、空白存储:它不会持久化保存任何数据,只是一种临时存储卷类型,在容器退出后会被删除,用于临时操作。

2、持久卷:通过 Kubernetes 的持久卷机制,可以将外部存储卷挂载到 Pod 中,以实现数据的持久化存储。

3、配置存储:用于存储敏感信息的一种资源,比如密码、API 密钥等。通常用于 Pod 的环境变量或者文件中,跨pod共享数据使用,与容器内部数据无关。

6、Pod 的工作方式

6.1 自主式 Pod

自主式 Pod(也称为静态)Pod 是 Kubernetes 中的一种特殊类型的 Pod,它们不受控制器的管理,而是由用户直接创建和管理。这意味着它们不受 ReplicaSet、Deployment 或其他控制器的管理。

自主式 Pod 通常用于特殊用例(测试、开发环境)。

自主式 Pod 如果被删除、即会从集群中彻底删除,不会自动创建。

创建自主式 Pod 的一般步骤:

例子(创建自主式 Nginx Pod):

1、编写 Nginx Pod 的 YAML 配置文件:

sql 复制代码
vim nginx-pod.yaml
sql 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30007
    

注意:nginx-service 将会匹配所有带有 app: nginx 标签的 Pods,并通过 NodePort 30007 将流量转发到这些 Pods 的 80 端口。

2、 将 YAML 文件应用到 Kubernetes 集群:

sql 复制代码
kubectl apply -f nginx-pod.yaml

3. 验证 Pod 是否成功创建:

sql 复制代码
kubectl get pods

kubectl get pods -o wide -l app=nginx


#查看Pod 的详细信息
kubectl describe pod nginx

4. 访问 Nginx Pod:

既然 Service 类型是 NodePort,可以通过任意 Kubernetes 集群节点的 IP 地址加上端口号 30007 来访问 Nginx 服务,如 http://:30007。


5. 验证自主式Pod删除:

sql 复制代码
##删除前面创建的自主式 Nginx Pod

[root@k8s-master test]# kubectl delete pod nginx-pod
pod "nginx-pod" deleted
[root@k8s-master test]#
[root@k8s-master test]# kubectl get pods -o wide -l app=nginx
No resources found in default namespace.
[root@k8s-master test]#

**结论**: 一旦删除自主式 Pod,其状态将无法恢复。在 Kubernetes 中,自主式 Pod 不会被控制器(如 Deployment 或 StatefulSet)所管理,因此删除后无法自动重建。



6.2 监控和管理 Pod

通常在生产环境中,Pod 都会由控制器对象(如 Deployment、StatefulSet、DaemonSet 等)进行管理,以确保高可用性、自动伸缩和故障恢复等功能。 这样做的好处包括能够更灵活地管理 Pod、自动重启失败的 Pod、根据需求扩展或缩减 Pod 数量等。

Kubernetes 会持续监控 Pod 的状态,并确保其处于期望的状态。如果 Pod 发生故障或终止,Kubernetes 将尝试重新启动 Pod,直到它达到期望的状态为止。

1、编写 Nginx Pod 的 YAML 配置文件:

前面的YAML 文件中包含了一个 Pod 和一个 Service 的定义,但没有使用控制器(如 Deployment 或 StatefulSet、Daemonset等)来管理 Pod。

例如:使用Deployment控制器来管理 Pod,修改 前面YAML 文件以包含 Deployment 部分。

sql 复制代码
vim nginx-deployment-service.yaml
sql 复制代码
apiVersion: apps/v1
kind: Deployment # 指定资源的类型,这里是一个 Deployment 资源。
metadata:
  name: nginx-deployment # 设置 Deployment 的名称为 nginx-deployment
spec: # 规格部分,包含了 Deployment 的规格信息
  replicas: 2  # 副本数为 2,表示将会创建 2 个 Pod,可以根据需要进行修改
  selector:
    matchLabels:
      app: nginx # 选择具有 app: nginx 标签的 Pod
  template:
    metadata:
      labels:
        app: nginx  # 为 Pod 设置标签为 app: nginx
    spec:
      containers:
      - name: nginx  # 容器的名称为 nginx
        image: nginx:latest  # 使用最新版本的 nginx 镜像
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service # 设置 Service 的名称为 nginx-service
spec:
  type: NodePort # 设置 Service 的类型为 NodePort,可以通过节点 IP 和节点端口来访问 Service
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80  # Service 监听的端口号为 80
    targetPort: 80  # 将流量转发到 Pod 中的端口号为 80 的容器
    nodePort: 30007  # NodePort 类型的 Service 将会暴露在节点的 30007 端口上,可以通过节点 IP 和该端口来访问 Service

2、 将 YAML 文件应用到 Kubernetes 集群:

sql 复制代码
kubectl apply -f nginx-deployment-service.yaml

3. 验证 Pod 是否成功创建:

sql 复制代码
kubectl get pods

kubectl get pods -o wide -l app=nginx


#查看Pod 的详细信息
kubectl describe pod nginx

5. 验证控制器管理的Pod删除:

测试:当删除一个由控制器(如 Deployment)管理的 Pod 时,控制器将负责维护所需的副本数2。如果删除了一个 Pod,控制器将会检测到并尝试按照定义的副本数重新创建 Pod,以确保所需的 Pod 数量处于正常状态。

sql 复制代码
1、删除 Pod:首先,我们将删除由控制器管理的 Pod nginx-deployment-544dc8b7c4-5s9mk。

kubectl delete pods nginx-deployment-544dc8b7c4-5s9mk

2、验证 Pod 删除:使用以下命令确认 Pod 是否已被删除:

kubectl get pods
sql 复制代码
3、等待 Pod 恢复:等待一段时间,让控制器检测到 Pod 的删除并采取行动。根据配置,可能需要几秒钟或几分钟来重新创建 Pod。

4、确认 Pod 是否已恢复:再次运行以下命令来检查 Pod 是否已被重新创建:

能够看到新的 Pod 正在运行,并且它们的名称与之前的 Pod 不同,因为控制器会为它们生成新的唯一标识符。这表明控制器成功地将被删除的 Pod 替换为新的 Pod。

6.3 Pod 的创建流程


Pod 创建流程

Pod 创建的流程通常包括以下几个步骤:

1、定义 Pod 的 YAML 文件:首先,您需要创建一个 Pod 的描述文件,通常是一个 YAML 文件,其中包含了 Pod 的各种配置信息,比如容器镜像、资源需求、环境变量等。

2、API Server 接收请求:将 Pod 的 YAML 文件提交给 Kubernetes 集群的 API Server。

3、验证和准备:API Server 首先会对 Pod 的描述进行验证,包括格式检查、权限检查等。一旦验证通过,Kubernetes 就会为 Pod 分配一个唯一的标识符。

4、调度器选择节点:接下来,调度器(Scheduler)会根据 Pod 的调度需求(比如资源需求、亲和性和反亲和性规则等)选择一个合适的节点(Node)来运行 Pod。

5、节点拉取镜像:一旦调度器确定了节点,该节点上的容器运行时(比如 Docker 或者 Containerd)将会拉取 Pod 中定义的容器镜像。

6、创建 Pod:容器运行时根据 Pod 的描述信息在节点上创建容器,并且应用相关的配置,比如挂载卷、设置网络等。

7、运行容器:一旦容器创建完成,容器运行时就会启动容器,并且监控容器的运行状态。

8、Pod 状态更新:一旦 Pod 中的容器全部启动成功,Kubernetes 就会更新该 Pod 的状态为"运行中"。

9、监控和自愈:Kubernetes 会持续监控 Pod 的运行状态,如果发现 Pod 出现异常(比如容器崩溃、节点故障等),Kubernetes 会尝试自动修复或者重新创建 Pod。

|---------------------------|
| 💖The End💖点点关注,收藏不迷路💖 |

相关推荐
孔令飞24 分钟前
Go:终于有了处理未定义字段的实用方案
人工智能·云原生·go
玄明Hanko44 分钟前
Quarkus+Docker最全面完整教程:手把手搞定Java云原生
后端·docker·云原生
SimonLiu0091 小时前
清理HiNas(海纳斯) Docker日志并限制日志大小
java·docker·容器
高峰君主4 小时前
Docker容器持久化
docker·容器·eureka
能来帮帮蒟蒻吗4 小时前
Docker安装(Ubuntu22版)
笔记·学习·spring cloud·docker·容器
言之。8 小时前
别学了,打会王者吧
java·python·mysql·容器·spark·php·html5
秦始皇爱找茬12 小时前
docker部署Jenkins工具
docker·容器·jenkins
hoho不爱喝酒14 小时前
微服务Nacos组件的介绍、安装、使用
微服务·云原生·架构
樽酒ﻬق15 小时前
Kubernetes 常用运维命令整理
运维·容器·kubernetes
Golinie16 小时前
Docker底层原理浅析 | namespace+cgroups+文件系统
docker·容器·文件系统·cgroups·unionfs