在 Kubernetes (K8s) 中,Ingress、Endpoints 和 Service 是三个重要的概念,它们协作实现了集群内部和外部应用程序的访问和服务发现。
Ingress:
- Ingress 用于提供集群外部到集群内部服务的 HTTP/HTTPS 路由。
- Ingress 定义了访问集群内部服务的规则,如路径映射、虚拟主机等。
- Ingress 通常需要搭配 Ingress Controller 来实现实际的流量转发和负载均衡。
- Ingress 位于应用程序的前端,处理七层(HTTP/HTTPS)流量。
Endpoints:
- Endpoints 用于记录提供某个 Service 的 Pod 的 IP 地址和端口信息。
- Endpoints 由 Kubernetes 根据 Pod 的变化自动创建和管理,生命周期与 Pod 相关。
- Endpoints 位于应用程序的后端,主要用于服务发现,记录提供服务的 Pod 信息。
- Endpoints 通过 Pod 的 IP 地址和容器端口直接提供访问。
Service:
- Service 用于对外暴露应用程序的访问入口,提供四层(TCP/UDP)的负载均衡功能。
- Service 由用户通过 YAML 文件进行配置,生命周期独立于 Pod。
- Service 位于应用程序的前端,处理四层(TCP/UDP)流量。
- Service 通过 ClusterIP、NodePort 或 LoadBalancer 方式提供访问。
Ingress、Endpoints 和 Service 的关系:
- Ingress 定义了从集群外部到集群内部服务的 HTTP/HTTPS 路由规则。
- Service 根据 Endpoints 信息提供四层负载均衡,Endpoints 记录了提供服务的 Pod或 IP信息。
- Ingress 将流量转发到对应的 Service,Service 再根据 Endpoints 信息进行负载均衡和流量分发。
总的来说,Ingress、Endpoints 和 Service 在 K8s 中协作完成了应用程序的访问和服务发现。Ingress 负责处理集群外部到集群内部的 HTTP/HTTPS 流量路由,Service 提供了应用程序的访问入口和四层负载均衡功能,Endpoints 则记录了提供服务的 Pod或 IP信息。它们共同实现了 K8s 中应用程序的访问和部署。
以下是给多个外部静态IP作负载均衡、反向代理,先创建 Service+Endpoints:
apiVersion: v1
kind: Service
metadata:name: zl-lbnamespace: wetwin
spec:#type: ExternalName # 可用于单IP#externalName: "10.254.18.46" type: ClusterIPports:- port: 80protocol: TCPtargetPort: 80---
apiVersion: v1
kind: Endpoints
metadata:name: zl-lbnamespace: wetwin
subsets:
- addresses: #单机IP时不需要- ip: 10.254.18.46- ip: 10.254.18.47ports:- port: 80protocol: TCP
再创建 Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/proxy-body-size: 500Mnginx.ingress.kubernetes.io/rewrite-target: /$1nginx.ingress.kubernetes.io/server-snippet: | #防爬if ($http_user_agent ~* (Scrapy|Go-http-client|HttpClient|curl)) {return 403;}name: xxx.your-domain.comnamespace: wetwin #自定义spec:ingressClassName: nginxrules:- host: xxx.your-domain.com #自定义http:paths:- backend:service:name: zl-lbport:number: 80path: /lb/(zl/.*) #自定义pathType: Prefixtls: #可选- hosts:- xxx.your-domain.comsecretName: xxx.com
status:loadBalancer:ingress:- ip: 10.254.18.55 #出口IP
在这个示例中:
nginx.ingress.kubernetes.io/rewrite-target: /$1
注解告诉 Ingress 控制器将匹配到的 URL 路径中的捕获组$1
重写到后端服务的实际路径。path: /xxx/(.*)
定义了一个前缀匹配路径/xxx/
,并使用一个捕获组(.*)
来捕获后面的任意路径。- 当用户访问
/xxx/anything
时,Ingress 控制器会将请求重写为/anything
,并转发到后端的服务。
通过这种方式,您可以灵活地将传入的 URL 路径映射到后端服务的正确路径,而无需在后端服务中硬编码这些路径。这对于迁移或重构现有应用程序非常有用。
除了 rewrite-target
注解,Ingress 还支持其他一些路径重写相关的注解,如 nginx.ingress.kubernetes.io/app-root
、nginx.ingress.kubernetes.io/use-regex
等,您可以根据需求进行配置。
效果如下 :