云原生之初探 MetalLB

    安装MetalLB 是一个为 Kubernetes 提供负载均衡服务的组件。Kubernetes 本身不提供内置的负载均衡器实现,特别是在裸机(非云环境)部署时。因此,当你在这样的环境中运行 Kubernetes,并希望提供外部访问到集群内的服务时,MetalLB 就变得非常有用。

    MetalLB 支持两种主要的负载均衡模式:

    1. Layer 2 (数据链路层):使用 ARP/NDP 协议,基于 MAC 地址进行通讯。简而言之,当一个 IP 地址被分配给一个服务时,MetalLB 会确保集群内的网络设备知道如何将数据转发到正确的节点。
    2. BGP (边界网关协议):在这种模式下,MetalLB 与集群边界的路由器进行 BGP 会话,动态地告诉路由器如何路由到集群内部的 IP 地址。

    MetalLB 的主要优点是它允许在没有特定云提供商的支持下,使用裸机硬件环境的 Kubernetes 集群提供外部可访问的负载均衡服务。这对于需要在自己的数据中心、边缘位置或其他非标准环境中运行 Kubernetes 的组织特别有用。

    安装准备

    If you’re using kube-proxy in IPVS mode, since Kubernetes v1.14.2 you have to enable strict ARP mode.

    执行下述命令启用 strictARP

    # see what changes would be made, returns nonzero returncode if different
    kubectl get configmap kube-proxy -n kube-system -o yaml | \
    sed -e "s/strictARP: false/strictARP: true/" | \
    kubectl diff -f - -n kube-system
    
    # actually apply the changes, returns nonzero returncode on errors only
    kubectl get configmap kube-proxy -n kube-system -o yaml | \
    sed -e "s/strictARP: false/strictARP: true/" | \
    kubectl apply -f - -n kube-system
    
    

    安装

    安装 MetaILB 0.13.10 (安装到 ns:metallb-system 下)

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
    

    日志

    root@l2:~# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
    
    Warning: resource namespaces/metallb-system is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
    namespace/metallb-system configured
    customresourcedefinition.apiextensions.k8s.io/addresspools.metallb.io created
    customresourcedefinition.apiextensions.k8s.io/bfdprofiles.metallb.io created
    customresourcedefinition.apiextensions.k8s.io/bgpadvertisements.metallb.io created
    customresourcedefinition.apiextensions.k8s.io/bgppeers.metallb.io created
    customresourcedefinition.apiextensions.k8s.io/communities.metallb.io created
    customresourcedefinition.apiextensions.k8s.io/ipaddresspools.metallb.io created
    customresourcedefinition.apiextensions.k8s.io/l2advertisements.metallb.io created
    serviceaccount/controller created
    serviceaccount/speaker created
    role.rbac.authorization.k8s.io/controller created
    role.rbac.authorization.k8s.io/pod-lister created
    clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
    clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
    rolebinding.rbac.authorization.k8s.io/controller created
    rolebinding.rbac.authorization.k8s.io/pod-lister created
    clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
    clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
    configmap/metallb-excludel2 created
    secret/webhook-server-cert created
    service/webhook-service created
    deployment.apps/controller created
    daemonset.apps/speaker created
    validatingwebhookconfiguration.admissionregistration.k8s.io/metallb-webhook-configuration created
    

    配置 External IP Pool

    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    metadata:
      name: default
      namespace: metallb-system
    spec:
      addresses:
        - 192.168.36.139-192.168.36.200  # 手动配置IP范围
      autoAssign: true
    
    ---
    apiVersion: metallb.io/v1beta1
    kind: L2Advertisement
    metadata:
      name: default
      namespace: metallb-system
    spec:
      ipAddressPools:
        - default
    

    测试

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx
              ports:
                - name: http
                  containerPort: 80
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      ports:
        - name: http
          port: 80
          protocol: TCP
          targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
    
    

    检查 ip

    root@l2:/etc/kubernetes/plugin/metallb-system# kubectl get service | grep nginx
    nginx                  LoadBalancer   10.96.5.118      192.168.36.140   80:32582/TCP    4m57s
    

    访问测试

    root@l2:/etc/kubernetes/plugin/metallb-system# curl http://192.168.36.140
    <!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>
    

    评论栏