【Kubernetes】(五) pod2

目录

[一、Pod 内部结构全景](#一、Pod 内部结构全景)

核心组件深度拆解

[1. 共享网络](#1. 共享网络)

[2. 共享存储(Volumes)](#2. 共享存储(Volumes))

[3. 元数据(Metadata)](#3. 元数据(Metadata))

[二、Pod 核心](#二、Pod 核心)

[1. 创建 Pod](#1. 创建 Pod)

[单容器 Pod](#单容器 Pod)

[多容器 Pod](#多容器 Pod)

[2. 修改 Pod](#2. 修改 Pod)

[3. 删除 Pod](#3. 删除 Pod)

[三、Pod 设计](#三、Pod 设计)

[四、Pod 完整创建流程(从 YAML 到 Running)](#四、Pod 完整创建流程(从 YAML 到 Running))

五、高频面试题解答

Q1:谈谈你对Pod创建过程的理解。


一、Pod 内部结构全景

Pod 是逻辑上的 "容器组",内部由多层结构组成,核心架构如下:

复制代码
元数据层:Name/Namespace/Labels/Annotations
├─ 基础设施层:Pause 容器(Infra 容器,根容器)
├─ 应用容器层:主容器(Main Container)+ Sidecar 容器
└─ 共享资源层:共享网络(IP/端口)+ 共享存储(Volumes)

核心组件深度拆解

1. 共享网络

Pod 内所有容器共享同一个网络命名空间:

共用一个 IP 地址,端口全局唯一(同 Pod 内容器不能监听相同端口)。

容器间可通过 localhost:端口 直接通信,无需跨节点网络,延迟极低。

2. 共享存储(Volumes)

Volume 可挂载到 Pod 内多个容器,实现数据共享:

典型场景:日志生成容器写入 /data/logs,日志转发容器挂载同一目录实时上传,实现 "同生共死" 的数据同步。

3. 元数据(Metadata)

Pod 的 "身份证信息",用于资源管理与调度:

Name:Pod 名称;Namespace:逻辑隔离区;

Labels:键值对标签,是 Service、Deployment 等资源关联 Pod 的核心依据;

Annotations:非查询类注解,用于记录构建时间、作者等辅助信息。

二、Pod 核心

1. 创建 Pod

单容器 Pod

通过 YAML 定义单业务容器 Pod,示例如下:

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: hello
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo "Hello, Pod!" && sleep 3600']
  restartPolicy: OnFailure

执行创建命令:

复制代码
kubectl create -f pod.yml
# 查看日志
kubectl logs mypod
# 查看 Pod 状态
kubectl get pod
多容器 Pod

一个 Pod 可包含多个容器,共享网络与存储,示例:

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  containers:
  - name: hello
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo "Hello, Pods!" && sleep 3600']
  - name: httpd
    image: httpd
    ports:
    - name: web
      containerPort: 80
  restartPolicy: OnFailure

创建后可通过 Pod IP 访问 httpd 服务,验证多容器网络共享。

2. 修改 Pod

两种常用修改方式:

修改 YAML 后应用 :编辑 pod.yml 后执行 kubectl apply -f pod.yml,会根据配置更新 Pod(如重命名、调整容器参数)。

进入容器修改 :通过 kubectl exec -it <pod名> -c <容器名> -- /bin/bash 进入容器,直接修改容器内内容(如修改 httpd 首页)。

3. 删除 Pod

批量删除默认命名空间下所有 Pod:

复制代码
kubectl delete pod --all

执行后通过 kubectl get pod 验证,会返回 No resources found in default namespace.,确认删除完成。

三、Pod 设计

K8s 设计 Pod 而非直接操作容器,核心原因:

亲密关系封装:为必须部署在一起、共享资源、生命周期一致的程序提供统一调度单元。

容器 runtime 抽象 :为容器提供统一的 "环境外壳",让 K8s 无需关心底层是 Docker、containerd 还是 Podman,实现统一调度。一句话总结:Pod 是一个逻辑主机,为容器提供共享的网络、存储和唯一身份

四、Pod 完整创建流程(从 YAML 到 Running)

Pod 的创建是 K8s 各组件协同的完整链路,步骤如下:

请求提交 :用户执行 kubectl apply -f pod.yml,kubectl 将 YAML 转换为 JSON 格式,发送给 API Server。

API Server 校验 :API Server 完成认证、授权、准入控制,校验通过后将 Pod 信息存入 etcd,此时 Pod 状态为 Pending

Scheduler 调度 :Scheduler 监听 Pending 状态的 Pod,先通过 ** 预选(Predicates)排除资源不足 / 不匹配的节点,再通过优选(Priorities)** 为剩余节点打分,选择最优节点,将调度结果更新到 etcd。

Kubelet 初始化容器:目标节点的 Kubelet 监听到分配给自己的 Pod,调用:CRI(容器运行时接口):拉取镜像、创建容器;CNI(容器网络接口):配置网络、分配 Pod IP;CSI(容器存储接口):挂载存储卷。

状态同步 :容器启动后,Kubelet 持续监控健康状态,将 Pod 状态更新为 Running 上报给 API Server,API Server 同步到 etcd。

结果验证 :用户执行 kubectl get pods,即可看到 Pod 处于正常运行状态。

五、高频面试题解答

Q1:谈谈你对Pod创建过程的理解。

A: 用户通过 kubectl apply -f pod.yaml 提交 Pod 创建请求,kubectl 会将 YAML 文件转换为 API Server 能识别的 JSON 格式,再发送给 API Server。API Server 收到请求后,会依次完成认证、授权、准入控制(检查权限和资源配额),校验通过后将 Pod 信息存入 etcd 数据库,此时 Pod 状态为 Pending。Scheduler 通过监听机制发现处于 Pending 状态的 Pod,先通过预选(Predicates)排除资源不足或不匹配的节点,再通过优选(Priorities)为剩余节点打分,最终选择最优节点。调度结果会返回给 API Server,并更新到 etcd 中。目标节点上的 Kubelet 通过监听机制发现 Pod 已分配给自己,便调用 CRI(拉取镜像、创建容器)、CNI(配置网络、分配 IP)和 CSI(挂载存储卷)完成容器初始化。容器启动后,Kubelet 会持续监控健康状态,并将 Pod 状态更新为 Running 上报给 API Server,API Server 再将状态同步到 etcd。此时,通过 kubectl get pods 就能看到 Pod 处于正常运行状态。

相关推荐
刘某的Cloud1 小时前
docker commit 封装镜像
运维·docker·容器·image
哇哦9822 小时前
渗透安全(渗透防御)②
linux·安全·渗透防御
古城小栈2 小时前
Docker 下配置 Pgsql 主从复制详细步骤指南
运维·docker·容器
雨奔2 小时前
Kubernetes 对象标识详解:Name、UID、Label
云原生·容器·kubernetes
chao_6666663 小时前
AI coding 代码开发规范
linux·运维·服务器
xiaobangsky3 小时前
Linux SMB/CIFS 网络挂载配置指南
linux·运维·网络
wang09073 小时前
Linux性能优化之内存管理基础知识
java·linux·性能优化
杰 .3 小时前
闲暇时刻对LinuxOS的部分理解(一)
linux·服务器
摩斯电码3 小时前
深入 perf 第二版(二):用原始事件编号解锁 CPU 的隐藏指标
linux·性能优化