service是kubernetes中最核心的资源对象之一,service和pod之间是通过Label串起来,相同的Service的pod的Label是一样的. 同一个service下的所有pod是通过kube-proxy实现负载均衡.而每个service都会分配一个全局唯一的虚拟ip,也就cluster ip.
在该service整个生命周期内,cluster ip保持不变,而在kubernetes中还有一个dns服务,它会把service的name解析为cluster ip。
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。(可以通过Ingress实现)
1 K8s中Service和Ingress的区别
在Kubernetes(K8s)中,Service和Ingress是两种不同的资源对象,它们的主要作用是为Pod提供统一的访问接口,并实现负载均衡和外部访问。下面我们详细解释Service和Ingress的设计和功能,以及它们的区别。
1. Service的设计
Service主要用于解决Pod动态变化时的IP变化问题,为Pod提供一个固定的访问接口。它通过DNS系统实现服务发现功能。Service在集群内部可达,但外部用户无法直接访问。常见的解决方案有:
NodePort:将Pod暴露在每个节点的固定端口上。
ClusterIP:默认类型,只能在集群内部访问。
LoadBalancer:为Service创建一个外部负载均衡器。
ExternalName:将Service映射到外部的DNS名称。
例如:
一个电商网站的前端服务可以定义一个Service,通过LoadBalancer类型暴露给外部用户,这样用户访问这个前端服务时,实际请求会被分配到多个后端Pod上,实现负载均衡。
2. Service的几种类型
- ClusterIP:自动分配一个仅内部访问的虚拟IP。
- NodePort:在每个节点上开放一个固定端口,外部可以通过该端口访问服务。
- LoadBalancer:在NodePort的基础上,提供外部负载均衡IP。
- ExternalName:将Service映射到外部DNS名称。
例如:
定义一个NodePort类型的Service,可以通过kubectl expose deployment my-deployment --type=NodePort --port=80
命令实现,这样外部用户可以通过节点的IP和指定的端口访问到这个服务。
3. Ingress的设计
Ingress提供了七层负载均衡和反向代理功能,可以实现复杂的HTTP和HTTPS路由。相比Service只能提供四层负载均衡,Ingress可以基于URL路径、主机名等进行更细粒度的流量控制。
例如:
通过定义一个Nginx Ingress控制器,可以将不同的URL路径路由到不同的服务,实现类似于API网关的功能。
4. Service和Ingress的区别
- 功能层次:Service提供四层(TCP/UDP)负载均衡,Ingress提供七层(HTTP/HTTPS)负载均衡。
- 用途:Service用于基本的网络访问和负载均衡,Ingress用于复杂的HTTP路由和反向代理。
- 外部访问:Service通过NodePort或LoadBalancer暴露服务,但端口管理复杂;Ingress通过统一入口实现,管理更方便。
例如:
一个网站有多个子服务(如用户服务、订单服务等),可以通过Ingress控制器将不同路径(如/user
、/order
)路由到不同的Service,实现统一入口和管理。
2、简介
1)Ingress是什么?
一种全局的,为代理不同后端Service而设置的负载均衡服务。
2)Ingress组成部分?
Ingress Controller + Ingress
Ingress:K8S中的一个资源对象,作用是定义前端请求如何转发到Service的规则。
Ingress Controller:具体实现反向代理和负载均衡的程序,对Ingress规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,如Nginx、Contor等。
Ingress Controller会根据定义的Ingress对象,提供对应的代理能力。业界常用的各种反向代理项目,如Nginx、HAProxy、Envoy、Traefik等,都已经为K8S维护了对应的Ingress Controller。
上图给出了Ingress的工作方式,其中一系列的Service是Pod向外界暴露的端口,Ingress在Service之前,只连接Service,做Service的负载均衡和反向代理。Ingress是Kubernetes中的一种资源,用于管理集群外部访问集群内部服务的HTTP和HTTPS路由。从工作流程来讲,首先用户创建Ingress资源对象,在这个资源中定义了如主机名(域名)、URL路径规则、后端服务等信息。比如规定了example.com/api路径下的请求应该转发到后端的某个API服务。
Ingress Controller会一直监视Kubernetes API服务器中的Ingress资源变化。当检测到Ingress资源被创建或更新后,它会读取其中的规则。以Nginx Ingress Controller为例,它会根据Ingress规则生成Nginx配置文件。如果Ingress定义了将特定域名下的某些路径请求发送到特定的服务,Ingress Controller就会在Nginx配置中设置对应的server和location块。然后,外部客户端的HTTP/HTTPS请求到达集群时,会先经过Ingress Controller管理的负载均衡器或者反向代理(如Nginx)。这些请求会根据Ingress Controller生成的配置文件进行匹配,从而被路由到对应的后端服务。这就像是一个交通警察,指引着外部的“流量车辆”准确地驶向集群内部正确的服务“目的地”。Ingress和Gateway可以通过以下方式结合:
3、Ingress
Ingress是K8S集群外部访问集群的一个入口,将外部请求转发给集群内不同的Service上,其实就相当于Nginx等负载均衡代理服务器。为什么不能只使用Nginx?因为每次有新服务加入时都需要改Nginx配置,不能滚动更新前端的Nginx-pod,而Ingress就实现了这些Nginx无法实现的功能。
下图展示了一个Ingress负载均衡的实现过程:
Ingress可以配置为向Service提供外部可访问的URL、负载平缓流量、终止SSL/TLS并提供基于名称的虚拟主机。
一个入口控制器负责流量入口,之后通常会跟一个负载均衡器,以处理流量。
Ingress不会公开后台Service所采用的端口和协议。
如果要向Internet公开除了HTTP、HTTPS之外的服务,那么服务的类型(Service.Type)通常是NodePort或LoadBalancer。
4、Service
Service只能通过四层负载(最多到传输层,用到Port),也就是IP+Port的形式来向外界暴露。
两种服务类型存在的弊端:
NodePort:会占用集群机器的很多端口(因为这里的Port用的是Host的Port),当集群服务变多时,这个缺点就越发明显;
LoadBalancer:每个Service都要配一个LB,比较麻烦和浪费资源,且需要K8S意外的LB设备支持。
Ingress与Service的对比
Ingress可以提供七层(直达应用层),可以调度不同的业务域,不同的URL访问路径的业务流量。
5、Ingress工作原理
- 用户编写Ingress Service规则,说明每个域名对应K8S集群中的哪个Service;
- Ingress Controller动态感知到Service规则变化,生成一段对应的Nginx反向代理配置;
- Ingress Controller将生成的Nginx配置写入到一个运行中的Nginx服务中,并动态更新;
- C端发送请求访问域名,Nginx将请求转发到对应的Pod,完成整个请求过程。