当前位置: 首页 > 工具软件 > metallb > 使用案例 >

k8s学习: 使用 MetalLB 给测试环境配置LoadBalancer 服务

梁豪
2023-12-01

学习 Ingress ,推荐使用 LoadBalancer 方式

虽然 NodePort 方式是可以的,但是,理解起来费劲,何况 NodePort 并不适合用于生产环境!

但是,普通学习环境是不支持 LoadBalancer 的 !
幸好有个开源的 MetalLB 可以提供裸机测试环境下 LoadBalancer 支持

重点是为了下一步学习 Ingress ,所以,简单学会 Layer 2 方式, BGP 方式以后再说

METALLB官网

安装

MetalLB 安装文档

官方文档安装方式很完整!

Helm 方式安装

我先使用 Helm 安装上了(确实简单),但是,他那个 value.yaml 配置的 192.168.1.0/24 ,第一个测试例子直接分配到 192.168.1.1 ,这个和我的网关地址一样!
Helm uninstall ,修改了 value.yaml 之后,再安装却死活找不到了

	# helm install metallb metallb/metallb -f values.yaml
	Error: INSTALLATION FAILED: failed to download "metallb/metallb"

只好改用 Manifest 文件方式

  1. 先下载他的 2 个文件,检查一下里面有没有被墙的 image

    wget https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml --no-check-certificate

    wget https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml --no-check-certificate

    里面的 image: quay.io/metallb/controller:v0.11.0
    这个 quay.io 好像没有被墙,无需替换镜像源了,可以直接 pull!

    拿不准的话,可以试试 https://quay.io/ 能不能访问

    文档比较害人
    The installation manifest does not include a configuration file. MetalLB’s components will still start, but will remain idle until you define and deploy a configmap.

    意思是前面 2 个 apply 之后,还需要配置之后才能 running!
    初学时,一旦看到 Pending 或者 err ,就茫然了,踩过一次坑之后才能学会!

  2. 准备好config 文件
    config 文件样本在这里 MetalLB Config配置 文档

    所以,最好准备好这 3 个文件之后,再继续

     [root@centos7-188 metaLB]# ls
     config.yaml  metallb.yaml  namespace.yaml  value.yaml
    

    依次 apply

      kubectl apply -f namespace.yaml 
      kubectl apply -f config.yaml
      kubectl apply -f metallb.yaml 
    

    检查所有 metallb-system 的 pod 和 svc 都 running

    kubectl get pods -A

    kubectl get pods -n metallb-system

     NAME                          READY   STATUS    RESTARTS   AGE
     controller-7dcc8764f4-4dv8d   1/1     Running   0          82m
     speaker-glv2l                 1/1     Running   0          82m
     speaker-kcnp4                 1/1     Running   0          82m
     speaker-vr5mm                 1/1     Running   0          82m
    

测试

  1. 找个简单的 nginx 试试,Service 方式改成 LoadBalancer

    [root@centos7-188 nginx]# cat demo1.yaml

     apiVersion: v1
     kind: Service
     metadata:
       name: demo1
       namespace: default
       labels:
         app: demo1
     spec:
       type: LoadBalancer
       ports:
         - port: 80
           targetPort: http
           protocol: TCP
           name: http
       selector:
         app: demo1
      
      
     ---
      
      
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: demo1-deployment
       namespace: default
       labels:
         app: demo1
     spec:
       replicas: 2
       selector:
         matchLabels:
           app: demo1
       template:
         metadata:
           labels:
             app: demo1
         spec:
           containers:
           - name: demo1
             image: nginx
             ports:
               - name: http
                 containerPort: 80
                 protocol: TCP
    
    1. kubectl apply -f demo1.yaml

    2. 检查 pod 和 svc

      kubectl get pods -A

       NAMESPACE        NAME                                        READY   STATUS      RESTARTS      AGE
       default          demo-654c477f6d-m2m8r                       1/1     Running     0             68m
       default          demo1-deployment-796f585477-bzltz           1/1     Running     0             85m
       default          demo1-deployment-796f585477-w5qgz           1/1     Running     0             85m
       
       ...
      

      kubectl get svc

        NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
       demo         ClusterIP      10.109.183.133   <none>          80/TCP         68m
       demo1        LoadBalancer   10.103.89.77     192.168.1.240   80:31590/TCP   86m
       kubernetes   ClusterIP      10.96.0.1        <none>          443/TCP        125m
      
    3. 测试一下
      cluster 内访问,curl 10.103.89.77
      cluster 外访问,curl 192.168.1.240

      效果是一样的!不再需要 暴露 nodePort ,也不再需要 proxy !
      metalLB 对外提供了一个统一的地址:192.168.1.240

       <!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>
      
 类似资料: