安装MetalLB负载平衡器

在k0s上安装MetalLB负载平衡器。k0s没有内置负载均衡器,但很容易部署MetalLB,如本文档所示。

  • 关于负载均衡器
    负载均衡器可用于将应用程序暴露给外部网络。负载均衡器提供一个IP地址,将传入请求路由到您的应用程序。为了成功创建LoadBalancer类型的Kubernetes服务,
  • 1 . 您需要为Kubernetes提供负载均衡器(实现)。

  • 2 . 负载均衡器可以由云提供商(阿里云,腾讯云)作为外部服务来实现(需要额外费用)。
    这也可以通过MetalLB在Kubernetes集群(纯软件解决方案)内部实现。

MetalLB

MetalLB实现了LoadBalancer类型的Kubernetes服务。当请求LoadBalancer服务时,MetalLB会从配置的范围中分配一个IP地址,并使网络知道该IP“存在”于集群中。

默认情况下,k0s与Kube Router CNI一起运行,只要不使用MetalLB的BGP模式,它就与MetalLB兼容。

apiVersion: k0s.k0sproject.io/v1beta1
kind: ClusterConfig
metadata:
  name: k0s
spec:
  network:
    kubeProxy:
      mode: ipvs
      ipvs:
        strictARP: true

节点之间必须允许端口7946(TCP和UDP)。此外,在安装MetalLB之前,请确保节点上的端口7946上没有运行其他软件,例如docker守护进程。

安装MetalLB

1 . 使用官方Helm chart和k0s Helm扩展管理器安装MetalLB:
https://docs.k0sproject.io/stable/helm-charts/

apiVersion: k0s.k0sproject.io/v1beta1
kind: ClusterConfig
  metadata:
name: k0s
spec:
  extensions:
    helm:
      repositories:
      - name: metallb
        url: https://metallb.github.io/metallb
      charts:
      - name: metallb
        chartname: metallb/metallb
        namespace: metallb

2 . 为MetalLB创建ConfigMap

接下来,您需要创建ConfigMap,其中包括负载平衡器的IP地址范围。IP池必须专用于MetalLB的使用。例如,您不能重用Kubernetes节点IP或其他服务控制的IP。但是,您可以使用私有IP地址,例如: 192.168.1.180-192.168.1.199,但如果您需要外部访问,则需要处理来自外部网络的路由。在这个例子中,我们不需要它。
创建一个YAML文件,并部署它:

kubectl apply -f metallb-12-tool.YAML
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - <ip-address-range-start>-<ip-address-range-stop>
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system

3 . 使用负载均衡部署测试网站(web服务器)

apiVersion: v1
kind: Namespace
metadata:
  name: web
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
  namespace: web
spec:
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: httpd
        image: httpd:2.4.53-alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: web-server-service
  namespace: web
spec:
  selector:
    app: web
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

4 . 检查您的负载平衡器
运行以下命令以查看具有外部ip和端口的LoadBalancer。

kubectl get service -n web

5 . 访问示例应用程序
如果在ConfigMap中为MetalLB使用了私有IP地址(在步骤2中),则应从本地网络运行以下命令。使用上一步中的IP地址。

curl <EXTERNAL-IP>

如果你成功了,你应该看到<html><body><h1>It works!</h1></body></html>。