在 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-lb
namespace: wetwin
spec:
#type: ExternalName # 可用于单IP
#externalName: "10.254.18.46"
type: ClusterIP
ports:
- port: 80
protocol: TCP
targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: zl-lb
namespace: wetwin
subsets:
- addresses: #单机IP时不需要
- ip: 10.254.18.46
- ip: 10.254.18.47
ports:
- port: 80
protocol: TCP
再创建 Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-body-size: 500M
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/server-snippet: | #防爬
if ($http_user_agent ~* (Scrapy|Go-http-client|HttpClient|curl)) {
return 403;
}
# 配置负载均衡策略为 round-robin
nginx.ingress.kubernetes.io/load-balancing-scheme: round-robin
# 在响应头中添加真实的客户端 IP 地址
nginx.ingress.kubernetes.io/real-ip-header: X-Real-IP
# 在响应头中添加后端 Pod 名称
nginx.ingress.kubernetes.io/service-name-header: Backend-Pod
name: xxx.your-domain.com
namespace: wetwin #自定义
spec:
ingressClassName: nginx
rules:
- host: xxx.your-domain.com #自定义
http:
paths:
- backend:
service:
name: zl-lb
port:
number: 80
path: /lb/(zl/.*) #自定义
pathType: Prefix
tls: #可选
- hosts:
- xxx.your-domain.com
secretName: 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
,并转发到后端的服务。 -
nginx.ingress.kubernetes.io/load-balancing-scheme: round-robin
注解配置了 Ingress 使用轮询(round-robin)的负载均衡策略。 -
nginx.ingress.kubernetes.io/real-ip-header: X-Real-IP
注解告诉 Ingress 控制器在响应头中添加名为X-Real-IP
的键,其值为真实的客户端 IP 地址。 -
nginx.ingress.kubernetes.io/service-name-header: Backend-Pod
注解告诉 Ingress 控制器在响应头中添加名为Backend-Pod
的键,其值为后端 Pod 的名称。
通过这种方式,您可以灵活地将传入的 URL 路径映射到后端服务的正确路径,而无需在后端服务中硬编码这些路径。这对于迁移或重构现有应用程序非常有用。
除了 rewrite-target
注解,Ingress 还支持其他一些路径重写相关的注解,如 nginx.ingress.kubernetes.io/app-root
、nginx.ingress.kubernetes.io/use-regex
等,您可以根据需求进行配置。
然后模拟后台服务返回:
while true; do nc -lp 80 -c "echo -e 'HTTP/1.1 200 ok\nX-Real-IP: 10.254.18.47\n\nOK'" ;done
访问效果如下 :
大功告成!
作者:sunsky303