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 不直接管容器
这是新手最常问的问题。答案是:
-
容器太原子,没有统一的身份和生命周期管理
-
多容器协同是常见需求(业务容器 + 日志 Sidecar + 初始化容器)
-
统一自愈和扩缩容需要一个标准单元
-
解耦运行时,屏蔽 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。