本地环境中使用Kubernetes负载均衡器服务

在Kubernetes中使用MetalLB为负载均衡器服务配置虚拟IP

简介

当涉及将您的Kubernetes服务暴露给外部客户端时,您有多种选择。两种常用的方法是 NodePortLoadBalancer 。在本文中,我们将深入探讨这两种方法之间的区别,并了解每种方法在满足您特定需求时的适用性。

本文的后续部分旨在指导您在Kubernetes上安装 MetalLB ,并为您提供定义虚拟IP的方法。

NodePort VS LoadBalancer 服务

将您的Kubernetes服务暴露给外部客户端有多种方法。其中一种选择是使用 NodePort ,它在所有工作节点上分配一个端口,范围在 3000032767 之间。然而,它有一些限制。您需要自己处理负载均衡,并且如果其中一个工作节点宕机,您必须意识到并避免向其发送请求,直到它恢复正常。

在下面的图表中,您可以看到一个示例,我使用一个端口号为 31415NodePort 服务部署了一个带有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.0192.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部署的服务类型提供有价值的见解,从而提高您应用程序的可访问性和可靠性。

相关推荐
桂月二二1 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
007php0072 小时前
linux服务器上CentOS的yum和Ubuntu包管理工具apt区别与使用实战
linux·运维·服务器·ubuntu·centos·php·ai编程
qq_429856573 小时前
linux 查看服务是否开机自启动
linux·运维·服务器
就爱学编程3 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言
hgdlip4 小时前
IP属地和所在地不一致什么意思?怎么换成另外一个地方的
服务器·网络协议·tcp/ip
KevinRay_4 小时前
命令行之巅:Linux Shell编程的至高艺术(中)
linux·运维·服务器·重定向·shell编程
DashVector5 小时前
如何通过HTTP API分组检索Doc
服务器·数据库·http·数据库开发·数据库架构
我叫czc5 小时前
【Python高级366】静态Web服务器开发
服务器·前端·python
nbsaas-boot6 小时前
如何更高效地使用乐观锁提升系统性能
java·服务器·数据库
努力的小T7 小时前
Linux apt-mirror 同步搭建本地源详解教程
linux·运维·服务器·ubuntu·云计算·debian