Kubernetes 核心概念与微服务架构解析

Kubernetes 核心概念与微服务架构解析

kubernetes核心概念

Kubernetes(简称 K8s)的核心概念是理解其集群管理逻辑的基础,以下从定义、核心特性、类比示例三个维度,对核心概念进行结构化梳理,更清晰地呈现各概念的定位与作用:

Pod:K8s 最小部署单元

核心定义

Pod 是 Kubernetes 中可创建、可管理的最小可部署计算单元,并非直接运行容器,而是作为 "容器组" 承载 1 个或多个紧密关联的容器。

关键特性
  • 资源共享

    :同一 Pod 内的所有容器共享 3 类核心资源:

    • 网络:共享同一个网络命名空间(即共享 Pod 的 IP 地址和端口);
    • 存储:可通过Volume挂载共享存储卷;
    • 运行声明:共享 Pod 层面的配置(如资源限制、重启策略等)。
  • 生命周期与 Pod 一致:Pod 内任意容器故障,可能导致整个 Pod 重启(取决于重启策略),容器无法脱离 Pod 独立存在。

经典类比

用 "豌豆田" 模型理解 Pod 与其他资源的关系:

概念 类比对象 对应关系说明
Container 一颗豌豆 最小运行单元,依赖 Pod "包裹"
Pod 一个豌豆荚 承载 1 颗或多颗豌豆(1 个或多个容器)
Node 一根豌豆藤 承载多个豌豆荚(多个 Pod)
Cluster 整个豌豆田 由多根豌豆藤(多个 Node)组成

Controller:Pod 的 "自动化管理者"

核心定义

Controller(控制器)是 K8s 中用于管理 Pod 生命周期、维持集群状态的核心对象,其核心逻辑是 "监控当前状态 → 对比期望状态 → 调整至期望状态"。

关键特性
  • 状态驱动 :每个 Controller 都有spec字段定义 "期望状态"(如 Pod 副本数、运行规则),控制器持续监控集群 "当前状态",自动修正偏差(如 Pod 故障时重启、副本数不足时新建);
  • 资源关联:每个 Controller 至少关联一种 K8s 资源(主要是 Pod),不同 Controller 对应不同的业务场景。
经典类比

类似 "房间温度自动调节器":

你设置的目标温度(期望状态)→ 调节器监控当前室温(当前状态)→ 自动开关空调(调整操作)→ 维持室温接近目标温度(达成期望状态)。

常见 Controller 类型及场景
Controller 类型 核心作用 适用场景 关键特性
Deployment 部署无状态应用 Web 服务、分布式无状态服务(如 Nginx、API) Pod 可任意扩容缩容,无顺序 / 唯一性要求
StatefulSet 部署有状态应用 数据库(如 MySQL 主从)、分布式存储(如 ETCD) Pod 有固定名称 / 网络标识,需按顺序启停 / 扩容
DaemonSet 部署集群守护进程 日志采集(如 Fluentd)、监控代理(如 Prometheus Node Exporter) 每个 Node 上仅运行 1 个 Pod 副本,新 Node 自动部署
Job 执行一次性短期任务 数据备份、批量计算(如统计日志) 任务完成后 Pod 自动终止,确保任务成功结束
CronJob 执行周期性定时任务 定时备份、定时清理日志 基于 Cron 表达式触发(如每天凌晨 3 点执行)

Label:资源的 "多维度标签"

核心定义

Label 是附着在 K8s 资源(如 Pod、Node、Service)上的键值对(key=value) ,本身无业务逻辑,仅用于 "标记资源",方便后续筛选和管理。

关键特性
  • 灵活性:可在资源创建时指定,也可创建后动态添加 / 删除;
  • 多维度:一个资源可绑定多个 Label(如 "环境 = 生产""版本 = v1.0""组件 = 前端"),支持按多维度分组;
  • 用户主导:Label 的 key 和 value 由用户自定义,K8s 系统仅规定语法规则,不解读含义。
语法规则(key 与 value)
规则维度 Label Key 要求 Label Value 要求
长度限制 最多 63 个字符;若有前缀(DNS 子域,如k8s.example.com/),前缀最多 253 个字符 最多 63 个字符
字符规则 开头必须是字母 / 数字,中间可包含连字符(-)、下划线(_)、点(.) 开头必须是字母 / 数字,中间可包含连字符(-)、下划线(_)、点(.)
系统保留前缀 系统组件创建的 Label 必须带前缀,kubernetes.io/为 K8s 官方保留前缀 无特殊保留规则
常见 Label 示例
标签维度 示例(key=value) 用途说明
环境 environment=dev / environment=production 区分开发 / 测试 / 生产环境的资源
版本 release=stable / release=canary 标记应用版本(稳定版 / 金丝雀版本)
架构分层 tier=frontend / tier=backend 区分前端 / 后端 / 中间件组件
客户分区 partition=customerA / partition=customerB 按客户维度隔离资源
质量跟踪 track=daily / track=weekly 标记测试跟踪周期(每日构建 / 每周构建)

