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 的核心工作逻辑。

posted @ 2025-12-28 15:35  szjmc  阅读(7)  评论(0)    收藏  举报  来源