K8s 命名空间与 Pod 入门:从概念到实战

K8s 命名空间与 Pod 入门:从概念到实战

刚接触 Kubernetes 时,Namespace 和 Pod 是两个绕不开的核心概念。这篇文章把它们一次性讲透:Namespace 怎么隔离资源、Context 怎么切换集群、Pod 到底是什么、怎么管理生命周期,以及 YAML 语法的速查手册。

一、Namespace:集群里的 "房间号"

1.1 为什么需要 Namespace

一个物理 K8s 集群可能被多个团队共用,大家创建的 Pod、Service 混在一起会很乱。Namespace 就是把一个大集群逻辑划分成多个独立空间,不同空间里的资源互相隔离、互不干扰。

K8s 默认自带四个 Namespace:

Namespace 用途
default 默认命名空间,不指定时资源都放这里
kube-system K8s 系统组件运行的地方
kube-public 所有用户都能读的公开资源
kube-node-lease 节点心跳检测用

注意:不是所有资源都属于 Namespace。Node、PV 这类底层资源是全局的,不在任何 Namespace 里。

1.2 常用操作

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

# 创建 Namespace
kubectl create ns laoma

# 删除 Namespace(会连带删掉里面所有资源)
kubectl delete ns laoma

# 在指定 Namespace 里创建资源
kubectl run web --image=nginx -n laoma

用 YAML 创建:

复制代码
apiVersion: v1
kind: Namespace
metadata:
  name: laoma
kubectl apply -f ns-laoma.yaml

二、Context:一键切换集群和身份

2.1 Context 是什么

如果你管理多个集群(测试集群、生产集群),每个集群的地址、账号、证书都不一样。Context 就是把 "去哪个集群 + 用哪个账号 + 默认进哪个 Namespace" 打包成一个组合,一键切换。

配置文件在 ~/.kube/config,核心结构:

复制代码
clusters:        # 集群地址和 CA 证书
users:           # 用户证书和私钥
contexts:        # 上下文 = 集群 + 用户 + Namespace
current-context: # 当前在用哪个

2.2 常用命令

复制代码
# 查看所有上下文
kubectl config get-contexts

# 切换上下文
kubectl config use-context cluster2-context

# 修改当前上下文的默认 Namespace
kubectl config set-context --current --namespace=laoma

kubens /kubectx 工具:

第三方工具可以大幅简化切换操作,输入名字直接切:

复制代码
kubens kube-system     # 切 Namespace
kubectx cluster2      # 切集群

三、Pod:K8s 最小调度单元

3.1 Pod 是什么

Pod 是 K8s 里最小的运行单元,相当于一个 "豌豆荚",里面装着一个或多个容器。

关键特性:

  • 一个 Pod 有独立 IP 地址

  • Pod 里的容器共享网络和存储

  • 容器之间可以用 localhost 互相访问

  • 整个 Pod 被调度到同一台节点上

3.2 为什么 K8s 不直接管容器

这是新手最常问的问题。答案是:

  1. 容器太原子,没有统一的身份和生命周期管理

  2. 多容器协同是常见需求(业务容器 + 日志 Sidecar + 初始化容器)

  3. 统一自愈和扩缩容需要一个标准单元

  4. 解耦运行时,屏蔽 Docker /containerd 的差异

3.3 Pod 里的 pause 容器

每个 Pod 启动时,第一个跑起来的是 pause 容器(也叫 infra 容器)。它的作用是 "占坑":

  • 持有 Pod 的网络命名空间和 IP

  • 业务容器重启时,网络和 IP 保持不变

  • 所有业务容器都加入 pause 的网络命名空间

形象比喻:pause 是房东,Pod 是房子,业务容器是租客。租客换了一波又一波,房子一直在。

四、Pod 基本操作

4.1 创建 Pod

复制代码
# 命令行直接创建
kubectl run web --image=nginx

# 先看 YAML 模板(不真正创建)
kubectl run web --image=nginx --dry-run=client -o yaml

# 用 YAML 文件创建
kubectl apply -f web.yaml

最小 YAML 示例:

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: web
  labels:
    run: web
