14 服务与负载均衡之负载均衡

在上一篇中,我们介绍了 Kubernetes 服务类型的基本概念,了解了不同的服务类型如何将流量路由到后端的 Pods。本文将进一步探讨与服务相关的另一重要主题——负载均衡。

负载均衡是将 incoming 请求分配到多个后端服务器的过程,以确保没有单个服务器受到过多流量的冲击,这对于保持应用程序的可用性和性能至关重要。在 Kubernetes 中,负载均衡主要通过几种方式实现。

负载均衡的基本概念

Kubernetes 中的负载均衡可以分为两个主要层面:

  1. Cluster 内部负载均衡
  2. 外部负载均衡

在介绍这两种负载均衡之前,我们需要先了解与之相关的一些基本概念。

Cluster 内部负载均衡

Kubernetes 提供了一个 Service 对象,用于将请求路由到符合特定选择器的 Pods。Kubernetes 使用 kube-proxy 来实现负载均衡,以下是实现流程简述:

  • 当一个 Service 被创建时,Kubernetes 系统会为其分配一个虚拟 IP(Cluster IP)。
  • 当请求发送到这个虚拟 IP 时,kube-proxy 将会把请求负载均衡到后端的 Pods。
  • kube-proxy 实现了几种负载均衡算法,包括轮询(Round Robin)、最少连接(Least Connections)等。

外部负载均衡

对于希望从集群外部访问 Kubernetes 服务的场景,通常会涉及到外部负载均衡。在此情况下,通常会使用 LoadBalancer 类型的 Service,或者结合 Ingress 控制器来实现。

LoadBalancer 类型的 Service

当使用 LoadBalancer 类型的 Service 时,Kubernetes 会与云服务提供商集成,自动创建一个外部负载均衡器,该负载均衡器将流量转发到 Kubernetes 中的 Service:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
targetPort: 8080

在此示例中,当 my-service 被创建时,云服务提供商会为其分配一个公共 IP,并把流量负载均衡分发到所有匹配 app: my-app 标签的 Pods 中。

通过 Ingress 实现负载均衡

除了直接使用 LoadBalancer 类型的 Service,Kubernetes 还支持使用 Ingress 控制器进行外部流量的管理。Ingress 提供了一种更灵活的方式来进行负载均衡以及路由:

  1. 使用单个 IP 地址处理多个服务。
  2. 基于路径或域名进行路由。

示例:使用 Ingress 进行负载均衡

下面是一个使用 Ingress 的简单示例:

  1. 创建一个包含两个服务的应用程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
apiVersion: apps/v1
kind: Deployment
metadata:
name: app1
spec:
replicas: 2
selector:
matchLabels:
app: app1
template:
metadata:
labels:
app: app1
spec:
containers:
- name: app1
image: myapp1:latest
ports:
- containerPort: 80

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: app2
spec:
replicas: 2
selector:
matchLabels:
app: app2
template:
metadata:
labels:
app: app2
spec:
containers:
- name: app2
image: myapp2:latest
ports:
- containerPort: 80
  1. 为这两个应用创建服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: v1
kind: Service
metadata:
name: app1-service
spec:
selector:
app: app1
ports:
- protocol: TCP
port: 80
targetPort: 80

---

apiVersion: v1
kind: Service
metadata:
name: app2-service
spec:
selector:
app: app2
ports:
- protocol: TCP
port: 80
targetPort: 80
  1. 创建一个 Ingress 资源,以便将流量路由到不同的服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- path: /app2
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80

在这个 Ingress 规则中,所有以 /app1 开头的请求将被路由到 app1-service,而以 /app2 开头的请求将被路由到 app2-service。这样,我们就实现了不同服务的流量负载均衡。

负载均衡配置要点

1. 健康检查

确保 Kubernetes 能够进行健康检查,以便在某些 Pods 出现故障时自动停止发送流量。这通常通过在 Deployment 中配置 readinessProbelivenessProbe 来实现。

2. 适当选择 Service 类型

根据需求选择合适的 Service 类型。例如,在开发环境中可以使用 NodePort,而在生产环境中更推荐使用 LoadBalancerIngress

3. 监控和日志

通过工具如 Prometheus 和 Grafana 监控负载均衡服务的性能,并通过日志分析获取有价值的信息。

总结

通过合理配置 Kubernetes 中的负载均衡策略,可以确保应用的可用性和高效性。在上一篇中,我们提到的 Service 类型以及本篇中讨论的负载均衡相结合,可以充分发挥 Kubernetes 的优势,推广至更大规模的应用。接下来,我们将讨论 Ingress 控制器,它是处理外部流量的重要工具,进一步拓宽服务与负载均衡的边界。

14 服务与负载均衡之负载均衡

https://zglg.work/kubernetes-zero/14/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论