Label Selector:资源的 "筛选器"

核心定义

Label Selector(标签选择器)是根据 Label 筛选 K8s 资源的工具,客户端(如用户、Controller)可通过它定位到符合条件的资源集合,实现 "精准操作"。

两种筛选类型
筛选类型 支持操作符 示例(筛选 Pod) 说明
基于等式(Equality-based) =、==(等于)、!=(不等于);多条件用逗号分隔 app=nginx(筛选 label 为 app=nginx 的 Pod);app=nginx,environment=prod(同时满足两个条件) 适合精确匹配或排除特定值
基于集合(Set-based) in(在集合内)、not in(不在集合内)、!(不存在该 key);空值(仅匹配 key 存在) app in (nginx, apache)(筛选 app 为 nginx 或 apache 的 Pod);!app(筛选没有 app 标签的 Pod) 适合匹配多个值或判断 key 是否存在
经典类比

类似 SQL 语句的WHERE条件:

app=redis-slave的 Label Selector,等价于 SQL 查询:SELECT * FROM Pod WHERE Pod.label.app = 'redis-slave'

Service:Pod 的 "网络入口"

核心定义

Service 是将一组 Pod 暴露为网络服务的抽象层,解决 Pod "动态性" 导致的访问问题 ------Pod 销毁 / 重建后 IP 会变化,Service 通过固定 IP 和端口,为前端提供稳定的访问入口。

核心价值
  • 固定访问入口:Service 创建后会分配一个集群内唯一的 "Cluster IP",即使后端 Pod IP 变化,Service IP 始终不变;
  • 负载均衡:通过 iptables 或 ipvs 规则,将前端请求均匀转发到后端多个 Pod 副本(默认轮询策略);
  • 解耦前后端:前端无需知道后端 Pod 的具体 IP 和数量,只需访问 Service 的 IP + 端口即可。
场景示例

假设后端有 3 个 "图片处理 Pod"(副本数 = 3),前端需要调用图片处理服务:

  1. 为这 3 个 Pod 打相同 Label(如app=image-processor);
  2. 创建 Service,通过 Label Selector(app=image-processor)关联这 3 个 Pod;
  3. 前端直接访问 Service 的 Cluster IP + 端口,请求会自动转发到后端任意一个 Pod,实现 "无感知访问" 和负载均衡。

Endpoints:Service 与 Pod 的 "桥梁"

核心定义

Endpoints 是维护 Service 后端 Pod 列表的资源,它会实时跟踪符合 Service Label Selector 的 Pod,自动更新 Pod 的 IP 和端口,确保 Service 的请求能转发到 "存活的 Pod"。

工作逻辑
  1. Service 创建时,会自动关联一个同名的 Endpoints 资源;
  2. Endpoints 持续监控集群中符合 Service Label Selector 的 Pod;
  3. 当 Pod 新建(符合条件)或销毁(故障 / 删除)时,Endpoints 会立即更新 "Pod IP: 端口" 列表;
  4. Service 转发请求时,直接从 Endpoints 获取后端 Pod 地址,无需自己监控 Pod 状态。

DNS:集群内的 "名称解析服务"

核心定义

K8s 集群内的 DNS 服务(如 CoreDNS)是为资源提供 "名称→IP" 解析的组件,避免用户 / 应用记忆复杂的 IP 地址,实现 "通过名称访问资源"。

两大核心功能
  1. 集群内 Service 解析:为每个 Service 生成一个默认的 DNS 域名(格式:Service名称.命名空间.svc.cluster.local),集群内 Pod 可通过该域名访问 Service,无需填写 Cluster IP;

    示例:命名空间prod下的nginx-service,域名是nginx-service.prod.svc.cluster.local,Pod 通过该域名即可访问 Service。

  2. Pod 访问互联网 :为集群内 Pod 提供互联网域名解析(如解析www.baidu.com的 IP),确保 Pod 能正常访问外部网络。

kubernetes核心概念之间的关系

Pod与Controller

Pod 和 Controller 靠 Label 建立关联,应用的伸缩、滚动升级等运维工作都由 Controller 完成。

案例:删除其中一个pod,查看controller自动创建新pod

