一、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 laoma
1.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.yaml
3.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 资源。
思维导图
