Kubernetes 安装 MetaLB 实现 service LoadBalancer 功能

 

 

[root@master1 metallb]# kubectl get node
NAME          STATUS   ROLES           AGE   VERSION
master1.org   Ready    control-plane   12d   v1.35.4
node1.org     Ready    <none>          12d   v1.35.4
node2.org     Ready    <none>          12d   v1.35.4
node3.org     Ready    <none>          12d   v1.35.4

 

 

#下载指定版本

METALLB_VERSION='v0.15.3'

wget https://raw.githubusercontent.com/metallb/metallb/${METALLB_VERSION}/config/manifests/metallb-native.yaml


kubectl apply -f metallb-native.yaml

#指定IP地址池

[root@master1 metallb]# cat service-metallb-IPAddressPool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: localip-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.3.10-192.168.3.50
  autoAssign: true
  avoidBuggyIPs: true

 

[root@master1 metallb]# cat service-metallb-L2Advertisement.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: localip-pool-l2a
  namespace: metallb-system
spec:
  ipAddressPools:
  - localip-pool
  interfaces:
  - ens33

 

kubectl apply -f service-metallb-IPAddressPool.yaml 

kubectl apply -f service-metallb-L2Advertisement.yaml

 

kubectl get all -n metallb-system

[root@master1 metallb]# kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-7f475568c5-r6b4j   1/1     Running   0          71s
pod/speaker-5d76c                 1/1     Running   0          71s
pod/speaker-lm4r7                 1/1     Running   0          71s
pod/speaker-qgp89                 1/1     Running   0          71s
pod/speaker-rj2b7                 1/1     Running   0          71s

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.105.251.51   <none>        443/TCP   71s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   4         4         4       4            4           kubernetes.io/os=linux   71s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           71s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-7f475568c5   1         1         1       71s

 

kubectl get IPAddressPool -n metallb-system

[root@master1 metallb]# kubectl get IPAddressPool -n metallb-system 
NAME           AUTO ASSIGN   AVOID BUGGY IPS   ADDRESSES
localip-pool   true          true              ["192.168.3.10-192.168.3.50"]

 

创建Deployment和LoadBalancer类型的Service,测试地址池是否能给Service分配LoadBalancerIP

[root@master1 workload]# cat controller-deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: controller-deployment-demo-2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp2
  template:
    metadata:
      labels:
        app: myapp2        #注意:此处labels和selector中label必须相同
    spec:
      containers:
      - name: deployment-2
        image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.2

kubectl apply -f controller-deployment2.yaml

[root@master1 workload]# kubectl get pod -o wide
NAME                                           READY   STATUS    RESTARTS      AGE     IP             NODE        NOMINATED NODE   READINESS GATES
controller-deployment-demo-2-57ff4f59b-5x458   1/1     Running   0             111s    10.244.1.141   node1.org   <none>           <none>
controller-deployment-demo-2-57ff4f59b-nxhsm   1/1     Running   0             111s    10.244.2.159   node2.org   <none>           <none>
controller-deployment-demo-5f884bb8-7svwh      1/1     Running   6 (17m ago)   5d16h   10.244.2.157   node2.org   <none>           <none>
controller-deployment-demo-5f884bb8-fscrl      1/1     Running   7 (17m ago)   5d20h   10.244.1.134   node1.org   <none>           <none>
controller-deployment-demo-5f884bb8-rfsbv      1/1     Running   6 (17m ago)   5d16h   10.244.1.138   node1.org   <none>           <none>

 

root@master1 workload]# cat service-loadbalancer-lbaas.yaml
apiVersion: v1
kind: Service
metadata:
  name: service-loadbalancer-lbaas
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  selector:
    app: myapp2
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80

 

kubectl apply -f service-loadbalancer-lbaas.yaml

kubectl get ep

