K8s学习笔记(二):Pod

1 K8s核心资源Pod

1.1 Pod是什么?

官方文档:Pod | Kubernetes

Pod 是 Kubernetes(k8s)中最小的部署与调度单元,并非直接运行容器,而是对一个或多个 "紧密关联" 容器的封装。

核心特点可简单总结为 3 点:

  1. 容器的 "组合包":通常包含 1 个主容器(业务核心,如 Web 服务),也可包含辅助容器(如日志收集、监控代理),所有容器共享 Pod 的资源。
  2. 共享基础环境 :同一 Pod 内的容器共享网络命名空间 (用localhost就能互相通信,无需跨网络)和存储卷(可共用文件目录),相当于 "在同一台迷你主机上运行"。
  3. 短暂且被管理:Pod 本身是 "一次性" 的(故障、重启后会生成新 Pod,IP 会变),不会自行修复,需依赖 k8s 的控制器(如 Deployment、StatefulSet)来管理其创建、扩缩容和故障恢复。


白话解释:

可以把 pod 看成是一个"豌豆荚",里面有很多"豆子"(容器)。一个豌豆荚里的豆子,它们吸收着 共同的营养成分、肥料、水分等,Pod 和容器的关系也是一样,Pod 里面的容器共享 pod 的网络、存储等。

1.1.1 Pod如何管理多个容器

在 Kubernetes 中,Pod 管理多个容器的核心逻辑是 "协同调度、资源共享、生命周期绑定",具体通过以下方式实现:

  1. 共享基础环境

    同一 Pod 内的所有容器共享网络命名空间 (相同的 IP 地址、端口空间)和存储卷(Volume)

    • 网络:容器间可通过localhost直接通信(如localhost:8080访问同一 Pod 内的另一个容器),但需注意端口不冲突;对外表现为一个整体,共享 Pod 的 IP。
    • 存储:Pod 中定义的 Volume(如临时目录emptyDir、持久化存储PersistentVolume)可被所有容器挂载,实现数据共享(如日志容器读取主容器产生的日志文件)。
  2. 生命周期绑定

    多个容器的生命周期与 Pod 强绑定:

    • 同时调度:Pod 被调度到某个节点后,其内所有容器会在同一节点启动。
    • 整体管理:Pod 删除时,所有容器同时终止;Pod 重启(如节点故障重建)时,所有容器重新创建。
    • 重启策略统一:Pod 通过restartPolicy(如AlwaysOnFailure)定义容器故障时的重启规则,适用于所有容器。
  3. 启动与依赖控制

    若容器间有启动顺序或依赖关系,可通过以下机制控制:

    • Init 容器:在应用容器启动前运行的 "初始化容器",完成前置任务(如配置加载、依赖检查),所有 Init 容器成功退出后,应用容器才会启动。
    • 探针(Probe) :通过livenessProbe(存活探针)、readinessProbe(就绪探针)检测容器状态,确保容器按预期运行后再对外提供服务。
  4. 资源隔离与分配

    每个容器可单独设置资源请求(resources.requests)和限制(resources.limits),Pod 会汇总这些需求向 Kubernetes 申请资源,确保容器间资源使用不冲突(如避免某容器耗尽内存影响其他容器)。

1.1.2 Pod网络

Pod 网络核心可总结为:

  • 每个 Pod 有唯一集群内 IP,作为其网络身份;
  • 同一 Pod 内容器共享网络命名空间,通过localhost直接通信;
  • 集群内 Pod 间可直接用 IP 互通(无 NAT),依赖 CNI 插件实现跨节点通信;
  • Pod 访问外部靠节点 SNAT,外部访问 Pod 需通过 Service 作为稳定入口。

1.1.3 Pod存储

创建 Pod 的时候可以指定挂载的存储卷。 POD 中的所有容器都可以访问共享卷,允许这些容器共享数据。 Pod 只要挂载持久化数据卷,Pod 重启之后数据还是会存在的。

1.2 Pod工作方式

