Kubernetes负载均衡器解决方案 MetalLB

      Kubernetes负载均衡器解决方案 MetalLB已关闭评论

[TOC]

1. 介绍

对于 Docker 和 kubernetes , 这里就不多作介绍了,相信大家对它们已经有了足够的了解。

因此,我们应该知道 Kubernetes 没有为我们自建的k8s本地群集提供网络负载平衡器(类型为LoadBalancer的服务)的实现。Kubernetes提供的Network LB的实现都是粘合代码,可以调用各种IaaS平台(GCP,AWS,Azure ……)。如果您未在受支持的IaaS平台(GCP,AWS,Azure …)上运行,则LoadBalancers将在创建时无限期地保持“挂起”状态。

难道我们在公司内部,就因为没有 负载均衡器,就放弃kubernetes集群的使用么?

接下来我们看一下解决的方法:

kubernetes群集默认留下了两个较小的工具来将用户流量带入其集群,“NodePort”“externalIPs”服务。这两种选择都对生产使用具有重大缺点,这使得集群成为Kubernetes生态系统中的二等公民。

为此,MetalLB应运而生,它旨在通过提供与标准网络设备集成的网络LB实现来纠正这种不平衡,以便集群上的外部服务也“尽可能”地工作。

2. 环境介绍

(1)我们要做的
  • 在群集上安装MetalLB,至于 k8s 集群的安装,我想这个就需要你来自己实现了
  • 配置MetalLB以宣布使用第2层模式并为其提供一些要管理的IP地址
  • 创建负载平衡服务,并观察MetalLB如何设置它
(2)环境交代
名称 地址段 描述
kubernetes 集群地址 192.168.20.194-192.168.20.195
MetalLB 使用的地址 192.168.20.20-192.168.20.30 和 k8s集群在一个网段内
kubernetes 网络插件 calico

3. MetalLB的安装

(1)创建 Metallb

MetalLB分为两部分:集群范围的控制器和每主机的 speaker 。

$ kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
namespace/metallb-system created
serviceaccount/controller created
serviceaccount/speaker created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
role.rbac.authorization.k8s.io/config-watcher created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/config-watcher created
daemonset.apps/speaker created
deployment.apps/controller created

从输出中,可以看出,我们都创建了那些资源。

验证

$ kubectl get pods -n metallb-system -o wide
NAME                         READY   STATUS    RESTARTS   AGE     IP               NODE               NOMINATED NODE   READINESS GATES
controller-cd8657667-cfhbq   1/1     Running   0          3m17s   10.244.1.45      c720195.xiodi.cn   <none>           <none>
speaker-hntb2                1/1     Running   0          3m17s   192.168.20.195   c720195.xiodi.cn   <none>           <none>

由于我的集群,只有一个 master 节点和一个 Node 节点,所以可以看到,这里只有一个 controller 和 一个 speaker。如果您的集群有多个 node 节点的话,speaker 相应的也应该有和您 node 节点相同的数量。

目前还没有宣布任何内容,因为我们没有提供ConfigMap,也没有提供负载均衡地址的服务。

(2)配置 MetalLB

我们手工创建一个 configmap

$ vim example-layer2-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: aishangwei.net_pool
      protocol: layer2
      addresses:
      - 192.168.20.20-192.168.20.30

$ kubectl apply -f example-layer2-config.yaml

目前为止,我们就算已经完成了 MetalLB 的配置安装。

需要提醒的是,address 地址需根据你的实际情况来进行修改。

4. 创建负载均衡的服务

Speaker已经加载配置,但尚未执行任何其他操作,因为群集中没有LoadBalancer服务。

创建一个 LoadBalancer 服务来验证。

$ vim nginx-test.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

重点是,我们配置的 type: LoadBalancer

//应用到kubernetes集群

$ kubectl apply -f nginx-test.yaml

$ kubectl get service nginx
NAME    TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
nginx   LoadBalancer   10.110.143.219   192.168.20.20   80:32502/TCP   25s

可以看到,metalLB给我们的kubernetes 服务分配了集群外部可通讯的 IP 。

$ curl http://192.168.20.20
...
<h1>Welcome to nginx!</h1>
...

从测试结果可以看出,我们已经达到了我们的需求。

更多的 关于 DevOps , kubernetes 解决方案,请持续关注我们,您的关注是我们持续前进的动力。