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

相关推荐
孪生质数-7 小时前
AI 应用实践篇——让大模型真正开始工作
linux·运维·服务器·人工智能·深度学习·语言模型·llama
2301_777998347 小时前
Linux线程同步与互斥(三):信号量与环形队列实现生产者消费者模型
linux·c语言·c++
潘正翔7 小时前
k8s进阶_Harbor镜像仓库
git·云原生·容器·kubernetes·gitee·github
江湖有缘7 小时前
Docker实战 | 使用Docker部署Donetick任务与家务管理应用
运维·docker·容器
实心儿儿7 小时前
Linux —— 应用层协议HTTP
linux·网络·http
小张同学a.8 小时前
LAMP架构2
linux·运维·网络·架构·负载均衡
千河殇 多想和她9 小时前
如何在Reaonix中使用CodeGraph以及CodeGraph效果实测经验分享
linux·运维·ubuntu
键盘鼓手苏苏9 小时前
AI 音频生成流水线:异步任务要有进度和取消
云原生·kubernetes·k8
躺不平的理查德9 小时前
CMAKE备忘录
linux·运维·服务器
雨辰AI9 小时前
K8s 达梦数据守护集群部署|容器化高可用生产落地指南
云原生·容器·kubernetes