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 文件分为三大块:
clusters:集群信息,集群地址、CA 证书users:用户证书、私钥contexts:上下文,绑定【集群 + 用户 + namespace】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 特点
- 每个 Pod 分配唯一 PodIP,内部容器共用 IP,容器之间用
127.0.0.1通信,端口不能冲突 - Pod 内所有容器一起调度、一起销毁
- 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 初始化容器
- 串行执行:多个 init 容器按顺序依次运行,必须全部成功退出(exit 0),才启动业务 containers。
- 如果 init 容器失败,kubelet 会根据 restartPolicy 重启 Pod,直到 init 全部成功。
- 共享 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 而不是直接管理容器
- 容器只是进程,缺少调度身份;Pod 提供完整抽象。
- 支持多容器协同(sidecar、init 容器),共享网络存储。
- 统一生命周期、自愈、扩缩容语义。
- 解耦底层 CRI 容器运行时,兼容 containerd/docker 等。
Q3:pause(infra)容器作用
每个 Pod 自动创建 pause 容器:
- 创建并持有 Pod 的 network、IPC 命名空间,业务容器加入该命名空间。
- 业务容器重启不会销毁网络 namespace,PodIP 保持不变。
- Pod 生命周期基石:pause 不死,Pod 网络环境就保留。
比喻:pause 是房东,占好房子(网络命名空间),业务容器是租客,租客可以换,房子不变。
三、YAML 语法(K8s 资源编写基础)
- 使用空格缩进,一般 2 空格,不能用 tab;同级缩进对齐。
#为注释符号。- 字符串:一般不用引号;需要也可以单 / 双引号。
- 多行字符串
|:保留换行符>:换行转为空格,折叠长文本
- 字典(mapping):
key: value缩进块;也支持{k1:v1,k2:v2}内联(可读性差,尽量少用) - 列表(sequence):
‑开头;也支持[a,b,c]内联。
示例:
bash
#字典
metadata:
name: web
namespace: default
#列表
spec:
containers:
- name: web
image: nginx