spec:
  containers:
  - image: nginx
    name: web

4.2 查看与调试

复制代码
# 查看 Pod 列表
kubectl get pod

# 详细信息
kubectl describe pod web

# 查看日志
kubectl logs -f web

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

# 拷贝文件到 Pod
kubectl cp /etc/hosts web:/new-hosts

4.3 删除 Pod

复制代码
kubectl delete pod web

删除时有 30 秒优雅终止时间(terminationGracePeriodSeconds),给容器发完信号再强制杀。

五、多容器 Pod

一个 Pod 里可以跑多个容器,它们共享网络和存储。典型场景:WordPress + MySQL 跑在同一个 Pod 里。

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

多容器 Pod 里执行命令,要用 -c 指定容器名:

复制代码
kubectl exec bbs -c wordpress -- hostname
kubectl exec bbs -c mysql -- mysql -uroot -p123

六、Pod 生命周期与重启策略

6.1 Pod 常见状态

状态 含义
ContainerCreating 正在拉镜像、启动容器
Running 正常运行
Completed 容器执行完正常退出
Error 运行出错
CrashLoopBackOff 反复崩溃重启
ImagePullBackOff 拉镜像失败,重试中
Terminating 正在删除中

6.2 重启策略 restartPolicy

策略 行为
Always 总是重启(默认值)
OnFailure 只有出错才重启
Never 从不重启

重启策略作用于整个 Pod 的所有容器,只要有一个容器满足条件就重启。

6.3 镜像拉取策略 imagePullPolicy

策略 行为
Always 每次都拉最新镜像
Never 只用本地镜像
IfNotPresent 本地有才用本地,没有才拉

七、Init Containers

Init 容器是在业务容器之前串行执行的特殊容器,全部成功退出后才启动业务容器。

典型用途:

  • 等待某个 Service 创建完成

  • 等待固定时间再启动应用

  • 初始化配置文件或克隆代码

    spec:
    initContainers:
    - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do sleep 2; done']
    containers:
    - name: myapp
    image: busybox

Pod 状态变化会显示 Init:0/1 → PodInitializing → Running。

八、静态 Pod

Master 节点上的 kube-apiserver、etcd 这些组件是谁管的?答案是 kubelet 直接管理的静态 Pod。

静态 Pod 的 YAML 文件放在 /etc/kubernetes/manifests/ 目录下,kubelet 会定期扫描这个目录,自动创建和删除 Pod。

特点:

  • 由本地 kubelet 管理,不经过 API Server 调度

  • 不能和 Deployment / DaemonSet 关联

  • Master 上的核心组件都是静态 Pod

九、YAML 语法速查

写 K8s YAML 必须掌握的基础语法:

9.1 基本规则

  • 用 2 个空格缩进,不能用 Tab

  • 同级元素缩进量相同

  • 开头是注释

9.2 字典(键值对)

复制代码
user:
  name: laoma
  uid: 1088

9.3 列表(数组)

复制代码
containers:
- name: web1
  image: nginx
- name: web2
  image: httpd

9.4 多行字符串

复制代码
# | 保留换行
msg: |
  第一行
  第二行

# > 换行合并成一行
msg: >
  这是一段很长的文字,
  会被合并成一句话。

十、小结

这篇文章覆盖了 K8s 入门的两大核心模块:

  • Namespace + Context:资源隔离和多集群切换的基础

  • Pod:最小调度单元的概念、操作、生命周期和多容器模式

理解了这些,后面学 Deployment、Service、Ingress 就只是在 Pod 外面包一层管理逻辑而已。下一篇继续深入 Deployment 和 Service。

相关推荐
牧瀬クリスだ40 分钟前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
小张成长计划..44 分钟前
【Linux】26:线程互斥和同步
java·开发语言
邪修king3 小时前
Re:Linux 系统篇(三十五):进程间通信Chapter2:从匿名管道到进程池:Linux 进程间通信实战(深度理解「先描述,再组织」)
java·linux·运维
拆房老料4 小时前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
张张123y5 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
曹牧9 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头9 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记10 小时前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
紧跟先前的步伐10 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang