K8s 入门核心概念:Pod/Service/ 命名空间,看完就会用
核心提要:本文聚焦 K8s 最基础且必备的 3 大核心概念——Pod、Service、命名空间,通过“概念定义+核心作用+通俗类比+实操演示”的方式,帮新手快速理解其本质,掌握“创建-查看-使用-删除”的核心操作,避开入门常见坑,实现“看完就能用”的学习目标。
K8s(Kubernetes)的核心价值是“自动化管理容器集群”,而 Pod、Service、命名空间是理解 K8s 工作逻辑的基础——Pod 是容器的“载体”,Service 是 Pod 的“稳定访问入口”,命名空间是资源的“隔离容器”,三者协同构成 K8s 应用部署与访问的基础框架。
一、实操前置准备
1. 必备环境与工具
-
K8s 集群:推荐使用 Minikube(单节点集群,适合入门练习,安装简单),也可使用 Docker Desktop 内置 K8s(需在设置中开启)
-
命令行工具:kubectl(K8s 官方命令行客户端,用于与集群交互,安装后需配置集群连接)
-
辅助工具:文本编辑器(VS Code 推荐,可安装 YAML 插件提升编辑体验)、终端(CMD/PowerShell/Linux 终端)
2. 环境验证(确保可正常操作)
打开终端,执行以下命令,若输出集群信息则说明环境正常:
# 查看 K8s 集群状态
kubectl cluster-info
# 查看节点状态(Minikube 单节点集群应显示 Ready 状态)
kubectl get nodes

3. 核心约定(入门必知)
-
K8s 配置文件默认使用 YAML 格式,核心语法:缩进(2 个空格,不可用 Tab)、键值对、列表(- 开头)
-
所有实操命令均基于 kubectl,核心操作逻辑:
kubectl [命令] [资源类型] [资源名称] [参数] -
入门阶段聚焦“使用”,暂不深入底层原理,重点掌握“是什么、怎么用”
二、核心概念拆解(通俗理解+核心作用)
1. Pod:K8s 最小部署单元(容器的“家”)
(1)概念定义
Pod 是 K8s 中最小的可部署、可调度的资源单元,它不是容器本身,而是容器的封装载体——一个 Pod 内可包含一个或多个容器(通常为 1 个,多容器场景用于紧密关联的组件,如应用容器+日志收集容器)。
(2)通俗类比
把 Pod 比作“一个家庭”,容器就是“家庭里的成员”:
-
大多数家庭是“核心家庭”(1 个成员=1 个容器),对应单容器 Pod(最常见场景);
-
少数家庭是“联合家庭”(多个成员=多个容器),对应多容器 Pod(仅用于组件间需共享资源、紧密协作的场景);
-
K8s 不会直接管理容器,而是通过管理 Pod 来间接管理容器(就像管理家庭而非单独管理成员)。
(3)核心作用
-
统一调度:K8s 调度器将 Pod 整体调度到某个节点(服务器),保证 Pod 内所有容器在同一节点;
-
资源共享:Pod 内所有容器共享网络命名空间(同一 IP、同一端口范围)和存储卷(可共享文件);
-
简化管理:以 Pod 为单位进行启动、停止、重启、删除等操作,简化容器集群的管理逻辑。
2. Service:Pod 的“稳定访问入口”(避免“找不到家”)
(1)概念定义
Service 是 K8s 中用于暴露 Pod 网络服务的资源,它会为一组具有相同功能的 Pod 分配一个固定的访问 IP(ClusterIP)和端口,并通过标签选择器(Label Selector)关联 Pod。
(2)通俗类比
Pod 的 IP 是“动态的”(Pod 重启、重建后 IP 会变化),就像“家庭的临时门牌号”;Service 则是“固定的电话号码”——无论 Pod 的 IP 如何变化,通过 Service 的固定 IP/端口总能访问到对应的 Pod 组。
比如:一个 Web 应用部署了 3 个 Pod(负载均衡),Pod IP 可能随时变化,但 Service 提供的固定 IP 不变,外部应用只需访问这个固定 IP,Service 会自动将请求转发到健康的 Pod 上。
(3)核心作用
-
固定访问入口:解决 Pod IP 动态变化的问题,提供稳定的网络访问地址;
-
负载均衡:自动将请求分发到多个关联的 Pod 上,提升应用可用性和并发能力;
-
服务发现:无需手动记录 Pod IP,通过 Service 名称即可在集群内访问服务(结合 DNS 插件)。
3. 命名空间:资源的“隔离文件夹”(避免“资源混乱”)
(1)概念定义
命名空间(Namespace)是 K8s 中用于隔离集群资源的逻辑分区,它可以将集群内的 Pod、Service、配置等资源划分到不同的“虚拟空间”中,不同命名空间的资源名称可以重复,互不干扰。
(2)通俗类比
把 K8s 集群比作“一台电脑的硬盘”,命名空间就是“硬盘里的文件夹”:
-
“default”文件夹(默认命名空间):刚创建的资源若不指定命名空间,会自动放在这里;
-
“kube-system”文件夹:K8s 系统组件(如调度器、控制器)所在的命名空间,不可随意修改;
-
自定义文件夹(如“dev”“test”“prod”):用于区分开发、测试、生产环境的资源,避免不同环境的资源相互干扰。
(3)核心作用
-
资源隔离:不同命名空间的资源相互独立,避免命名冲突和资源误操作(如删除测试环境资源不影响生产环境);
-
权限控制:可针对不同命名空间设置访问权限(如开发人员只能操作“dev”命名空间);
-
资源配额:可为不同命名空间分配资源上限(如“test”命名空间最多使用 2 核 CPU、4G 内存)。
三、实操演示:从创建到使用,一步到位
本实操基于 Minikube 单节点集群,核心流程:创建命名空间 → 在命名空间内创建 Pod → 创建 Service 关联 Pod → 测试访问 → 清理资源。
实操 1:命名空间操作(创建/查看/切换)
# 1. 查看集群内所有命名空间
kubectl get namespaces
# 或简写:kubectl get ns
# 预期输出:default、kube-system、kube-public 等默认命名空间
# 2. 创建自定义命名空间(以 dev 为例,用于开发环境)
kubectl create namespace dev
# 或通过 YAML 文件创建(推荐,便于版本管理),创建 dev-ns.yaml 文件:
# apiVersion: v1
# kind: Namespace
# metadata:
# name: dev
# 执行创建命令:kubectl apply -f dev-ns.yaml
# 3. 查看指定命名空间(dev)
kubectl get ns dev
# 4. 切换默认命名空间(后续操作默认在 dev 中执行,避免影响 default 空间)
# 方法 1:临时切换(仅当前终端生效)
kubectl config set-context --current --namespace=dev
# 方法 2:永久切换(修改配置文件,所有终端生效)
kubectl config use-context $(kubectl config current-context) --namespace=dev
# 5. 验证切换结果(查看当前命名空间)
kubectl config view --minify | grep namespace

实操 2:Pod 操作(创建/查看/访问/删除)
(1)创建 Pod(部署 Nginx 示例,单容器 Pod)
创建 pod-nginx.yaml 文件,内容如下(YAML 语法注意缩进):
apiVersion: v1 # API 版本(v1 是核心资源的稳定版本)
kind: Pod # 资源类型为 Pod
metadata:
name: nginx-pod # Pod 名称(在当前命名空间内唯一)
labels:
app: nginx # 标签(用于关联 Service,键值对可自定义)
spec:
containers: # 容器列表(单容器场景)
- name: nginx-container # 容器名称(Pod 内唯一)
image: nginx:1.24 # 容器镜像(从 Docker Hub 拉取)
ports:
- containerPort: 80 # 容器暴露的端口(Nginx 默认端口)
执行创建命令:
kubectl apply -f pod-nginx.yaml

(2)查看 Pod 状态与信息
# 1. 查看当前命名空间(dev)内的所有 Pod
kubectl get pods
# 预期输出:nginx-pod 状态为 Running(运行中),READY 1/1(1 个容器正常运行)
# 2. 查看 Pod 详细信息(如 IP、容器信息、事件等)
kubectl describe pod nginx-pod
# 3. 查看 Pod 的 IP 地址(后续验证 Service 时需用到)
kubectl get pod nginx-pod -o wide
# 输出中 IP 字段即为 Pod 的集群内 IP(如 10.244.0.5)

(3)访问 Pod(集群内访问,验证 Nginx 服务)
# 方法 1:通过 kubectl exec 进入 Pod 内部访问
kubectl exec -it nginx-pod -- /bin/bash
# 进入 Pod 后,执行 curl localhost:80(Nginx 默认首页)
curl localhost:80
# 预期输出:Nginx 的默认 HTML 页面内容
# 退出 Pod:exit
# 方法 2:在集群内直接通过 Pod IP 访问(需在集群节点或其他 Pod 内)
curl 10.244.0.5:80 # 替换为实际的 Pod IP

(4)删除 Pod
# 方法 1:通过 YAML 文件删除(推荐,与创建方式对应)
kubectl delete -f pod-nginx.yaml
# 方法 2:通过 Pod 名称删除
kubectl delete pod nginx-pod

实操 3:Service 操作(创建/关联 Pod/访问)
(1)创建 Service(关联 Nginx Pod)
创建 svc-nginx.yaml 文件,内容如下(通过标签关联 Pod):
apiVersion: v1 # API 版本
kind: Service # 资源类型为 Service
metadata:
name: nginx-svc # Service 名称(当前命名空间内唯一)
spec:
type: ClusterIP # Service 类型(默认,仅集群内可访问)
selector:
app: nginx # 标签选择器(匹配标签为 app:nginx 的 Pod)
ports:
- port: 80 # Service 暴露的端口(集群内访问端口)
targetPort: 80 # 目标 Pod 的端口(与 Pod 中 containerPort 一致)
执行创建命令:
kubectl apply -f svc-nginx.yaml

(2)查看 Service 信息
# 1. 查看当前命名空间(dev)内的所有 Service
kubectl get services
# 或简写:kubectl get svc
# 预期输出:nginx-svc 状态为 ClusterIP,PORT(S) 为 80/TCP,CLUSTER-IP 为固定 IP(如 10.96.123.45)
# 2. 查看 Service 详细信息(如关联的 Pod、端口映射等)
kubectl describe svc nginx-svc
# 输出中 Endpoints 字段即为关联的 Pod IP:Port(如 10.244.0.5:80)

(3)通过 Service 访问 Pod(稳定访问验证)
# 方法 1:通过 Service 的 ClusterIP 访问(集群内任意节点/ Pod 均可)
curl 10.96.123.45:80 # 替换为实际的 Service ClusterIP
# 方法 2:通过 Service 名称访问(需集群内 DNS 插件正常,更简洁)
curl nginx-svc:80
# 预期输出:与直接访问 Pod 一致的 Nginx 首页内容
# 验证稳定性:删除旧 Pod,重新创建(IP 变化),再通过 Service 访问
kubectl delete pod nginx-pod
kubectl apply -f pod-nginx.yaml # 新 Pod IP 会变化
curl nginx-svc:80 # 仍可正常访问,证明 Service 自动关联新 Pod
(4)删除 Service
kubectl delete -f svc-nginx.yaml
# 或:kubectl delete svc nginx-svc
四、入门常见坑与解决方案
坑 1:Pod 状态一直为 Pending(挂起)原因:集群资源不足(如 Minikube 节点资源不够)、镜像拉取失败、调度失败等。解决方案:① 查看 Pod 事件排查原因:kubectl describe pod Pod名称;② 镜像拉取失败可更换国内镜像(如 Nginx 镜像用 nginx:1.24 稳定版本);③ 调整 Minikube 资源:minikube start --cpus 2 --memory 4096(分配 2 核 CPU、4G 内存)。
坑 2:Service 无法关联 Pod原因:Service 的标签选择器(selector)与 Pod 的标签(labels)不匹配。解决方案:检查 svc-nginx.yaml 中 spec.selector 的键值对,确保与 pod-nginx.yaml 中 metadata.labels 完全一致(如均为 app: nginx)。
坑 3:通过 Service 名称无法访问原因:集群 DNS 插件(如 coredns)未正常运行。解决方案:① 查看 DNS 组件状态:kubectl get pods -n kube-system | grep coredns;② 若 coredns 未运行,重启 Minikube:minikube stop && minikube start。
坑 4:YAML 文件报错(invalid yaml)原因:缩进错误(用了 Tab 或缩进不一致)、语法错误(如冒号后缺空格、列表格式错误)。解决方案:① 用 VS Code 等工具开启 YAML 语法校验;② 在线 YAML 校验工具(如 yamlvalidator.com)检查语法;③ 严格遵循“2 个空格缩进”“键值对冒号后加空格”的规则。
五、总结与进阶方向
1. 核心知识点回顾
-
Pod:最小部署单元,容器的“家”,K8s 管理的最小单位;
-
Service:稳定访问入口,解决 Pod IP 动态变化问题,提供负载均衡;
-
命名空间:资源隔离的“文件夹”,用于区分环境、控制权限。
三者关系:命名空间隔离 Pod 和 Service,Service 通过标签关联 Pod,外部通过 Service 访问 Pod 内的应用。
2. 进阶学习方向
-
Pod 进阶:多容器 Pod、Pod 生命周期、资源限制(CPU/内存);
-
Service 进阶:其他类型(NodePort、LoadBalancer、Ingress),实现外部访问;
-
控制器:Deployment(Pod 自动扩缩容、滚动更新)、StatefulSet(有状态应用);
-
配置与存储:ConfigMap(配置管理)、Secret(敏感信息管理)、Volume(存储卷)。
入门阶段先夯实本文 3 个核心概念,再逐步拓展进阶内容,就能稳步掌握 K8s 的核心工作逻辑。

浙公网安备 33010602011771号