bash 复制代码
[root@master test]# kubectl get replicasets
NAME               DESIRED   CURRENT   READY   AGE
nginx-7854ff8877   3         3         3       4d22h

[root@master test]# kubectl get pods
NAME                     READY   STATUS    RESTARTS      AGE
nginx-7854ff8877-4lss5   1/1     Running   5 (20h ago)   4d22h
nginx-7854ff8877-fzbfm   1/1     Running   5 (20h ago)   4d22h
nginx-7854ff8877-mrmww   1/1     Running   5 (20h ago)   4d22h

#删除一个会自动生成新的
[root@master test]# kubectl delete pod nginx-7854ff8877-mrmww
pod "nginx-7854ff8877-mrmww" deleted
[root@master test]# kubectl get pods
NAME                     READY   STATUS              RESTARTS      AGE
nginx-7854ff8877-4lss5   1/1     Running             5 (20h ago)   4d22h
nginx-7854ff8877-8qcvp   0/1     ContainerCreating   0             4s
nginx-7854ff8877-fzbfm   1/1     Running             5 (20h ago)   4d22h


#查看控制器管理的标签Selector
[root@master test]# kubectl describe replicasets nginx-7854ff8877
Name:           nginx-7854ff8877
Namespace:      default
Selector:       app=nginx,pod-template-hash=7854ff8877
Labels:         app=nginx
                pod-template-hash=7854ff8877
Annotations:    deployment.kubernetes.io/desired-replicas: 3
                deployment.kubernetes.io/max-replicas: 4
                deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/nginx
Replicas:       3 current / 3 desired
Pods Status:    3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=nginx
           pod-template-hash=7854ff8877
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  78s   replicaset-controller  Created pod: nginx-7854ff8877-8qcvp

Pod与Service

Service 主要用于解决 Pod 动态变化导致的访问问题,承担服务发现功能,类似微服务架构中的注册中心。它的核心作用包括:

  1. 统一入口与负载分发:为一组功能相同的 Pod 提供固定访问地址,作为客户端请求的统一入口,并将请求自动负载均衡到后端各 Pod 实例。
  2. 关联与管控 Pod:通过标签(Label)与选择器(Selector)的匹配机制,动态关联并管控具有相同标签的 Pod 集合,即便 Pod 因调度、故障重建等原因发生 IP 变化,也能确保服务持续可用。

简言之,Service 既实现了后端 Pod 的自动发现与关联,又通过统一入口和负载均衡策略,保障了服务访问的稳定性与高效性。

bash 复制代码
#查看所有service
[root@master test]# kubectl get service
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        4d23h
nginx        NodePort    10.109.182.190   <none>        80:30578/TCP   4d22h
[root@master test]# kubectl get svc -n web-test 
NAME         TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
tomcat-svc   NodePort   10.102.244.64   <none>        80:30080/TCP   21h


#查看指定的service
[root@master test]# kubectl describe svc tomcat-svc -n web-test 
Name:                     tomcat-svc
Namespace:                web-test
Labels:                   <none>
Annotations:              <none>
Selector:                 app=tomcat
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.102.244.64
IPs:                      10.102.244.64
Port:                     <unset>  80/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  30080/TCP
Endpoints:                10.244.104.21:8080,10.244.166.154:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

Service与DNS

通过DNS实现对Service名称解析,以此达到访问后端Pod目的。

bash 复制代码
[root@master test]# kubectl get pods -n kube-system -o wide | grep dns
coredns-66f779496c-26pcb                   1/1     Running   5 (21h ago)   5d      10.244.166.158   node1    <none>           <none>
coredns-66f779496c-wpc57                   1/1     Running   5 (21h ago)   5d      10.244.166.159   node1    <none>           <none>


#获取集群ip
[root@master ~]# kubectl get service -n kube-system 
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
kube-dns         ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   7d
metrics-server   ClusterIP   10.104.124.222   <none>        443/TCP                  6d3h


#查看dns对应的pod地址
[root@master ~]# kubectl get endpoints -n kube-system
NAME             ENDPOINTS                                                           AGE
kube-dns         10.244.166.178:53,10.244.166.181:53,10.244.166.178:53 + 3 more...   7d
metrics-server   10.244.104.46:10250                                                 6d3h


#开始进行dns解析
[root@master test]# dig -t a tomcat-svc.web-test.svc.cluster.local. @10.96.0.10

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7 <<>> -t a tomcat-svc.web-test.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63007
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tomcat-svc.web-test.svc.cluster.local. IN A