[root@master1 workload]# kubectl get ep 
Warning: v1 Endpoints is deprecated in v1.33+; use discovery.k8s.io/v1 EndpointSlice
NAME                         ENDPOINTS                                         AGE
kubernetes                   192.168.3.60:6443                                 12d
myapp                        10.244.1.134:80,10.244.1.138:80,10.244.2.157:80   5d16h
service-2                    10.244.1.134:80,10.244.1.138:80,10.244.2.157:80   2d
service-3                    10.244.1.134:80,10.244.1.138:80,10.244.2.157:80   21h
service-4                    10.244.1.134:80,10.244.1.138:80,10.244.2.157:80   21h
service-loadbalancer-lbaas   10.244.1.141:80,10.244.2.159:80                   20s

#查看到分配了外部IP vip:192.168.3.11

root@master1 workload]# kubectl get svc
NAME                         TYPE           CLUSTER-IP     EXTERNAL-IP            PORT(S)          AGE
kubernetes                   ClusterIP      10.96.0.1      <none>                 443/TCP          12d
myapp                        NodePort       10.98.62.229   <none>                 8080:32028/TCP   5d16h
myblog                       ExternalName   <none>         www.wangxiaochun.com   <none>           40h
service-2                    LoadBalancer   10.98.59.151   192.168.3.10           80:30286/TCP     2d
service-3                    ClusterIP      10.104.61.85   <none>                 80/TCP           21h
service-4                    ClusterIP      None           <none>                 80/TCP           21h
service-loadbalancer-lbaas   LoadBalancer   10.98.48.33    192.168.3.11           80:32453/TCP     64s

 

#生成iptables规则

[root@master1 workload]# iptables -nvL -t nat |grep 32453
    0     0 KUBE-EXT-RAUC225Z5NF5JX4F  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/service-loadbalancer-lbaas:http */ tcp dpt:32453

 

#从集群外可以访问

C:\Users\Administrator>curl 192.168.3.11
kubernetes pod-test v0.2!! ClientIP: 192.168.3.44, ServerName: controller-deployment-demo-2-57ff4f59b-nxhsm, ServerIP: 10.244.2.159!

C:\Users\Administrator>curl 192.168.3.11
kubernetes pod-test v0.2!! ClientIP: 192.168.3.44, ServerName: controller-deployment-demo-2-57ff4f59b-nxhsm, ServerIP: 10.244.2.159!

C:\Users\Administrator>curl 192.168.3.11
kubernetes pod-test v0.2!! ClientIP: 192.168.3.44, ServerName: controller-deployment-demo-2-57ff4f59b-nxhsm, ServerIP: 10.244.2.159!

 

用访问cluster ip访问

[root@master1 workload]# curl 10.98.48.33
kubernetes pod-test v0.2!! ClientIP: 10.244.0.0, ServerName: controller-deployment-demo-2-57ff4f59b-5x458, ServerIP: 10.244.1.141!
[root@master1 workload]# curl 10.98.48.33
kubernetes pod-test v0.2!! ClientIP: 10.244.0.0, ServerName: controller-deployment-demo-2-57ff4f59b-nxhsm, ServerIP: 10.244.2.159!
[root@master1 workload]# curl 10.98.48.33
kubernetes pod-test v0.2!! ClientIP: 10.244.0.0, ServerName: controller-deployment-demo-2-57ff4f59b-5x458, ServerIP: 10.244.1.141!
[root@master1 workload]# curl 10.98.48.33
kubernetes pod-test v0.2!! ClientIP: 10.244.0.0, ServerName: controller-deployment-demo-2-57ff4f59b-nxhsm, ServerIP: 10.244.2.159!
[root@master1 workload]# curl 10.98.48.33
kubernetes pod-test v0.2!! ClientIP: 10.244.0.0, ServerName: controller-deployment-demo-2-57ff4f59b-5x458, ServerIP: 10.244.1.141!

 

 

posted @ 2026-05-22 16:24  minger_lcm  阅读(13)  评论(0)    收藏  举报