【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 处于正常运行状态。

相关推荐
To_OC12 小时前
跑了3个Docker容器后,我终于搞懂镜像和容器到底啥关系
后端·docker·容器
comedate13 小时前
Windows / Linux GPU 虚拟内存布局差异与 CUDA 越界访问行为
linux·windows·mmu·cuda 越界访问
暴力求解14 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
ltl15 小时前
mTLS 工程实践:服务间双向认证怎么落地
kubernetes
ltl15 小时前
序列化格式深度对比:Protobuf、FlatBuffers、Cap’n Proto
linux
lengjingzju15 小时前
编译与调试完全指南—第17章 总结
linux
ltl15 小时前
容器网络性能真相:veth vs macvlan vs eBPF 数据面
linux
tryCbest16 小时前
Docker 从零到精通:知识与跨平台使用指南
docker·容器
我不会插花弄玉16 小时前
9.进程间通信(上)【由浅入深-Linux】
linux·共享内存·进程通信
CSDN1211017 小时前
麒麟 V10 安装 Node-RED、IEC 104 协议插件及界面汉化
linux·编辑器·vim