Kubernetes LoadBalancer
Kubernetes LoadBalancer 是 Kubernetes 中一种服务类型,用于将外部流量分发到集群内的多个 Pod。它通常与云服务提供商的负载均衡器集成,自动创建外部负载均衡器,并将流量路由到匹配的 Service。本指南将详细介绍 LoadBalancer 的概念、工作原理、配置方法及实际应用场景。
概述[编辑 | 编辑源代码]
LoadBalancer 是 Kubernetes Service 的一种类型,扩展了 NodePort 的功能。当创建一个 LoadBalancer 类型的 Service 时,Kubernetes 会:
- 分配一个集群内部的 ClusterIP。
- 在每个节点上开放一个 NodePort。
- 自动请求云提供商(如 AWS、GCP、Azure)配置一个外部负载均衡器,将流量转发到该 Service。
LoadBalancer 适用于需要从集群外部访问服务的场景,例如公开 Web 应用程序或 API。
工作原理[编辑 | 编辑源代码]
LoadBalancer 的工作流程如下: 1. 用户创建 LoadBalancer 类型的 Service。 2. Kubernetes 控制平面与云提供商 API 交互,请求创建负载均衡器。 3. 云提供商配置负载均衡器,并将其指向集群的 NodePort。 4. 外部流量通过负载均衡器的 IP 或 DNS 名称进入,并分发到各个节点上的 NodePort。 5. 节点上的 kube-proxy 将流量转发到后端 Pod。
配置 LoadBalancer Service[编辑 | 编辑源代码]
以下是一个典型的 LoadBalancer Service 的 YAML 配置示例:
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
字段说明[编辑 | 编辑源代码]
- type: LoadBalancer:指定 Service 类型为 LoadBalancer。
- selector:定义哪些 Pod 属于该 Service(通过标签匹配)。
- ports:
* port:Service 暴露的端口(外部访问的端口)。 * targetPort:Pod 上监听的端口。
示例:部署 LoadBalancer Service[编辑 | 编辑源代码]
假设我们有一个名为 `my-app` 的 Deployment,运行在端口 8080 上:
1. 创建 Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: nginx:latest
ports:
- containerPort: 8080
2. 应用 LoadBalancer Service:
kubectl apply -f loadbalancer-service.yaml
3. 检查 Service 状态:
kubectl get svc my-loadbalancer-service
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-loadbalancer-service LoadBalancer 10.96.123.456 203.0.113.10 80:32456/TCP 1m
- EXTERNAL-IP 是云提供商分配的负载均衡器 IP。
- 访问 `http://203.0.113.10` 将流量路由到后端 Pod。
高级配置[编辑 | 编辑源代码]
特定云提供商注解[编辑 | 编辑源代码]
不同云提供商支持通过注解(annotations)自定义负载均衡器行为。例如,在 AWS 上配置 HTTPS 负载均衡器:
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:123456789012:certificate/xxxxxx"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
保留客户端 IP[编辑 | 编辑源代码]
默认情况下,负载均衡器会屏蔽客户端 IP。如需保留,可配置 `externalTrafficPolicy`:
spec:
externalTrafficPolicy: Local
实际应用场景[编辑 | 编辑源代码]
1. 公开 Web 应用:将前端服务暴露给互联网用户。 2. API 网关:为微服务架构提供统一的入口。 3. 混合云部署:在跨云环境中分发流量。
限制与注意事项[编辑 | 编辑源代码]
- LoadBalancer 依赖于云提供商的支持,本地集群(如 Minikube)可能需要额外插件。
- 每个 LoadBalancer Service 通常会产生云服务费用。
- 对于非云环境,可以考虑 MetalLB 等替代方案。
总结[编辑 | 编辑源代码]
Kubernetes LoadBalancer 提供了一种简单的方式将服务暴露到集群外部,并与云基础设施无缝集成。通过合理配置,可以实现高可用、可扩展的流量分发。初学者应从基础配置开始,逐步探索高级功能如 TLS 终止和客户端 IP 保留。