问题 LoadBalancer一直卡在Pending

kube-system   svclb-who2-sv-f40b99fd-5nkfk              0/1     Pending     0          82s    <none>       <none>   <none>           <none>
kube-system   svclb-who2-sv-f40b99fd-cfztj              0/1     Pending     0          82s    <none>       <none>   <none>           <none>
kube-system   svclb-who2-sv-f40b99fd-x2s4x              0/1     Pending     0          82s    <none>       <none>   <none>           <none>

注意:

  • TraefikLB的LoadBalancer端口不能和现在端口冲突,否则会一直卡在Pending状态

解决方案MetalLB

MetalLB是裸机Kubernetes集群的负载均衡器实现,使用标准路由协议。 https://metallb.universe.tf/

  • 初始化:
    Metal LB可以通过3个简单的命令进行部署。但在开始部署之前,我们需要确定Metal LB分配给Kubernetes负载均衡器服务的空闲ip。
    kube-proxy正在运行哪种模式
    在我的例子中,我的集群节点位于子网10.39.251.128/27上,我在这个子网中识别出3个空闲的ip。同样,对于您的设置,您可以识别子网中的空闲ip,并将ip放在手边(10.39.251.130-10.39.251.132)
    如果Kube代理在IPVS模式下运行,那么我们需要启用严格的ARP模式
kubectl get configmap -n kube-system kube-proxy -o yaml |grep mode
    mode: "ipvs"
kubectl get configmap -n kube-system kube-proxy -o yaml |grep strictARP
      strictARP: false

kubectl edit configmap -n kube-system kube-proxy

kubectl get configmap -n kube-system kube-proxy -o yaml |grep strictARP
      strictARP: true

部署MetaLB步骤

Kuberenetes声明方法由Metal LB建议使用Metal LB团队提供的MANIHEST进行部署,在撰写本文时,metallb/v0.12.1是最新的稳定版本。
您可以在此处找到MetalLB的官方 https://metallb.universe.tf/installation/

#Create namespace
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/namespace.yaml

#Deploy required manifest files
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml

一旦部署了MANIFEST,我们可以看到Pod正在名称空间metallb系统中扩展。但作为Daemon集的一部分部署的MetalLB的扬声器盒将位于CreateContainerConfigError中。
这是因为,我们没有提供我们为负载均衡器标识的外部ip作为命名空间的配置映射。

kubectl get all -n metallb-system
NAME                              READY   STATUS                       RESTARTS   AGE
pod/controller-7476b58756-74cmw   0/1     ContainerCreating            0          20s
pod/speaker-lqvp6                 0/1     ContainerCreating            0          20s
pod/speaker-rxclp                 0/1     CreateContainerConfigError   0          20s
pod/speaker-xbfsn                 0/1     CreateContainerConfigError   0          20s

cat configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.39.251.130-10.39.251.132
  • 部署configmap后,我们可以看到pod运行
kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-7476b58756-74cmw   1/1     Running   0          3m20s
pod/speaker-lqvp6                 1/1     Running   0          3m20s
pod/speaker-rxclp                 1/1     Running   0          3m20s
pod/speaker-xbfsn                 1/1     Running   0          3m20s

使用MetalLB验证LoadBalancer服务

让我们尝试通过负载均衡器公开ngnix部署,该负载均衡器在分配外部ip时处于挂起状态。我使用的是我提出的现有ngnix部署,
详细信息可以在这里找到 https://linuxdatahub.com/kubernetes-load-balancers/#Create_an_Nginx_Deployment

kubectl expose deploy ngnix-data-hub -n lb --target-port=80 --port=9843 --type LoadBalancer -n lb
service/ngnix-data-hub exposed
[root@host-controller~]# kubectl get svc -n lb
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
ngnix-data-hub   LoadBalancer   10.103.251.20   10.39.251.130   9843:32474/TCP   8s

我们可以看到,外部ip现在已被分配,并且是我们传递给metallb系统名称空间的范围中的第一个ip

curl 10.39.251.130:9843

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

可以正常运行了