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!
浙公网安备 33010602011771号