
从 Namespace 到 PodKubernetes 资源隔离与工作负载入门实战附 kubens/kubectx 一键切换摘要本文系统梳理 Kubernetes 中 Namespace 资源隔离、多集群 Context 切换、Pod 生命周期三大核心知识点覆盖 kubectl 常用命令、kubens/kubectx 第三方工具、多容器 Pod、Init Container、静态 Pod 等实战内容所有命令均经过 Ubuntu 24.04 containerd 环境验证适合初学 K8s 的同学作为笔记与面试复习材料。一、Namespace把一个物理集群切成多个逻辑集群1.1 为什么需要 Namespace多个用户共用同一个 Kubernetes 集群时如何把他们创建的资源隔离开答案就是Namespace简写 ns也叫 project。它把一个物理 Cluster 在逻辑上划成多个资源集合不同 Namespace 里的资源完全隔离。1.2 K8s 默认创建的 4 个 NamespaceNamespace作用谁在用default不指定 ns 时资源默认落这里普通用户kube-systemK8s 自己创建的系统资源DNS、CNI、Dashboard 等kube-public所有用户含未认证可读一般很少用kube-node-lease存放 Lease 对象kubelet 发心跳控制平面检测节点故障1.3 思考所有对象都属于 Namespace 吗不是。Pod、Service、PVC 等属于某个 Namespace但Namespace 本身、Node、PersistentVolume 是集群级资源不属于任何 Namespace。二、Namespace 常用管理命令# 查看 Namespace 清单rootmaster30:~# kubectl get nsNAME STATUS AGE default Active 4d8h kube-node-lease Active 4d8h kube-public Active 4d8h kube-system Active 4d8h# 查看某个 Namespace 的 YAML 定义rootmaster30:~# kubectl get ns default -o yamlapiVersion: v1# 资源所属API版本Namespace属于核心v1组kind: Namespace# 资源类型命名空间metadata: creationTimestamp:2026-10-16T06:14:16Z# 创建时间UTC时区labels: kubernetes.io/metadata.name: default# 系统内置标签标识ns名称name: default# 命名空间名字resourceVersion:41# 资源版本号etcd每更新一次就递增用于并发控制uid: 761a957a-01ea-467e-b86d-5fb3a17e9795# 全局唯一IDspec: finalizers: - kubernetes# 终结器删除ns时先清理ns内所有资源再删除ns本身status: phase: Active# 状态Active正常可用# 创建 Namespace命令式rootmaster30:~# kubectl create ns fb# 直接编辑 Namespacerootmaster30:~# kubectl edit ns fb# 查看 Namespace 详细信息rootmaster30:~# kubectl describe ns fbName: fb Labels: kubernetes.io/metadata.namefb...# 删除 Namespace会级联删除该 ns 下所有资源rootmaster30:~# kubectl delete ns fb⚠️四个重要注意事项删除 Namespace 会自动删除该 Namespace 中所有资源生产环境慎用。default和kube-system不可删除。Namespace 名称必须满足正则[a-z0-9]([-a-z0-9]*[a-z0-9])?最长 63 位。直接**edit编辑 **Namespace不能改 apiVersion /kind/metadata.name用 YAML 创建 Namespacens-fb.yaml# 生成ns-fb.yaml文件配置模版rootmaster30:~# kubectl get ns default -o yaml ns-fb.yamlrootmaster30:~# vim ns-fb.yaml# 修改配置如下apiVersion: v1 kind: Namespace metadata: name: fb# 创建并查看rootmaster30:~# kubectl apply -f ns-fb.yamlrootmaster30:~# kubectl get ns fbNAME STATUS AGE fb Active 9s操作指定 ns 中的对象# 在 fb 这个 ns 里跑一个 nginxrootmaster30:~# kubectl run web --imagehub.laoma.cloud/library/nginx -n fb# 查看指定 ns 中的 Pod带节点和 IProotmaster30:~# kubectl get pods -n fb -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web1/1 Running018s10.224.113.130 worker32.laoma.cloudnonenone# 测试访问rootmaster30:~# curl 10.224.113.130三、Namespace 切换自带工具 kubens 自定义脚本3.1 K8s 自带方式# 查看当前 contextNAMESPACE 列空表示没设默认 nsrootmaster30:~# kubectl config get-contextsCURRENT NAME CLUSTER AUTHINFO NAMESPACE * kubernetes-adminkubernetes kubernetes kubernetes-admin# 给当前 context 设置默认 ns 为 fbrootmaster30:~# kubectl config set-context --current --namespace fb# 再次查看NAMESPACE 列已经变成 fbrootmaster30:~# kubectl config get-contextsCURRENT NAME CLUSTER AUTHINFO NAMESPACE * kubernetes-adminkubernetes kubernetes kubernetes-admin fb3.2 第三方工具 kubens 安装# 下载 kubectx包含 kubens 和 kubectx 两个工具rootmaster30:~# wget https://codeload.github.com/ahmetb/kubectx/zip/refs/heads/master -O kubectx.ziprootmaster30:~# unzip kubectx.ziprootmaster30:~# ls kubectx-master/CONTRIBUTING.md LICENSE README.md cmd completion go.mod go.sum img internal kubectx kubenstest# 把 kubens 放到 PATH 里rootmaster30:~# cp kubectx-master/kubens /usr/local/binrootmaster30:~# chmod x /usr/local/bin/kubens# 配置 bash 命令补全rootmaster30:~# cp kubectx-master/completion/kubens.bash /etc/bash_completion.d/rootmaster30:~# source /etc/bash_completion.d/kubens.bash3.3 kubens 常用命令# 列出所有 Namespace当前 ns 会高亮rootmaster30:~# kubensdefault fb kube-node-lease kube-public kube-system# 切换到指定 Namespacerootmaster30:~# kubens kube-system# 切回上一个 Namespace类似 cd -rootmaster30:~# kubens -# 只显示当前 Namespacerootmaster30:~# kubens -c3.4 自定义 bash 切换脚本rootmaster30:~# cat /usr/local/bin/my-ns EOF#!/bin/bashfunctionusage(){echo$0[namespace]echo1. 没有参数时显示 namespace 清单echo2. namespace 必须是集群中存在的 namespace}# 获取当前 namespacenamespace$(kubectl config get-contexts|awk/\*/{print $5})if[-z$namespace];thennamespacedefaultfi# 无参数列出所有 ns当前 ns 前加 *if[$#-eq0];thenkubectl get ns|awk{print $1}|seds/^$namespace/\*$namespace/exit1fi# 1 个参数切换 nsif[$#-eq1];thenifkubectl get ns|awk$1 !~ NAME {print $1}|grep-qx$1/dev/null;thenkubectl config set-context--current--namespace$1/dev/nullecho当前 namespace 设置为$1elseusagefifiEOF# 给脚本执行权限rootmaster30:~# chmod x /usr/local/bin/my-ns# 测试验证rootmaster30:~# my-nsNAME default fb kube-node-lease kube-public * kube-system四、~/.kube/config 详解单集群与多集群4.1 单集群配置结构# 查看当前 kubeconfig敏感信息会被省略rootmaster30:~# kubectl config viewapiVersion: v1# kubeconfig属于核心v1资源组clusters:# 集群列表可以配置多个k8s集群- cluster: certificate-authority-data: DATAOMITTED# 集群CA证书base64数据view默认省略展示server: https://10.1.8.30:6443# apiserver访问地址和端口name: kubernetes# 这个集群的名称标识contexts:# 上下文列表绑定【集群用户默认namespace】- context: cluster: kubernetes# 关联上面定义的集群名字namespace: kube-system# 这个上下文默认使用的命名空间user: kubernetes-admin# 关联下面定义的用户name: kubernetes-adminkubernetes# 上下文名称current-context: kubernetes-adminkubernetes# 当前正在使用的上下文kind: Config# 资源类型固定为Configpreferences:{}# 偏好设置一般为空users:# 用户凭证列表保存客户端证书/token等认证信息- name: kubernetes-admin# 用户名称user: client-certificate-data: DATAOMITTED# 客户端证书view默认省略client-key-data: DATAOMITTED# 客户端私钥view默认省略4.2 证书字段解码kubeconfig 里的证书都是 base64 编码的用下面命令解码# 解码 CA 证书echoLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...|base64-d三个证书字段的区别certificate-authority-dataCA 根证书集群侧client-certificate-data用户客户端证书用户侧client-key-data用户私钥4.3 多集群配置示例/root/multi-cluster-configrootmaster30:~# cat /root/multi-cluster-config EOFapiVersion: v1 clusters: - cluster: certificate-authority-data: DATAOMITTED server: https://10.1.8.30:6443 name: cluster1 - cluster: certificate-authority-data: DATAOMITTED server: https://10.1.8.150:6443 name: cluster2 contexts: - context: cluster: cluster1 namespace: default user: cluster1-admin name: cluster1-context - context: cluster: cluster2 namespace: default user: cluster2-admin name: cluster2-context current-context: cluster1-context kind: Config preferences:{}users: - name: cluster1-admin user: client-certificate-data: DATAOMITTED client-key-data: DATAOMITTED - name: cluster2-admin user: client-certificate-data: DATAOMITTED client-key-data: DATAOMITTED EOF五、多集群切换kubectx 实战5.1 环境准备# 先备份原配置rootmaster30:~# cp ~/.kube/config ~/.kube/config.ori# 把多集群配置覆盖成默认配置rootmaster30:~# cp /root/multi-cluster-config ~/.kube/config5.2 自带工具切换# 查看所有集群rootmaster30:~# kubectl config get-clusters# 查看所有 context* 表示当前rootmaster30:~# kubectl config get-contexts# 切换到 cluster2rootmaster30:~# kubectl config use-context cluster2-context5.3 kubectx 安装# 下载和 kubens 同一个压缩包rootmaster30:~# cp kubectx-master/kubectx /usr/local/bin/rootmaster30:~# chmod x /usr/local/bin/# 补全rootmaster30:~# cp kubectx-master/completion/kubectx.bash /etc/bash_completion.d/rootmaster30:~# source /etc/bash_completion.d/kubectx.bash5.4 kubectx 常用命令# 列出所有 contextrootmaster30:~# kubectx# 切换到指定 contextrootmaster30:~# kubectx cluster1-context# 切回上一个 contextrootmaster30:~# kubectx -# 显示当前 contextrootmaster30:~# kubectx -c# 重命名 contextrootmaster30:~# kubectx new-nameold-name# 删除 context不会删 user/cluster 条目rootmaster30:~# kubectx -d cluster2-context# 取消当前 context 设置rootmaster30:~# kubectx -u六、PodK8s 最小调度单元到底是什么6.1 白话理解Pod 就像一个豌豆荚里面装着若干个豆子容器。同一个 Pod 里的容器共享网络命名空间同一个 IP、同一套端口共享 Volume 存储被调度到同一台节点上同生共死一起被创建、一起被销毁一个 Pod 里可以只有一个容器也可以有多个容器业务容器 Sidecar Init Container。6.2 Pod vs 容器 对比特性容器PodK8s 最小调度单位❌ 不是✅ 是独立 IP❌ 无✅ 有多容器支持❌ 不支持✅ 天然支持网络/存储共享❌ 不能✅ 内部容器可共享生命周期管理弱完整重启、自愈属于谁运行时Docker/containerdKubernetes七、Pod 常用管理命令速查# 环境准备创建专用 ns 并切过去rootmaster30:~# kubectl create ns podsrootmaster30:~# kubectl config set-context --current --namespacepods# 1. 空运行只生成 YAML 不真正创建rootmaster30:~# kubectl run web --imagehub.laoma.cloud/library/nginx --dry-runclient -o yaml# 配置如下apiVersion: v1# Pod属于核心v1资源kind: Pod# 资源类型Podmetadata: creationTimestamp: null# dry-run模式不会真实创建时间留空labels: run: web# 自动添加标签runwebkubectl run默认标签name: web# pod名称webspec: containers: - image: hub.laoma.cloud/library/nginx# 使用的镜像name: web# 容器名resources:{}# 资源限制为空不限制cpu内存dnsPolicy: ClusterFirst# DNS策略集群内优先先查集群DNSrestartPolicy: Always# 重启策略容器退出永远重启status:{}# dry-run不运行状态为空# 2. 直接创建 Podrootmaster30:~# kubectl run web --imagehub.laoma.cloud/library/nginx# 3. 查看 Pod等待 ContainerCreating - Runningrootmaster30:~# kubectl get podrootmaster30:~# kubectl get pod -o wide # 显示 IP 和节点# 4. 以 YAML 格式查看rootmaster30:~# kubectl get pod web -o yaml# 5. 查看 Pod 详细描述排查问题必用rootmaster30:~# kubectl describe pod web# 6. 查看日志-f 实时跟踪rootmaster30:~# kubectl logs webrootmaster30:~# kubectl logs -f web# 7. 进入 Pod 执行命令rootmaster30:~# kubectl exec web -- hostnamerootmaster30:~# kubectl exec web -- pwdrootmaster30:~# kubectl exec -it web -- bash# 8. 多容器 Pod 用 -c 指定容器rootmaster30:~# kubectl exec bbs -c wordpress -- hostname# 9. 把宿主机文件拷进 Podrootmaster30:~# kubectl cp /etc/hosts web:/new-hosts# 10. 删除 Podrootmaster30:~# kubectl delete pod web# 11. 端口转发集群外访问集群内 Podrootmaster30:~# kubectl port-forward pod/wordpress-app --address10.1.8.30 8080:80用 YAML 创建 Podweb.yamlrootmaster30:~# cat web.yaml EOFapiVersion: v1 kind: Pod metadata: labels: run: web name: web spec: containers: - image: hub.laoma.cloud/library/nginx name: web EOF rootmaster30:~# kubectl apply -f web.yaml综合实验构建 wordpreess# 创建 pod-mysql 数据库rootmaster30:~# kubectl run wordpress-db --imagehub.laoma.cloud/library/mysql --env MYSQL_ROOT_PASSWORD123# 创建 pod-wordpress 博客rootmaster30:~# kubectl run wordpress-app --imagehub.laoma.cloud/library/wordpress# 实现集群外访问集群内podrootmaster30:~# kubectl port-forward pod/wordpress-app --address 10.1.8.30 8080:80# 该命令窗口不要关闭# 查看 IProotmaster30:~# kubectl get pods -o wide | awk {print $1 $6}NAME IP wordpress-app10.224.113.135 wordpress-db10.224.19.5# 创建数据库rootmaster30:~# mysql -uroot -p123 -h 10.224.19.5mysqlcreate database wordpress;mysqlcreate user wordpress identified by123;mysqlgrant all privileges on wordpress.* to wordpress;mysqlflush privileges;mysqlexit访问web页面 http://10.1.8.30:8080配置站点。多容器示例yaml文件rootmaster30:~# vim pod-blog.yamlapiVersion: v1 kind: Pod metadata: name: bbs labels: run: bbs spec: containers: - image: hub.laoma.cloud/library/mysql:latest imagePullPolicy: IfNotPresent name: mysql env: - name: MYSQL_ROOT_PASSWORD value:123- name: MYSQL_USER value: tom - name: MYSQL_PASSWORD value:123- name: MYSQL_DATABASE value: bbs ports: - containerPort:3306name: mysql protocol: TCP - image: hub.laoma.cloud/library/wordpress:latest imagePullPolicy: IfNotPresent name: wordpress env: - name: WORDPRESS_DB_USER value: tom - name: WORDPRESS_DB_PASSWORD value:123- name: WORDPRESS_DB_NAME value: bbs - name: WORDPRESS_DB_HOST value:127.0.0.1 ports: - containerPort:80name: wordpress protocol: TCP hostPort:80八、Pod 生命周期与状态流转8.1 pod关键属性rootmaster30:~# kubectl explain pod | grep ^ [a-zA-Z]apiVersionstringkindstringmetadataObjectMetaspecPodSpecstatusPodStatus# pod.spec(重点关注containers、nodeName、volumes等)rootmaster30:~# kubectl explain pod.spec | grep ^ [a-zA-Z]# pod.spec.containers(重点关注command、env、image、imagePullPolicy、volumeMounts等)rootmaster30:~# kubectl explain pod.spec.containers | grep ^ [a-zA-Z]大类属性字段作用说明metadata元数据namePod 名称同一命名空间内唯一不可修改namespace所属命名空间不指定默认 defaultlabels标签用于 selector 匹配Service、Deploymentannotations注解存放附加信息不能用于筛选spec期望规格最重要containers业务容器列表核心name/image 必填initContainers初始化容器串行先执行全部成功才启动业务容器volumes数据卷给 Pod 内所有容器共享存储restartPolicy重启策略Always/OnFailure/Never只控制 Pod 内容器重启不控制调度dnsPolicyDNS 策略默认ClusterFirstnodeName直接指定调度到某个节点强制绑定节点nodeSelector节点标签选择器简单节点调度affinity亲和性节点亲和、Pod 亲和 / 反亲和高级调度tolerations容忍污点允许 Pod 调度到带污点的节点容器子字段containers 里面image容器镜像地址command / args覆盖镜像里 ENTRYPOINT、CMDportscontainerPort容器内监听端口不做防火墙限制仅记录信息resourcesrequests调度预留资源、limits最大资源上限livenessProbe存活探针容器挂了、卡死杀掉重建readinessProbe就绪探针判断容器是否准备好接收流量就绪前不加入 service 后端status实际状态phasePod 阶段Pending/Running/Failed/Succeeded/UnknownpodIPPod 集群内部 IP集群内可互通conditions细分条件Ready、ContainersReady、PodScheduled 等8.2 常见 Pod 状态状态含义ContainerCreating正在创建拉镜像、起容器Running正常运行Completed运行完成退出码 0Error/RunContainerError运行出错CrashLoopBackOff崩溃后反复重启ErrImagePull/ImagePullBackOff拉镜像失败 / 重试中Terminating正在被删除8.3 ImagePullPolicy 三种取值取值行为Always每次都从仓库拉镜像latest 标签默认Never只用本地镜像绝不拉取IfNotPresent本地有就用本地没有才去仓库拉推荐8.4 restartPolicy 重启策略取值行为适用场景Always只要不是 Running 就重启默认值长期运行的服务OnFailure只有失败非 0 退出才重启批处理任务Never从不重启一次性任务⚠️restartPolicy是Pod 级的对 Pod 内所有容器生效不是单个容器的属性。修改它必须删除 Pod 重建直接 apply 会报错。8.5 状态流转实验# 监控 Pod 状态变化rootmaster30:~# watch -n 1 kubectl get pod单容器任务型 PodrestartPolicy: Never的状态流转ContainerCreating - Running - Completed多容器 Pod一个先跑完ContainerCreating - Running - NotReady - Completed九、Init Containers初始化容器的串行执行机制9.1 核心规则一个 Pod 可以有 1 个或多个 Init Container按顺序串行执行全部 exit 0 后才启动业务容器任意一个 Init Container 失败就根据restartPolicy重启 Pod直到全部成功9.2 典型使用场景等待依赖 Service 创建完成轮询 DNS启动前先 sleep 一段时间从 Git 仓库克隆代码到 Volume生成配置文件放到共享 Volume9.3 示例等待 Service 就绪rootmaster30:~# cat pod-myapp.yaml EOFapiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: initContainers: - name: init-myservice image: hub.laoma.cloud/library/busybox command:[sh,-c,until nslookup myservice.default.svc.cluster.local; do echo waiting; sleep 2; done]- name: init-mydb image: hub.laoma.cloud/library/busybox command:[sh,-c,until nslookup mydb.default.svc.cluster.local; do echo waiting; sleep 2; done]containers: - name: myapp-container image: hub.laoma.cloud/library/busybox command:[sh,-c,echo The app is running! sleep 3600]EOF rootmaster30:~# kubectl apply -f pod-myapp.yamlPod 状态变化Init:0/2 - Init:1/2 - PodInitializing - Running如果 Init 容器失败Init:Error - Init:CrashLoopBackOff循环十、静态 Podmaster 组件是谁在管10.1 问题master 节点上的kube-apiserver、kube-scheduler、kube-controller-manager、etcd这些 Pod 是怎么跑起来的谁在管它们答案kubelet。master 组件以静态 Pod的形式运行由本地 kubelet 直接管理不经过 API Server。10.2 kubelet 配置位置# 查看 kubelet 服务状态rootmaster30:~# systemctl status kubelet.service# 查看 kubelet 主配置rootmaster30:~# cat /usr/lib/systemd/system/kubelet.service# kubeadm 生成的 Drop-In 配置rootmaster30:~# cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf# 关键参数staticPodPath 定义静态 Pod 的 YAML 目录rootmaster30:~# grep staticPodPath /var/lib/kubelet/config.yaml# 输出staticPodPath: /etc/kubernetes/manifests# 查看该目录下的静态 Pod 文件rootmaster30:~# ls -1 /etc/kubernetes/manifests# etcd.yaml# kube-apiserver.yaml# kube-controller-manager.yaml# kube-scheduler.yaml⚠️ 不要随便修改staticPodPath否则 4 个组件 YAML 都要手动复制过去否则 master 会挂。十一、高频面试题Pod vs 容器、pause 容器作用Q1为什么 K8s 直接管 Pod 而不是容器容器太原子容器只是一个进程运行环境没有独立身份不适合直接调度。多容器协同Sidecar、Init Container、代理容器必须和业务容器共享网络和 Volume一起调度到同一台机器。统一生命周期重启、自愈、滚动更新、扩缩容都需要一个稳定的管理单元。解耦运行时屏蔽 Docker / containerd / CRI-O 的差异K8s 只跟 Pod 打交道。Q2pause 容器是干嘛的每个 Pod 启动时第一个跑起来的就是pause 容器也叫 infra 容器它的镜像通常是registry.k8s.io/pause:3.x。三个核心作用作用说明持有 Namespace创建并持有网络/IPC/PID Namespace让其他容器加入维持 Pod 生命周期pause 不死Pod 的 IP 和网络就一直在实现多容器共享网络所有业务容器加入 pause 的 netns用 127.0.0.1 互访形象比喻pause 房东Pod 房子业务容器 租客。房东先把房子占好租客来了就能住租客换了一波又一波房子IP、网络始终不变。十二、YAML 语法速记12.1 基本规则只用空格缩进不能用 Tab同一层级元素缩进必须一致子元素比父元素多缩进一般 2 个空格#后面是注释#前如果有内容要加一个空格12.2 多行字符串符号行为适用场景|保留换行符脚本、配置文件原文折叠换行换行变空格长段落说明文字catdemo.yamlEOF # | 保留换行 debug: msg: | Example Company 123 Main Street Atlanta, GA 30303 # 折叠成一行 desc: This is a long string that will become a single sentence once folded. EOF12.3 字典Mapping# 块式推荐可读性好user: name: laoma uid:1088state: absent# 内联式紧凑但可读性差user:{name: laoma, uid:1088, state: absent}12.4 列表Sequence# 块式yum: name: - httpd - firewalld state: latest# 内联式name:[httpd, firewalld]总结知识点一句话记忆Namespace逻辑隔离单元Pod/Service/PVC 属于 nsNode/PV 不属于切换 nskubectl config set-context --current --namespacexxx多集群kubeconfig clusters users contexts 三元组PodK8s 最小调度单元内部容器共享网络和存储重启策略Always默认/ OnFailure / NeverPod 级生效Init Container串行执行全部成功才启业务容器静态 Podkubelet 直接管理master 组件就这么跑起来的pause 容器持有网络 NamespacePod 的基石