在 K8s 中,所有的资源都可以使用一个 yaml 文件来创建,创建 Pod 也可以使用 yaml 配置文件。或者使用 kubectl run 在命令行创建 Pod。

1.2.1 自主式 Pod

所谓的自主式 Pod,就是直接定义一个 Pod 资源,如下:

复制代码
apiVersion: v1
kind: Pod
metadata:
    name: nginx-test
    namespace: default
    labels:
        app: nginx
spec:
    containers:
    - name: nginx
      ports:
      - containerPort: 80
      image: nginx
      imagePullPolicy: IfNotPresent

# 更新资源清单
kubectl apply -f pod-nginx.yaml

# 查看pod是否创建成功
kubectl get pods -o wide -l app=nginx

自主式Pod存在一个问题,加入不小心删除了Pod,那么就彻底被删除了,不会再创建一个新的Pod,这如果在生产环境中有非常大的风险,用控制器管理最好。

bash 复制代码
kubectl delete pods nginx-test

kubectl get pods -l app=nginx
#结果为空说明pod已经被删除了

1.2.2 控制器管理的Pod

常见的管理 Pod 的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。 控制器管理的 Pod 可以确保 Pod 始终维持在指定的副本数运行。 如,通过 Deployment 管理 Pod

bash 复制代码
vim nginx-deploy.yaml

apiVersion: v1
kind: Deployment
metadata:
    name: nginx-test
    labels:
        app: nginx-deploy
spec:
    selector:
        matchLabels:
            app: nginx
    replicas: 2        # 副本数为2
    template:
        metadata:
            labels:
                app: nginx
spec:
    containers:
    - name: my-nginx
      image: nginx
      imagePullPolicy: IfNotPresent
      ports:
      - containerPort: 80

# 更新资源清单文件
kubectl apply -f nginx-deploy.yaml

# 查看Deployment
kubectl get deploy -l app=nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE 
nginx-test 2/2 2 2 16s

#查看 Replicaset
kubectl get rs -l app=nginx 
NAME DESIRED CURRENT READY AGE 
nginx-test-75c685fdb7 2 2 2 71s

#查看 pod
kubectl get pods -o wide -l app=nginx
NAME READY STATUS IP 
nginx-test-85c885fdb7-6d4lx 1/1 Running 10.190.102.69 
nginx-test-85c885fdb7-9s95h 1/1 Running 10.190.102.68

#删除nginx-test-85c885fdb7-9s95h这个 pod

kubectl delete pods nginx-test-85c885fdb7-9s95h
kubectl get pods -o wide -l app=nginx

NAME READY STATUS IP 
nginx-test-85c885fdb7-6d4lx 1/1 Running 10.190.102.69 
nginx-test-85c885fdb7-6s95h 1/1 Running 10.190.102.68

# 发现重新创建了一个新的pod  nginx-test-85c885fdb7-6s95h

通过上面可以发现通过 deployment 管理的 pod,可以确保 pod 始终维持在指定副本数量

相关推荐
呱呱巨基2 小时前
C/C++ 内存管理
c++·笔记·学习
jingling5553 小时前
uniapp | 快速上手ThorUI组件
前端·笔记·前端框架·uni-app
楼田莉子3 小时前
python小项目——学生管理系统
开发语言·python·学习
在路上`4 小时前
前端学习之后端java小白(二)-sql约束/建表
java·sql·学习
真*小白4 小时前
Python语法学习篇(三)【py3】
开发语言·python·学习
lingggggaaaa4 小时前
小迪安全v2023学习笔记(八十二讲)—— Java组件安全&Solr&Shiro&Log4j&CVE复现
笔记·学习·安全
好望角雾眠4 小时前
第四阶段C#通讯开发-1:通讯基础理论,串口,通讯模式,单位转换,代码示例
开发语言·笔记·c#·串口·通讯
不一样的故事1264 小时前
学习Python是一个循序渐进的过程,结合系统学习、持续实践和项目驱动,
开发语言·python·学习