本文最后更新于2 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、Namespace(命名空间)
1. 概念
Namespace 是 K8s逻辑隔离、资源分组机制。
✅只隔离资源对象(Pod、Deployment、Service),默认不隔离网络;不同 namespace 的 Pod 默认可以互相访问,想要网络隔离需要配置
NetworkPolicy。❗Namespace 是逻辑概念,不绑定 Node,同一个 namespace 的 Pod 可以分布在不同节点。
类比:集群是一栋办公楼,Namespace 是独立办公室;办公室互相隔开,但是共用大楼水电(集群底层硬件)。
区分:K8s Namespace(集群逻辑隔离)≠ Linux 内核 Namespace(容器底层进程 / 网络隔离)
2.K8s 内置 4 个命名空间
| 命名空间 | 作用 |
|---|---|
default | 默认命名空间,不指定-n,资源全部创建在此 |
kube-system | 集群系统组件 Pod,禁止放业务应用 |
kube-public | 集群公开可读资源,未认证用户也可读 |
kube-node-lease | 节点心跳 Lease 对象,实现轻量级节点健康检测,减轻 apiserver 压力,用户一般不操作 |
3. 命名空间操作命令
# 查看所有命名空间
kubectl get ns
# 命令式创建namespace
kubectl create namespace development
# yaml声明式创建ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: development
# 应用yaml
kubectl apply -f ns.yaml
二、Pod 核心概念
Pod 是 K8s 最小部署、调度单元!不是容器!
Pod = 容器组,一个 Pod 可以包含1 个或者多个业务容器。
1.Pod 核心特性
- 同生共死:Pod 内全部容器调度到同一个 Node,一起创建、一起销毁。
- 共享网络栈:整个 Pod 共用同一个 Pod‑IP,Pod 内部容器之间可以直接用
localhost通信。 - 共享存储 Volume:Pod 级别挂载卷,所有容器可以读写同一份文件。
- 不可变性:Pod 创建完成,不能修改容器配置;更新需要新建 Pod 替换旧 Pod。
2.Pod 两种使用模式
①单容器 Pod(最常用)
一个 Pod 里面只有 1 个业务容器;Pod 充当容器的包装外壳。
场景:普通微服务 Nginx、Java 后端。
②多容器 Pod
同一个 Pod 多个紧密协作容器。
- Sidecar 边车容器:辅助主容器,日志收集、监控代理,不侵入业务。
- Init 容器:主容器启动之前执行初始化任务(等待数据库、生成配置文件)
- 临时调试容器:故障排查调试使用
注意:只有高度耦合、需要本地高频通信的容器才放同一个 Pod;普通微服务分开不同 Pod。
3.Pod 内部共享环境
Pod 内容器共享:
- Linux 命名空间:Network、IPC、UTS;PID 命名空间不共享
- cgroups:统一对整个 Pod 做 CPU、内存资源限制
- Volume 存储卷,实现文件共享
Pod 内部容器三种通信方式:
- localhost网络通信(共享网络命名空间)
- IPC 进程间通信(消息队列、共享内存)
- 共享 Volume 文件读写
4.Pause(基础设施 / 根容器)⭐面试重点
每一个 Pod 都会最先启动 pause 容器,业务容器后启动。
- 作用:
- 创建 Pod 级别的 Network、IPC、UTS 命名空间。
- 业务容器加入 pause 创建的命名空间,从而实现 Pod 内容器共享同一个 IP、网络栈。
- Pause 生命周期 = Pod 生命周期;pause 死,整个 Pod 销毁。
- 工作流程
创建Pod → 启动Pause容器 → 创建各类Linux命名空间 → 业务容器加入命名空间 → 实现网络与IPC共享
类比:Pause 是公寓物业,先建好水电网络;业务容器是住户,直接入住使用公共设施。
三、Pod 的两种创建方式
1. 命令式 kubectl run
kubectl run my‑pod --image=nginx:1.27.1 -n default
2.YAML 声明式(生产推荐)
YAML 语法要点:
- 缩进只用空格,禁止 Tab,一般 2 空格;
:、-符号后面必须加空格;---分割多个资源;#注释。
Pod 完整 yaml 模板
apiVersion: v1 # 核心资源固定v1版本
kind: Pod # 资源类型Pod
metadata:
name: my‑nginx‑pod # Pod名称,ns内唯一
labels: # 标签key:value
app: web
env: test
spec:
containers: # 容器列表,数组用"-"
- name: nginx‑c
image: nginx:1.27.1
imagePullPolicy: IfNotPresent #镜像拉取策略
ports:
- containerPort: 80 #容器监听端口
多容器 Pod yaml 示例
apiVersion: v1
kind: Pod
metadata:
name: multi‑pod
spec:
containers:
- name: nginx‑c
image: nginx:1.27.1
ports:
- containerPort:80
- name: busybox‑c
image: busybox:1.36
command: ["sleep","3600"]
kubectl create 与 kubectl apply 对比⭐
| 特性 | kubectl create | kubectl apply |
|---|---|---|
| 类型 | 命令式 | 声明式(生产首选) |
| 幂等性 | ❌非幂等,资源已存在直接报错 | ✅幂等,可重复执行 |
| 行为 | 只做创建,不能更新 | 创建;修改 yaml 后自动更新资源 |
| 适用场景 | 临时测试 | 生产环境、CI/CD、GitOps |
kubectl create -f pod.yaml #资源存在直接报错
kubectl apply -f pod.yaml #推荐,存在就更新,不存在创建
四、kubectl 核心命令大全
1. 查询类
kubectl get pods #查看pod基础状态
kubectl get pods -o wide #显示PodIP、节点名等更多信息
kubectl get pod <podname> -n ns‑name #指定命名空间查看
kubectl get ns #查看命名空间
kubectl api‑resources #查看所有k8s资源
# 查看标签
kubectl get pod --show‑labels
#标签过滤资源
kubectl get pod -l app=web
2. 排错诊断 describe
重点!看 Pod 事件,定位 Pod 启动失败、镜像拉取失败原因
kubectl describe pod pod‑name -n ns
3. 日志 logs
kubectl logs pod‑name #查看日志
kubectl logs -f pod‑name #实时跟踪日志 tail‑f
kubectl logs --tail=100 pod‑name #最近100行
kubectl logs --since=10m pod‑name #最近十分钟日志
#多容器Pod,指定容器看日志
kubectl logs pod‑name -c container‑name
#全部容器日志
kubectl logs pod‑name --all‑containers=true
#根据标签批量看日志
kubectl logs -f -l app=web
4. 调试 exec 进入容器
#进入pod(单容器)
kubectl exec -it pod‑name -- /bin/bash
#多容器,指定容器进入
kubectl exec -it pod‑name -c nginx‑c -- /bin/bash
#指定命名空间
kubectl exec -it pod‑name -n dev -- /bin/bash
5. 删除资源
kubectl delete pod pod‑name
kubectl delete -f pod.yaml
6. 标签 label 操作
#给pod新增/修改标签
kubectl label pod my‑pod env=prod
#删除标签 加"-"
kubectl label pod my‑pod env‑
7. 底层容器工具 crictl /ctr
containerd 工具,节点上直接管理镜像、容器(不经过 k8s)
crictl images #查看节点本地镜像
crictl rmi <image‑id> #删除镜像
#ctr是containerd自带,指定k8s.io命名空间
ctr -n=k8s.io images import xxx.tar #导入镜像
日常 K8s 节点运维优先:crictl