
第一层:Deployment—应用的载体
1. Deployment概述
Deployment是Kubernetes中管理Pod生命周期的核心控制器,本身不负责流量转发。它管控应用实例的运行状态、副本数量以及版本更新策略。
Deployment不会对外暴露网络访问入口,它创建的Pod属于集群内部网段,IP地址临时且不固定。为了屏蔽Pod重建、漂移所带来的IP变化,就需要Service的这一层抽象来提供稳定访问入口。Deployment的关键特性如下表所示:
2. Deployment部署
[Step1] 本地新建YAML清单,定义Deployment资源描述模板。基于Nginx镜像部署WEB应用,设置应用副本数量为2个。
root@k8s-master:~# vim nginx-deployment.yaml
# 写入下列内容
apiVersion: apps/v1 # 固定配置
kind: Deployment # 资源类型
metadata:
name: web-app
spec:
replicas: 2 # 预期副本数量
selector:
matchLabels: # 标签匹配模式:精确匹配
app: web # 匹配的标签值
template: # 对Pod模板的定义,至少要定义一个Label
metadata:
labels:
app: web # 定义Pod的标签,需要和Selector定义一致
spec:
containers: # 定义容器的属性
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80[Step2] 基于YAML清单向Kubernetes集群声明式地创建Deployment资源。
root@k8s-master:~# kubectl create -f nginx-deployment.yaml[Step3] 验证:查看当前集群中的名为web-app的Deployment资源。
root@k8s-master:~# kubectl get deployments.apps web-app
[Step4] 筛选标签为app=web的Pod并查看详细信息,可以看到2个以web-app开头的Pod以及对应的详细运行信息。
root@k8s-master:~# kubectl get pods -l app=web -o wide
[Step5] 此时访问后端业务Pod的方式是通过Pod IP。
root@k8s-master:~# curl -I http://10.0.2.125
root@k8s-master:~# curl -I http://10.0.1.99
第二层:Service—内部服务发现与负载均衡
1. Service概述
Service是Kubernetes里非常核心的资源,提供固定的访问入口,用于对接一组随时可能发生变化的Pod。属于四层负载均衡,工作在传输层,不解析HTTP等七层协议内容。
2.1 Service的四种类型
2.3 Service的局限
Service属于四层负载均衡,工作在传输层,仅依靠IP地址和端口完成流量转发,不会解析HTTP请求内容。无法识别域名(Host)、URL路径(Path)、Cookie、请求头(Header)这类应用层特征,不能基于这些条件做路由分流。如果需要基于HTTP应用层特征实现灵或的路由控制,则需要七层负载均衡资源Ingress。
2. Service工作机制
下图是Service到后端Pod的流量转发示意图,描述四层负载均衡的工作流程:
Service: web-app-svc:集群内分配固定ClusterIP 10.96.2.15,Service端口80,转发目标端口targetPort为80,访问10.96.2.15时,流量会转发到Pod的80端口。
kube-proxy:节点上的kube-proxy支持iptables和IPVS两种工作模式,负责维护流量转发规则,完成流量分发和实现负载均衡。kube-proxy持续监听新增和删除事件,自动更新对应的转发规则,把访问ClusterIP的请求均衡分发到后端Pod。
Endpoints(端点):Endpoints资源记录了当前就绪Pod的真实IP和端口,是Service和Pod之间的桥梁。这里一共有三个Pod,kube-proxy收到请求后,会将流量轮询分发到这三个Pod的80端口。Endpoints由endpoints-controller控制器自动维护。

3. 部署Service
[Step1] 本地新建YAML文件,创建ClusterIP类型的Service。
root@k8s-master:~# vim nginx-service.yaml
# 写入下列内容
apiVersion: v1 # 固定配置
kind: Service # 资源类型
metadata:
name: web-app-svc
spec:
type: ClusterIP # Service类型
selector: # 标签选择器,匹配后端Pod
app: web # 匹配后端Pod的标签
ports:
- port: 80 # Service自身暴露的端口
targetPort: 80 # 后端Pod实际监听的端口
protocol: TCP # 使用TCP协议[Step2] 根据YAML文件向Kubernetes集群声明式地创建Service资源。
root@k8s-master:~# kubectl create -f nginx-service.yaml[Step3] 查看当前集群中的名为web-app-svc的Service资源。
root@k8s-master:~# kubectl get services web-app-svc
[Step4] 此时访问后端业务Pod的方式可以通过Service分配的ClusterIP,Service会以轮询的方式,将请求流量分发到后端两个Pod。
root@k8s-master:~# curl -I http://172.17.10.102
第三层:Ingress—七层路由规则
1. Ingress概述
Ingress是Kubernetes中声明式API资源,专门用于定义HTTP、HTTPS应用层路由规则,支持基于域名、URL路径实现流量分发。Ingress本身不具备转发流量的能力,只负责描述路由需求,真正处理流量的是Ingress Controller,它以Pod的形式运行在集群节点上。当Ingress资源创建或修改时,Ingress Controller会监听资源变更,自动读取Ingress的规则并更新内部反向代理的配置,完成七层流量路由。
3.1 Ingress的核心字段
3.2 PathType详解
2. Ingress局限性
Ingress资源本身需要Ingress Controller才能生效,如果没有部署对应的控制器,仅创建Ingress的YAML配置,只是一份静态规则,无法处理任何网络流量。
Ingress处理HTTP/HTTPS协议流量,TCP/UDP这类四层流量转发,不能依靠Ingress实现,一般使用NodePort或LoadBalancer类型的Service。
Ingress的路由能力比较基础,原生不支持A/B测试、灰度发布、熔断、限流等高级流量管控功能。这类复杂流量治理场景,通常需要借助服务网格(如Istio)实现。
3. 部署Ingress
[Step1] 配置Ingress之前需要提前部署Ingress控制器。查看ingress-nginx命名空间下所有Pod,admission相关Pod状态为Completed且controller控制器Pod状态为Running,表示控制器就绪,可以正常使用。
root@k8s-master:~# kubectl -n ingress-nginx get pods
[Step2] 查看当前集群中IngressClass资源,确认集群内已存在且可用的控制器绑定项。
root@k8s-master:~# kubectl get ingressclasses.networking.k8s.io
[Step3] 本地新建YAML清单,定义Ingress资源描述模板。
root@k8s-master:~# vim nginx-ingress.yaml
# 写入下列内容
apiVersion: networking.k8s.io/v1 # 固定配置
kind: Ingress # 资源类型
metadata:
name: web-ingress
annotations: # 路径重写注解
# 将匹配到的请求路径统一替换为/再转发后端
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
# 指定使用的IngressClass
ingressClassName: nginx
rules: # 路由规则
- host: www.meaauf.com # 当访问www.meaauf.com时,转发到后端服务
http:
paths:
- path: / # 匹配以/开头的路径,也就是全部路径
pathType: Prefix # 路径匹配规则:前缀匹配
backend: # 匹配成功后,流量转发到哪
service: # 转发到Service
name: web-app-svc # Service的名称
port: # 端口配置
number: 80 # 转发Service的80端口[Step4] 基于YAML清单向Kubernetes集群声明式地创建Ingress资源。
root@k8s-master:~# kubectl create -f nginx-ingress.yaml[Step5] 查看当前集群中的名为web-ingress的Ingress资源。
root@k8s-master:~# kubectl get ingress web-ingress
[Step6] 本地临时添加域名解析,域名指向ADDRESS。
root@k8s-master:~# echo "192.168.8.100 www.meaauf.com" >> /etc/hosts[Step7] 此时可以通过域名访问后端业务Pod,Ingress按照预定义的路由规则转发流量至Service,Service再以轮询形式分发到后端两个Pod。
root@k8s-master:~# curl -I www.meaauf.com
第四层:IngressClass—控制器的身份标识
1. IngressClass概述
IngressClass属于集群级资源,作用是建立Ingress资源与Ingress控制器之间的绑定关系,用于指定哪一个Ingress控制器解析并执行Ingress路由规则。
当集群内部同时部署多个不同类型的Ingress控制器,例如Nginx Ingress、Traefik时,依靠IngressClass进行区分,Ingress资源通过“ingressClassName”字段选定对应的控制器,避免路由规则被错误的控制器处理。
2. IngressClass核心字段
3. 多控制器共存场景

4. 集群默认IngressClass资源
部署Nginx Ingress控制器后,集群会自动创建一份IngressClass资源,名称默认为nginx,spec.controller字段为“k8s.io/ingress-nginx”。该资源建立Ingress和Nginx Ingress控制器的绑定关系,Ingress清单中填写“ingressClassName: nginx”,对应的路由规则就会交给Nginx Ingress控制器处理。
[Step1] 查看当前集群自动创建的IngressClass资源。
root@k8s-master:~# kubectl get ingressclasses.networking.k8s.io nginx -o yaml
第五层:四者关系总结
1. 依赖关系链
四层对象的核心关系可以概括为:
2. 数据面与控制面分离
一个核心设计原则:Service与Ingress Controller属于数据面,负责实际转发、处理业务流量。Ingress和IngressClass属于控制面,仅作为配置声明资源,本身不承载流量。
3. 理解抽象模型
Kubernetes的流量架构是一个典型的分层抽象模型:
Deployment管理应用实例的生命周期,屏蔽Pod的临时性
Service提供稳定的网络端点和L4负载均衡,屏蔽Pod IP的变化
Ingress提供L7路由能力,支持域名和路径级别的流量分发
IngressClass解决多控制器共存问题,明确路由规则的执行主体
四者之间的关系可以简化为一条依赖链,理解这条链的本质是:从内到外,每一层都在解决上一层的抽象需求。Deployment解决Pod的临时性问题,Service解决Pod IP的变化问题,Ingress解决L7路由问题,IngressClass解决多控制器选择问题。掌握这个模型后,无论是设计流量架构还是排查网络问题,都能够从全局视角快速定位根因。

4. 整体关系图
Kubernetes的三个对象容易混,是因为其中只有一个真正参与处理流量,如下图所示。三个对象中只有Service位于流量路径上,Ingress和IngressClass都只是配置。真正转发请求的是Ingress Controller(一个Pod),它读取Ingress规则并据此配置自己的代理(Nginx/Envoy等)。