;; ANSWER SECTION:
tomcat-svc.web-test.svc.cluster.local. 30 IN A	10.101.98.15
#返回解析地址
;; Query time: 1 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Thu Nov 20 14:32:59 CST 2025
;; MSG SIZE  rcvd: 119



#验证解析的地址
[root@master test]# kubectl get svc -n web-test 
NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
tomcat-svc   NodePort   10.101.98.15   <none>        80:30080/TCP   2m16s

基于 Kubernetes 集群的容器化微服务解析

服务部署方式演进

单体服务架构

所有业务功能模块打包为一个整体应用,所有服务进程运行在同一台主机(或单一容器)内。

  • 特点:架构简单、部署便捷,但扩展性差,单个模块故障可能导致整个应用不可用,迭代升级需整体重启。
分布式服务架构

将单体应用拆分为多个独立服务,服务进程分布在不同主机(或服务器)上,通过网络通信协同工作。

  • 特点:单个服务故障不影响其他服务运行,可针对不同服务独立扩展,但缺乏统一的资源管理与调度机制,运维复杂度较高。
容器化微服务架构

基于容器化技术(如 Docker)封装分布式服务,依托 Kubernetes 等编排平台实现服务的部署、调度与治理。

  • 核心优势:不仅继承分布式架构的独立性与扩展性,还实现服务高可用(故障自动恢复、副本冗余)、快速发布(滚动更新、灰度发布)、资源动态调度等能力,是当前主流的微服务落地方式。

Kubernetes 微服务组件关联关系(以 LNMT 应用为例)

LNMT 架构(Linux + Nginx + MySQL + Tomcat)是经典的 Web 应用架构,在 Kubernetes 集群中,可通过核心资源对象将其拆解为微服务部署,各组件对应关系清晰易懂:

集群与物理资源的类比

可将 Kubernetes 集群直接类比为一个 "虚拟 IDC 机房",集群中的 Node 节点对应机房中的物理服务器,提供计算、存储、网络等基础资源,为微服务运行提供支撑。

应用组件与 K8s 资源的映射
  • Nginx 服务:作为反向代理与负载均衡,通过 Deployment 控制器部署为无状态微服务,结合 Service(NodePort/LoadBalancer 类型)暴露外部访问入口,接收用户请求并转发至 Tomcat 服务。
  • Tomcat 服务:作为应用运行容器(部署 Java Web 应用),通过 Deployment 控制器管理多副本,实现高可用,借助 Service(ClusterIP 类型)提供集群内访问地址,与 Nginx、MySQL 通过内部网络通信。
  • MySQL 服务:作为数据存储组件,属于有状态服务,通过 StatefulSet 控制器部署,绑定 PersistentVolumeClaim(PVC)实现数据持久化,通过 Headless Service 提供稳定的网络标识,确保 Tomcat 服务始终能访问到正确的数据库实例。
  • Linux 基础环境:由 Kubernetes 集群的 Node 节点(底层操作系统为 Linux)提供,无需额外部署,Kubernetes 自动管理节点资源,为所有容器化服务提供运行环境。

核心逻辑

Kubernetes 中的各类资源对象(Deployment/StatefulSet、Service、PVC 等)并非孤立存在,而是通过 "标签(Label)- 选择器(Selector)" 建立关联,形成完整的微服务生态:Nginx 接收外部请求 → 转发至 Tomcat 应用服务 → Tomcat 连接 MySQL 存储数据,全链路依托 Kubernetes 实现资源调度、故障自愈与服务治理。

相关推荐
间彧2 小时前
从Docker到Containerd:Kubernetes容器运行时演进深度解析
kubernetes
d111111111d3 小时前
关于STM32的选项字节的问题:如果我通过操作指针把数据写在了单片机的选项字节区域那么换别的程序时候数据会进行变化吗?
笔记·stm32·单片机·嵌入式硬件·学习
ouliten3 小时前
C++笔记:std::stringbuf
开发语言·c++·笔记
easy_coder3 小时前
Kubernetes:云原生时代的操作系统与思维革命
云原生·kubernetes·云计算
安如衫5 小时前
【机器学习基础】Attention in Transformers:注意力机制
笔记·深度学习·学习·机器学习·注意力机制
十安_数学好题速析5 小时前
幂次之争:巧用对称性破解指数不等式
笔记·学习·高考
せいしゅん青春之我5 小时前
【JavaEE进阶】JVM-面试中的高频考点1
java·网络·jvm·笔记·面试·java-ee
一起养小猫6 小时前
《枕边算法书》阅读笔记:一场从热爱到实践的算法启蒙之旅
笔记
IMPYLH6 小时前
Lua 的 pairs 函数
开发语言·笔记·后端·junit·单元测试·lua