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💖点点关注,收藏不迷路💖 |

相关推荐
昌sit!3 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis6 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
wclass-zhengge7 小时前
Docker篇(Docker Compose)
运维·docker·容器
茶馆大橘7 小时前
微服务系列五:避免雪崩问题的限流、隔离、熔断措施
java·jmeter·spring cloud·微服务·云原生·架构·sentinel
北漂IT民工_程序员_ZG7 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
coding侠客7 小时前
揭秘!微服务架构下,Apollo 配置中心凭啥扮演关键角色?
微服务·云原生·架构
梦魇梦狸º10 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
南猿北者13 小时前
docker镜像仓库常用命令
运维·docker·容器
2301_8061313614 小时前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes
SilentCodeY14 小时前
containerd配置私有仓库registry
容器·kubernetes·containerd·镜像·crictl