在Kubernetes中使用MetalLB为负载均衡器服务配置虚拟IP
简介
当涉及将您的Kubernetes服务暴露给外部客户端时,您有多种选择。两种常用的方法是 NodePort
和 LoadBalancer
。在本文中,我们将深入探讨这两种方法之间的区别,并了解每种方法在满足您特定需求时的适用性。
本文的后续部分旨在指导您在Kubernetes上安装 MetalLB
,并为您提供定义虚拟IP的方法。
NodePort VS LoadBalancer 服务
将您的Kubernetes服务暴露给外部客户端有多种方法。其中一种选择是使用 NodePort
,它在所有工作节点上分配一个端口,范围在 30000
和 32767
之间。然而,它有一些限制。您需要自己处理负载均衡,并且如果其中一个工作节点宕机,您必须意识到并避免向其发送请求,直到它恢复正常。
在下面的图表中,您可以看到一个示例,我使用一个端口号为 31415
的 NodePort
服务部署了一个带有2个副本的示例 nginx
应用程序。客户端应该将其请求发送到其中一个工作节点。无论该Pod是否存在于特定节点上,Kubernetes都会自动代理您的请求到一个Pod所在的工作节点。
另一方面, LoadBalancer
服务将为您的服务创建一个虚拟IP(VIP),客户端无需知道工作机器的IP地址。如下图所示,由Kubernetes创建的VIP( 192.168.2.1
IP)和 LoadBalancer
将自动找到工作节点上的Pod,并直接向它们发送请求。
一般来说,使用 LoadBalancer
服务比 NodePort
更可取,但其可行性取决于基础设施中是否有虚拟IP(VIP)。在像AWS或Azure这样的云环境中,您可以轻松地利用 LoadBalancer
服务,而无需额外的工具。然而,在本地环境中,您需要像 MetalLB
这样的工具来处理此功能。
MetalLB安装(仅适用于本地部署)
如果您在本地环境中,您将需要像 MetalLB
这样的工具来创建VIP。如果您只需要用于测试目的的Kubernetes集群,您可以使用 https://killercoda.com
来创建一个免费的Kubernetes集群,该集群将在1小时后自动终止。
要轻松安装 MetalLB
(假设您正在使用默认的 L2
模式),您可以在Kubernetes集群上使用以下helm命令(需要helm ≥ 3.10
):
yaml
$ kubectl create ns metallb-system
$ helm upgrade --install -n metallb-system metallb \
oci://registry-1.docker.io/bitnamicharts/metallb
接下来,您需要在一个.yaml文件中定义您的IP范围池。例如,您可以将此文件命名为 L2-range-allocation.yaml
,但名称并不重要,您可以选择任何您喜欢的名称。
yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: example
namespace: metallb-system
spec:
addresses:
- 192.168.2.0/24
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: empty
namespace: metallb-system
在提供的文件中,用您想要的CIDR范围替换 192.168.2.0/24
。 /24
表示子网掩码,表示 192.168.2.0
和 192.168.2.256
之间的IP范围。根据您的要求随意修改它。完成必要的更改后,您可以使用以下命令应用配置:
yaml
kubectl apply -f ./L2-range-allocation.yaml
之后,您应该会看到类似以下输出的内容( metallb-speaker
是一个DaemonSet,实例的数量取决于您的Kubernetes工作节点的数量):
yaml
$ kubectl get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
metallb-controller-85748d679-mcvws 1/1 Running 0 84m
metallb-speaker-85vfn 1/1 Running 0 84m
metallb-speaker-8f9bt 1/1 Running 0 84m
metallb-speaker-tt9hg 1/1 Running 0 84m
metallb-speaker-wsr4s 1/1 Running 0 84m
生成第一个VIP
生成初始VIP。现在,您可以在Kubernetes中利用 LoadBalancer
服务类型,并使用 MetalLB
获取一个实际的VIP。假设您想部署一个示例应用程序,比如 Nginx
,并获取一个VIP来处理请求,而无需 NodePort
。
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: LoadBalancer
从上面的示例文件中,您可以观察到我已经创建了一个 Nginx
的示例部署,以及一个 LoadBalancer
的服务(请注意 type: LoadBalancer
部分)。
要继续操作,您可以将上述的 .yaml
文件保存为示例文件,例如 deployment.yaml
,然后使用以下命令应用它:
yaml
$ kubectl apply -f deployment.yaml
然后您可以使用以下命令查看您的服务:
yaml
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 31d
nginx LoadBalancer 10.43.177.15 192.168.2.1 80:32186/TCP 2m18s
如上所示, EXTERNAL-IP
(或VIP)是 192.168.2.1
,属于IP范围 192.168.2.0/24
。您可以使用以下地址向该IP发送请求:
yaml
$ curl 192.168.2.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
结论
总之,了解NodePort和LoadBalancer服务之间的区别,使您能够根据基础设施需求做出明智的决策。无论您选择NodePort还是选择方便的LoadBalancer服务,Kubernetes都提供了灵活的选项来有效地暴露和管理您的服务。
我们希望本文能为您选择适合Kubernetes部署的服务类型提供有价值的见解,从而提高您应用程序的可访问性和可靠性。