我对入口和负载均衡器在Kubernetes中的角色感到非常困惑。
据我所知,Ingress用于将来自internet的传入流量映射到集群中运行的服务。
负载均衡器的作用是将流量转发到主机。在这方面,入口与负载均衡器有什么不同?另外,与Amazon ELB和ALB相比,kubernetes内部的负载均衡器的概念是什么?
我对入口和负载均衡器在Kubernetes中的角色感到非常困惑。
据我所知,Ingress用于将来自internet的传入流量映射到集群中运行的服务。
负载均衡器的作用是将流量转发到主机。在这方面,入口与负载均衡器有什么不同?另外,与Amazon ELB和ALB相比,kubernetes内部的负载均衡器的概念是什么?
当前回答
简单地说,负载均衡器将请求分配给多个后端服务(相同类型),而入口更像一个API网关(反向代理),它根据URL将请求路由到特定的后端服务。
其他回答
pod有自己的IP:PORT,但它本质上是动态的,如果删除或重新部署会发生变化。
服务被分配ClusterIPor NodePort(创建服务资源的虚拟机中的端口),可以映射到一组pod或其他后端[参见:无头服务]
要访问正确的Pod,请使用ClusterIP(从集群内部) NodePort可以用于从集群外部访问pods
LoadBalancer[外部/内部]:由云提供商提供,指向ClusterIP或NodePort。您可以通过LB的IP访问该服务
LB ~> SERVICE(ClusterIP或NodePort) ~> POD
入口资源是集群的入口点。负载均衡可以侦听入路规则,并路由到特定的服务。[请看这个例子]
LB(Ingress-managed) ~> SERVICE(ClusterIP或NodePort) ~> POD
负载均衡器:kubernetes LoadBalancer服务是一种指向外部负载均衡器的服务,这些负载均衡器不在kubernetes集群中,但存在于其他地方。它们可以与您的舱一起工作,假设您的舱是外部可路由的。谷歌和AWS在本地提供此功能。就Amazon而言,当在AWS中运行时,它直接与ELB和kubernetes映射,可以为部署的每个LoadBalancer服务自动提供和配置ELB实例。
Ingress: Ingress实际上就是一组要传递给正在监听它们的控制器的规则。你可以部署一堆入口规则,但是除非你有一个可以处理它们的控制器,否则什么都不会发生。LoadBalancer服务可以监听入口规则,如果它被配置为这样做的话。
您还可以创建NodePort服务,该服务在集群外有一个外部可路由的IP,但指向集群内存在的pod。这可能是一个入口控制器。
入口控制器是一个简单的pod,它被配置为解释入口规则。kubernetes支持的最流行的入口控制器之一是nginx。在Amazon方面,ALB可以用作入口控制器。
例如,这个nginx控制器能够摄取你定义的入口规则,并将它们转换为nginx.conf文件,并在它的pod中加载和启动。
假设你定义了一个入口,如下所示:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/rewrite-target: /
name: web-ingress
spec:
rules:
- host: kubernetes.foo.bar
http:
paths:
- backend:
serviceName: appsvc
servicePort: 80
path: /app
如果你检查你的nginx控制器pod,你会看到/etc/nginx.conf中定义了以下规则:
server {
server_name kubernetes.foo.bar;
listen 80;
listen [::]:80;
set $proxy_upstream_name "-";
location ~* ^/web2\/?(?<baseuri>.*) {
set $proxy_upstream_name "apps-web2svc-8080";
port_in_redirect off;
client_max_body_size "1m";
proxy_set_header Host $best_http_host;
# Pass the extracted client certificate to the backend
# Allow websocket connections
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Real-IP $the_real_ip;
proxy_set_header X-Forwarded-For $the_x_forwarded_for;
proxy_set_header X-Forwarded-Host $best_http_host;
proxy_set_header X-Forwarded-Port $pass_port;
proxy_set_header X-Forwarded-Proto $pass_access_scheme;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Scheme $pass_access_scheme;
# mitigate HTTPoxy Vulnerability
# https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
proxy_set_header Proxy "";
# Custom headers
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
proxy_redirect off;
proxy_buffering off;
proxy_buffer_size "4k";
proxy_buffers 4 "4k";
proxy_http_version 1.1;
proxy_cookie_domain off;
proxy_cookie_path off;
rewrite /app/(.*) /$1 break;
rewrite /app / break;
proxy_pass http://apps-appsvc-8080;
}
Nginx刚刚创建了一条规则,将http://kubernetes.foo.bar/app路由到集群中的服务appsvc。
下面是一个如何使用nginx入口控制器实现kubernetes集群的示例。
Loadbalancer服务:是一个四层代理(TCP, UDP,..)。它运行在Kubernetes集群网络之外。它没有第七层的功能:断路器,测量请求的数量,请求的延迟,失败,路由,…
ingress:是一个第七层代理(http, https, gRPC,..)。它是Kubernetes集群网络中pod中的一个应用程序。如果入口pod死亡,Kubernetes将重新启动它或将其移动到集群中的其他节点。
Feature |
Ingress |
Load Balancer |
---|---|---|
Protocal | HTTP level (Network layer 7) | Network layer 4 |
Additional Features | cookie-based session affinity, Ingress rules, Resource backends, Path types | Only balance the load |
Dependency | Ingress controller need to be running. Different Kubernetes environments use different implementations of the controller, but several don’t provide a default controller at all. | No dependency, Built-in support with K8 |
YAML manifest | There is separate API for it. apiVersion: networking.k8s.io/v1 |
type: LoadBalancer |
How it work | Client connected to one of the pods through Ingress controller. The client first performed a DNS lookup of example.com, and the DNS server (or the local operating system) returned the IP of the Ingress controller. The client then sent an HTTP request to the Ingress controller and specified example.com in the Host header. From that header, the controller determined which service the client is trying to access, looked up the pod IPs through the Endpoints object associated with the service, and forwarded the client’s request to one of the pods. | The load balancer redirects traffic to the node port across all the nodes. Clients connect to the service through the load balancer’s IP. |
我强烈推荐阅读NodePort vs LoadBalancer vs Ingress?知识++
There are 4 ways to allow pods in your cluster to receive external traffic: 1.) Pod using HostNetworking: true and (Allows 1 pod per node to listen directly to ports on the host node. Minikube, bare metal, and rasberry pi's sometimes go this route which can allow the host node to listen on port 80/443 allow not using a load balancer or advanced cloud load balancer configurations, it also bypasses Kubernetes Services which can be useful for avoiding SNAT/achieving similar effect of externalTrafficPolicy: Local in scenarios where it's not supported like on AWS.) 2.) NodePort Service 3.) LoadBalancer Service (Which builds on NodePort Service) 4.) Ingress Controller + Ingress Objects (Which builds upon the above)
假设你的集群中有10个网站,你想把它们全部暴露给外部流量。 *如果你使用LoadBalancer服务类型,你将生成10个HA云负载均衡器(每个都需要花钱) *如果你使用类型Ingress Controller,你将生成1个HA云负载均衡器(节省资金),它将指向一个Ingress Controller在你的集群中运行。 一个入口控制器是:
由集群中运行的pod部署支持的负载均衡器类型的服务。 每个豆荚做两件事: 充当在集群内运行的第7层负载均衡器。(Nginx很受欢迎) 根据集群中的入口对象动态配置自身 (入口对象可以被认为是第7层负载均衡器的声明性配置片段。)
集群内的L7 LB/Ingress Controller负载均衡/反向代理流量到集群内的集群IP服务,如果你有一个TLS证书类型的Kubernetes Secret,它也可以终止HTTPS,并引用它的Ingress对象。)