从零理解 Kubernetes Pod:命名空间、生命周期、Pause 容器详解

Kubernetes Namespace、Context 与 Pod 学习

学习环境:K8s 集群,涉及 Namespace、多集群切换、Pod 核心概念、Pod 生命周期、Init 容器、静态 Pod、YAML 语法。

一、Namespace 和 Contexts

Namespace(ns)命名空间,作用是把同一个物理 K8s 集群做逻辑资源隔离,实现多用户 / 多项目资源分组。不同 namespace 资源互相隔离。

1. K8s 默认 4 个命名空间

表格

命名空间 作用
default 不指定 ns 时,资源默认创建到此
kube‑system K8s 系统组件资源
kube‑public 所有用户(未认证)可读
kube‑node‑lease 节点心跳租约,检测节点故障

💡注意:不是所有资源都属于 namespace。pod、service 属于 ns;node、pv、namespace 本身不属于任何命名空间。

2. Namespace 基础管理命令

bash 复制代码
# 查看所有ns
kubectl get ns

# 创建ns
kubectl create ns laoma

# yaml方式创建ns
apiVersion: v1
kind: Namespace
metadata:
  name: laoma
kubectl apply -f ns‑laoma.yaml

# 查看详情
kubectl describe ns laoma

# 删除ns,会删除ns内部全部资源,default/kube‑system不能删除
kubectl delete ns laoma

# 指定ns操作资源 -n
kubectl run web --image=nginx -n laoma
kubectl get pod -n laoma

3. Namespace 切换

方式 1:kubectl 原生命令
bash 复制代码
# 查看当前上下文
kubectl config get‑contexts

# 设置当前上下文默认namespace
kubectl config set‑context --current --namespace=laoma
方式 2:第三方工具 kubens
bash 复制代码
# 安装
wget https://codeload.github.com/ahmetb/kubectx/zip/refs/heads/master -O kubectx.zip
unzip kubectx.zip
cp kubectx‑master/kubens /usr/local/bin/
chmod +x /usr/local/bin/kubens
# bash补全
cp kubectx‑master/completion/kubens.bash /etc/bash_completion.d/
source /etc/bash_completion.d/kubens.bash

# 使用
kubens                     #列出所有ns
kubens kube‑system         #切换ns
kubens -                   #切回上一个ns
kubens -c                  #查看当前ns
方式 3:自定义 shell 脚本

自定义脚本实现 ns 列表展示、切换,笔记内附完整脚本,可放到/usr/local/bin直接调用。

4. ~/.kube/config 集群配置文件

config 文件分为三大块:

  1. clusters:集群信息,集群地址、CA 证书
  2. users:用户证书、私钥
  3. contexts:上下文,绑定【集群 + 用户 + namespace】
  4. current‑context:当前生效上下文

证书字段certificate‑authority-data、client‑certificate-data、client‑key‑data均为 base64 编码。

5. 多集群切换

原生 kubectl
bash 复制代码
# 查看集群
kubectl config get‑clusters
# 查看上下文
kubectl config get‑contexts
# 切换上下文(切换集群)
kubectl config use‑context cluster2‑context
第三方工具 kubectx
bash 复制代码
#安装同kubens
kubectx                    #列出所有上下文
kubectx cluster2‑context   #切换集群上下文
kubectx -                  #切回上一个上下文
kubectx -c                 #查看当前上下文

二、Kubernetes Pod

Pod 是 K8s最小调度单元,一个 Pod 可以封装 1 个或多个容器;Pod 内部容器共享网络 namespace、存储卷,调度到同一台节点。

通俗比喻:Pod 是豌豆荚,容器是豌豆。同一个豌豆荚的豌豆共享资源。

1. Pod 特点

  1. 每个 Pod 分配唯一 PodIP,内部容器共用 IP,容器之间用127.0.0.1通信,端口不能冲突
  2. Pod 内所有容器一起调度、一起销毁
  3. Pod 不直接管理容器,K8s 对 Pod 做完整生命周期管理、重启策略、健康检查

2. Pod 基础操作

bash 复制代码
# --dry-run 只输出yaml,不创建pod
kubectl run web --image=nginx --dry‑run=client -o yaml

#直接创建pod
kubectl run web --image=nginx

#查看pod
kubectl get pod
kubectl get pod -o wide
kubectl get pod web -o yaml
kubectl describe pod web

#查看容器日志,-f实时跟踪
kubectl logs -f web

#进入pod执行命令
kubectl exec web -- hostname
kubectl exec -it web -- bash

#多容器pod,-c指定容器
kubectl exec bbs -c wordpress -- hostname

#文件拷贝:宿主机 ↔ pod
kubectl cp /etc/hosts web:/new‑hosts

#删除pod,默认30s优雅终止 terminationGracePeriodSeconds:30
kubectl delete pod web

#yaml创建pod
kubectl apply -f pod.yaml
kubectl create -f pod.yaml

3. 多容器 Pod 示例

同一个 Pod 运行 mysql+wordpress,内部通过127.0.0.1访问数据库。

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: bbs
spec:
  containers:
  - image: mysql
    name: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123"
    ports:
    - containerPort:3306
  - image: wordpress
    name: wordpress
    env:
    - name: WORDPRESS_DB_HOST
      value: 127.0.0.1
    ports:
    - containerPort: 80

4. Pod 核心字段

