一、Namespace 命名空间
1.1 概念
Namespace(ns)用于逻辑隔离集群资源,把同一个物理集群划分多个逻辑资源组;同 ns 资源互通,不同 ns 资源逻辑隔离。
注意:
- Pod、Service、PVC 属于命名空间资源;Node、PV、Namespace 本身不属于任何 namespace。
- 集群内置 4 个 namespace
表格
命名空间 作用 default不指定‑n 时资源默认创建到此 ns kube‑systemK8s 系统组件资源 kube‑public所有用户可读 kube‑node‑lease节点心跳租约,检测节点故障
1.2 Namespace 管理命令
#查看所有ns kubectl get ns #创建ns kubectl create ns laoma #yaml方式创建ns kubectl apply -f ns‑laoma.yaml #查看ns详情yaml kubectl get ns laoma -o yaml #描述namespace kubectl describe ns laoma #删除namespace:会删除ns内部全部资源,default/kube‑system不可删除 kubectl delete ns laoma #操作指定命名空间资源,‑n指定ns kubectl run web --image=nginx -n laoma kubectl get pod -n laoma1.3 切换 Namespace
- 原生 kubectl config 方式
#查看当前上下文 kubectl config get‑contexts #设置当前上下文默认namespace kubectl config set‑context --current --namespace=laoma- 第三方工具 kubens(简化 ns 切换)
#安装:解压kubectx项目,拷贝kubens到/usr/local/bin,配置bash补全 kubens #列出所有namespace kubens kube‑system #切换到指定ns kubens - #切回上一个ns kubens -c #打印当前ns二、Context 上下文 & kubeconfig 配置文件
文件路径:
~/.kube/config,保存集群地址、证书、用户、上下文信息,kubectl凭此访问集群。
2.1 kubeconfig 三大组成部分
clusters:集群列表,集群 API 地址、CA 证书。users:用户身份,客户端证书 / 私钥。contexts上下文:绑定 cluster + user + namespace;current‑context标记当前使用的上下文。
2.2 多集群切换
- 原生命令
kubectl config get‑clusters #查看集群 kubectl config get‑contexts #查看上下文,*代表当前生效 kubectl config use‑context cluster2‑context #切换上下文(切换集群)- 第三方工具 kubectx(切换集群 / 上下文)
kubectx #列出全部context kubectx cluster1‑context #切换到指定上下文 kubectx - #回到上一个context kubectx -c #打印当前上下文名称配置文件可以手动编写多集群 kubeconfig,通过环境变量
KUBECONFIG指定配置文件路径。
三、Pod 核心
Pod 是 K8s 最小调度、管理单元;Pod 封装一个或多个容器。 类比豌豆荚:Pod 是豌豆荚,容器是豌豆;同一个 Pod 内所有容器共享网络 namespace、共享存储卷,调度到同一个节点。 Pod 分配独立 PodIP;Pod 内部容器用
127.0.0.1互相通信。
3.1 Pod 基础管理命令
#--dry‑run 只输出yaml,不创建资源 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 #显示podIP、节点 kubectl get pod web -o yaml #输出yaml完整资源定义 kubectl describe pod web #查看pod事件、详细状态 kubectl logs -f web #查看pod容器日志,‑f实时跟踪 #进入pod执行命令 kubectl exec web -- hostname kubectl exec -it web -- bash #pod与宿主机拷贝文件 kubectl cp /etc/hosts web:/new‑hosts #删除pod,terminationGracePeriodSeconds默认30秒优雅终止 kubectl delete pod web #yaml文件创建pod kubectl apply -f web.yaml kubectl create -f web.yaml3.2 多容器 Pod
同一个 Pod 运行多个容器;共享网络、共享 volume 存储,运行在同一节点。
- 适用:业务容器 + sidecar 辅助容器(日志采集、代理)。
- 多容器 pod 执行命令,需要
‑c指定容器名称
kubectl exec bbs -c wordpress -- hostname实验示例:一个 pod 同时运行 mysql + wordpress,内部使用 127.0.0.1 访问数据库。
3.3 Pod 关键 yaml 属性
metadata元数据:name、namespace、labels标签、annotations 注解。spec期望规格containers[]:业务容器数组,必填。image镜像;name容器名;imagePullPolicy镜像拉取策略Always总是拉取镜像;Never只使用本地镜像,不拉取;IfNotPresent:本地有就用本地,没有才拉取(常用)。
command / args:覆盖容器镜像入口命令;env环境变量;volumeMounts挂载卷。
restartPolicy容器重启策略,对 pod 内全部容器生效Always:总是重启(pod 默认);OnFailure:异常退出(非 0 返回码)才重启;Never:绝不重启。
initContainers[]初始化容器- 串行依次执行,全部 0 退出成功,才启动业务 containers;
- 任意 init 容器失败,pod 会根据重启策略重启,直到 init 全部成功;
- 场景:等待依赖服务、准备文件、初始化配置。
volumes定义存储卷。
status:Pod 实际运行状态,由 k8s 实时填充,写 yaml 不需要写 status。
3.4 Pod 常见状态
表格
| 状态 | 含义 |
|---|---|
ContainerCreating | 容器正在创建拉取镜像 |
Running | 全部容器正常运行 |
Completed | 容器正常退出,任务完成 |
Error | 容器异常退出 |
CrashLoopBackOff | 容器反复崩溃重启 |
ErrImagePull / ImagePullBackOff | 镜像拉取失败 |
Terminating | pod 正在删除终止 |
3.5 静态 Pod
- 普通 Pod:通过 apiserver 创建,master 管控。
- 静态 Pod:由节点本机 kubelet 直接管理,不经过 apiserver。
- kubelet 读取目录
/etc/kubernetes/manifests/*.yaml;检测文件变化自动创建 / 删除 pod。 - K8s 控制平面组件
kube‑apiserver、etcd、scheduler、controller‑manager就是 master 节点上的静态 Pod。 - 不能通过 kubectl delete 直接删除静态 pod;需要删除 manifest 目录下 yaml 文件。
- kubelet 读取目录
3.6 三个核心思考题
- Pod 和容器区别?
- 容器:底层运行时概念(containerd/docker),是进程隔离运行环境。
- Pod:K8s 独有的最小调度管理单元,是容器的封装外壳;提供独立 PodIP、共享网络、共享存储、重启策略、健康检查;一个 Pod 可以包含一个或多个容器。
- 为什么 K8s 管理 Pod,而不直接管理容器?①支持多容器协同(业务 + sidecar、init 容器),共享网络存储,必须调度到同一节点; ②Pod 提供统一抽象:生命周期、重启自愈、资源、健康检查; ③解耦底层 CRI 容器运行时,兼容 docker/containerd/cri‑o。
- pause(infra)容器作用?每个 Pod 自动启动 pause 容器,Pod 基石。 ①创建、持有 Pod 的 network、IPC 命名空间;业务容器加入 pause 的 namespace,实现多容器共享同一个 PodIP; ②pause 容器保持不退出,业务容器反复重启,Pod 网络 / IP 不销毁; ③实现 Pod 内部容器localhost互通。
比喻:pause 是房东,占好房子(网络命名空间),业务容器是租客,可以更换租客,房子不变。
四、YAML 语法规范(K8s 资源文件使用)
- 缩进:只能空格,禁止 Tab;一般 2 空格缩进;同级缩进对齐。
- 注释:
#,# 前面要有空格。 - 字符串:一般不需要引号;特殊字符可单 / 双引号。
- 多行字符串
|保留换行;>换行替换为空格,折叠长文本。
- 字典(mapping):键:值,冒号后面必须空格;也支持
{k1:v1,k2:v2}内联(不推荐)。 - 列表(sequence):
‑横线开头表示数组项;也支持[a,b,c]内联,可读性差尽量不用。 ---用来分割多个 yaml 文档,一个文件写多个 k8s 资源。