17-Metallb第三方组件实现暴露LoadBalancer应用

一、metallb概述

​ 如果我们需要在自己的Kubernetes中暴露LoadBalancer的应用,那么Metallb是一个不错的解决方案。

Metallb官网地址:
https://metallb.universe.tf/installation/

二、修改kube-proxy的configMap

[root@master231 metallb]# kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/"  | \
sed -e 's#mode: ""#mode: "ipvs"#' | \
kubectl apply -f - -n kube-system

三、下载metallb

[root@master231 metallb]# wget https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml

四、所有K8S节点导入镜像

需要用到如下镜像:
	quay.io/metallb/controller:v0.14.9
	quay.io/metallb/speaker:v0.14.9
直接执行列表清单拉取也可以

五、部署metallb

[root@master231 metallb]# kubectl apply -f  metallb-native.yaml 

六、查看metallb的状态

[root@master231 metallb]# watch kubectl get all -o wide -n metallb-system
Every 2.0s: kubectl get all -o wide -n metallb-system                                               master231: Wed Apr  9 11:56:34 2025

NAME                              READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pod/controller-686c7db689-5859z   1/1     Running   0          2m54s   10.100.203.160   worker232   <none>           <none>
pod/speaker-54qjt                 1/1     Running   0          2m54s   10.0.0.232       worker232   <none>           <none>
pod/speaker-cmnps                 1/1     Running   0          2m54s   10.0.0.231       master231   <none>           <none>
pod/speaker-qcfpx                 1/1     Running   0          2m54s   10.0.0.233       worker233   <none>           <none>

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/metallb-webhook-service   ClusterIP   10.200.27.157   <none>        443/TCP   2m55s   component=controller

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE     CONTAINERS   IMAGES
                       SELECTOR
daemonset.apps/speaker   3         3         3       3            3           kubernetes.io/os=linux   2m55s   speaker      quay.io/met
allb/speaker:v0.14.9   app=metallb,component=speaker

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                               SELECTOR
deployment.apps/controller   1/1     1            1           2m55s   controller   quay.io/metallb/controller:v0.14.9   app=metallb,com
ponent=controller

NAME                                    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                               SELECTOR
replicaset.apps/controller-686c7db689   1         1         1       2m55s   controller   quay.io/metallb/controller:v0.14.9   app=metal
lb,component=controller,pod-template-hash=686c7db689

七、创建MetalLB地址池

[root@master231 metallb]# cat metallb-ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: linux96
  namespace: metallb-system
spec:
  addresses:
  - 10.0.0.150-10.0.0.180

---

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: oldboyedu
  namespace: metallb-system
spec:
  ipAddressPools:
  - linux96
  
  
[root@master231 metallb]# kubectl apply -f metallb-ip-pool.yaml
ipaddresspool.metallb.io/linux96 created
l2advertisement.metallb.io/oldboyedu created

八、验证LoadBalancer是否可用

[root@master231 metallb]# cat deploy-ns-svc.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: oldboyedu

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-xiuxian
  namespace: oldboyedu
  labels:
    apps: xiuxian
spec:
  replicas: 5
  selector:
    matchLabels:
      version: v1
  template:
    metadata:
      labels:
        version: v1
        school: oldboyedu
        class: linux96
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
        name: xiuxian

---

apiVersion: v1
kind: Service
metadata:
  name: svc-xiuxian-lb
  namespace: oldboyedu
spec:
  type: LoadBalancer
  ports:
  - port: 90
    protocol: TCP
    targetPort: 80
    nodePort: 30120
  selector:
    version: v1



[root@master231 metallb]# kubectl apply -f deploy-ns-svc.yaml

[root@master231 metallb]# kubectl get svc -n oldboyedu 
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
svc-xiuxian-lb   LoadBalancer   10.200.150.228   10.0.0.150    90:30120/TCP   7s
[root@master231 metallb]# 
[root@master231 metallb]# kubectl get deploy,svc,rs,po,svc -n oldboyedu 
NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-xiuxian   5/5     5            5           35s

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/svc-xiuxian-lb   LoadBalancer   10.200.150.228   10.0.0.150    90:30120/TCP   15s

NAME                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/deploy-xiuxian-9ddcfd7db   5         5         5       35s

NAME                                 READY   STATUS    RESTARTS   AGE
pod/deploy-xiuxian-9ddcfd7db-87v6w   1/1     Running   0          35s
pod/deploy-xiuxian-9ddcfd7db-gczbw   1/1     Running   0          35s
pod/deploy-xiuxian-9ddcfd7db-pjhxs   1/1     Running   0          35s
pod/deploy-xiuxian-9ddcfd7db-vnf9x   1/1     Running   0          35s
pod/deploy-xiuxian-9ddcfd7db-wfbqp   1/1     Running   0          35s

九、访问测试

	基于NodePort端口访问 
http://10.0.0.231:30120/
http://10.0.0.232:30120/
http://10.0.0.233:30120/

	基于LoadBalancer访问
10.0.0.150:90
posted @ 2025-04-09 21:34  丁志岩  阅读(29)  评论(0)    收藏  举报