企业运维训练营之云上网络原理与实践课程
第四讲 负载均衡ALB - 课前答疑
视频地址:
https://developer.aliyun.com/learning/course/991/detail/14982
SLB在ACK和EDAS中的应用场景
1、场景一:K8s中的Service场景
ACK是K8s版本的容器服务,具有高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。
K8s全称为kubernetes,是一个开源的,用于管理云平台中多个主机上的容器化的应用。目标是让部署容器化的应用简单并且高效,K8s提供了应用部署、规划、更新和维护的机制。
K8s中比较重要的组件就是Service(服务),Service是K8s中的专有名词。Service中有很多pod,pod是容器里面直接安装的应用或服务,一个pod相当于一个容器组,Service是很多pod的集合,相当于一个虚拟的负载均衡SLB。
a. 什么是Service?
Service是Kubernetes中的服务发现与负载均衡。
为什么需要服务发现? Kubernetes应用应如何相互调用? Kubernetes应用应如何相互调用?
- Pod生命周期短暂, IP地址随时变化;
- Deployment等的Pod组需要统一访问入口和做负载均衡;
- 应用间在不同环境部署时,保持同样的部署拓扑和访问方式;
- 集群内可以通过service name直接访问;
b. 创建Service暴露服务
- Service为外部请求提供了一个访问入口,外部请求需要通过Service才能访问到内部的pod。
- 因为pod的调度和生成是随机的,也就是说pod没有固定的IP,不需要pod固定在服务器上,pod的数量是根据业务(请求数量)的多少进行自动增减的,外部请求很难找到对应的pod。
- 因为service是pod的集合,随着pod的增加和减少,自动更新它的规则和策略,外部请求可以通过sevice快速找到相应的pod。
c. Service类型
K8s的Service具有以下三种类型的外部访问方式:
- ClusterIP
在集群内单独分配给service使用的IP就叫ClusterIP,只有在集群内部才能访问到ClusterIP,在集群外部是没有办法访问到ClusterIP的。
- NodePort
分配一个集群内部的IP地址,并在每个节点上启用一个端口来暴露服务,可以在集群外部被访问。
- LoadBanancer
分配一个集群内部的IP地址,并在每个节点上启用一个端口来暴露服务,除此之外,kubernetes会请求底层云平台上的负载均衡器,把Node节点作为后端添加进去。LoadBanancer具有Cluster模式和Local模式。
Cluster模式:所有节点都加入SLB后端,如果第一次转发没有命中业务,则需要二次转发;Local模式:SLB可以精确转发到后端业务。
2、场景二:Ingress Controller工作原理
a. Ingress Controller的概念
Ingress是一种K8s资源对象,用于对外暴露服务,该资源对象定义了不同主机名(域名)及URL和对应后端Service ( K8s Service )的绑定,根据不同的路径路由http和https流量。
而Ingress Contoller是一个pod服务,封装了一个 web前端负载均衡器,同时在其基础上实现了动态感知Ingress,并根据Ingress的定义,动态生成前端web负载均衡器的配置文件,比如Nginx Ingress Controller本质上就是一个Nginx,只不过它能根据Ingress资源的定义动态生成Nginx的配置文件,然后动态Reload。
具体实现反向代理及负载均衡的程序,对Ingress定义的规则进行解析,根据配置的规则来实现请求转发。
为了使得Ingress资源正常工作,集群中必须要有个Ingress Controller来解析Ingress的转发规则。Ingress Controller收到请求,匹配Ingress转发规则转发到后端Service,而Service转发到Pod,最终由Pod处理请求。Kubernetes中Service、Ingress与Ingress Controller有着以下关系:
- Service是后端真实服务的抽象, 一个Service可以代表多个相同的后端服务。
- Ingress是反向代理规则,用来规定HTTP/HTTPS请求应该被转发到哪个Service上。例如:根据请求中不同的Host和URL路径,让请求落到不同的Service上。
b. Ingress基本操作:
- name : Ingress的名称,本例为test-ingress
- host :指定服务访问域名
- path :指定访问的url路径。SLB将流量转发到backend之前,所有的入站请求都要先匹配host和path
- backend :由服务名称和服务端口组成
- 服务名称: Ingress转发的backend服务名称
- 服务端口:服务暴露的端口
可以将Ingress配置为服务提供外部可访问的URL、负载均衡流量、终止SSL/TLS,以及提供基于名称的虚拟主机等能力。Ingress控制器通常负责通过负载均衡器来实现Ingress。
c. 最佳实践:部署高可靠Ingress Controller
原则:
- pod多副本,避免单点故障;
- ingress controller部署在单独的节点,避免其他应用抢占资源;
- 根据业务流量水平扩缩容ingress节点或者ingress controller 水平伸缩;
以上是SLB结合ACK的场景,SLB结合EDAS的场景也是类似的,因为EDAS本身就是一个分布式服务的框架,可以加ECS节点,也可以加K8s容器集群,然后加入到SLB的后端。