bash 复制代码
kubectl explain pod
  • apiVersion:API 版本

  • kind:资源类型 Pod

  • metadata:元数据 name/namespace/labels/annotations

bash 复制代码
spec

:期望状态,重点!
*

复制代码
    containers[]

:业务容器列表(必填)
*

      imagePullPolicy

  镜像拉取策略
  * `Always`总是拉取
  * `Never`只用本地镜像
  * `IfNotPresent`本地优先,没有才拉取(常用)
* command、env、ports、volumeMounts
复制代码
    restartPolicy

重启策略
* `Always`:默认,非 Running 就重启
* `OnFailure`:只有异常退出才重启
* `Never`:绝不重启
  • initContainers[]初始化容器

  • volumes[]存储卷

  • nodeName指定调度节点

  • status:Pod 实际运行状态,只读

5. Pod 常见状态

表格

状态 说明
ContainerCreating 容器创建中
Running 正常运行
Completed 任务执行完成,正常退出
CrashLoopBackOff 容器反复崩溃重启
ErrImagePull / ImagePullBackOff 镜像拉取失败
Error 运行异常错误
Terminating 正在删除销毁

Pod 生命周期由内部所有容器共同决定。

6. Init Containers 初始化容器

  1. 串行执行:多个 init 容器按顺序依次运行,必须全部成功退出(exit 0),才启动业务 containers。
  2. 如果 init 容器失败,kubelet 会根据 restartPolicy 重启 Pod,直到 init 全部成功。
  3. 共享 Pod 的 volume 存储。

典型场景

  • 等待外部服务 / 数据库就绪
  • 预下载代码、初始化配置文件
  • 延迟业务容器启动

pod 状态流转:Init:0/1 → PodInitializing → Running init 失败:Init:Error → Init:CrashLoopBackOff循环。

7. 静态 Pod staticPod

  • 静态 Pod 直接由节点本地 kubelet 管理,不走 apiserver。
  • kubelet 扫描staticPodPath: /etc/kubernetes/manifests目录下 yaml,自动创建 / 删除 pod。
  • kubeadm 部署的 master 组件(etcd、apiserver、scheduler、controller‑manager)就是静态 Pod。
  • 不能通过 Deployment、RC 管理静态 Pod。

不要随意修改 staticPodPath,否则系统组件 yaml 需要同步迁移。

8. 思考题总结

Q1:Pod 和容器区别

容器:底层运行时概念,真正跑进程; Pod:K8s 调度最小单元,容器的封装外壳;提供统一 IP、存储、生命周期管理;支持多容器共存。

Q2:K8s 为什么管理 Pod 而不是直接管理容器
  1. 容器只是进程,缺少调度身份;Pod 提供完整抽象。
  2. 支持多容器协同(sidecar、init 容器),共享网络存储。
  3. 统一生命周期、自愈、扩缩容语义。
  4. 解耦底层 CRI 容器运行时,兼容 containerd/docker 等。
Q3:pause(infra)容器作用

每个 Pod 自动创建 pause 容器:

  1. 创建并持有 Pod 的 network、IPC 命名空间,业务容器加入该命名空间。
  2. 业务容器重启不会销毁网络 namespace,PodIP 保持不变。
  3. Pod 生命周期基石:pause 不死,Pod 网络环境就保留。

比喻:pause 是房东,占好房子(网络命名空间),业务容器是租客,租客可以换,房子不变。

三、YAML 语法(K8s 资源编写基础)

  1. 使用空格缩进,一般 2 空格,不能用 tab;同级缩进对齐。
  2. #为注释符号。
  3. 字符串:一般不用引号;需要也可以单 / 双引号。
  4. 多行字符串
  • |:保留换行符
  • >:换行转为空格,折叠长文本
  1. 字典(mapping):key: value缩进块;也支持{k1:v1,k2:v2}内联(可读性差,尽量少用)
  2. 列表(sequence):‑开头;也支持[a,b,c]内联。

示例:

bash 复制代码
#字典
metadata:
  name: web
  namespace: default

#列表
spec:
  containers:
  - name: web
    image: nginx
相关推荐
川石课堂软件测试2 小时前
涨薪技术|0到1学会性能测试第8课-Analysis分析图
服务器·数据库·python·sql·jmeter·mysql·容器
7177772 小时前
国内 Docker 镜像仓库推荐:Gitee 与主流方案对比及选型指南
docker·容器·gitee
weixin_437961923 小时前
Docker安装(windows)
windows·docker·容器
承渊政道4 小时前
极空间部署Portainer实战:Docker Socket、9000端口、容器管理与固定地址访问
运维·docker·容器·内网穿透·cpolar·portainer
Orchestrator_me4 小时前
k8s网络与应用
网络·python·kubernetes
.冰块.4 小时前
VMware+Ubuntu24.04 kubeadm 部署 K8s 1.30.2 三节点集群
运维·云原生·容器·kubernetes·k8s·容器编排
有为少年4 小时前
容器内存显示 100%、进程莫名被 Killed 解决方案
机器学习·容器·模型训练·模型推理
川石课堂软件测试4 小时前
JMeter异步接口测试实战
数据库·python·jmeter·mysql·kubernetes·测试用例·prometheus
禁默4 小时前
玩客云部署EasyVoice实战:HiNas、Docker、ARMv7、9001与固定地址访问(1)
docker·容器·语音识别·cpolar