Kubernetes LoadBalancer系列|MetalLB配置部署

一、LoadBalancer介绍

LoadBalancer

  1. 这种类型建构在NodePort类型之上,大部分情况下只适用于支持外部负载均衡器的云提供商(AWS,阿里云,华为云等)使用,由它接入外部客户端的请求并调度至集群节点相应的NodePort之上。因此LoadBalancer一样具有NodePort和ClusterIP。
  2. 简而言之,一个LoadBalancer类型的Service会指向关联至Kubernetes集群外部的、切实存在的某个负载均衡设备,该设备通过工作节点之上的NodePort向集群内部发送请求流量。
  3. 例如Amazon云计算环境中的ELB实例即为此类的负载均衡设备。此类型的优势在于,它能够把来自于集群外部客户端的请求调度至所有节点(或部分节点)的NodePort之上,而不是依赖于客户端自行决定连接至哪个节点,从而避免了因客户端指定的节点故障而导致的服务不可用
    在这里插入图片描述

公有云(以阿里云为例)配置
参考文档:https://help.aliyun.com/apsara/enterprise/v_3_15_0_20210816/csk/enterprise-ascm-user-guide/access-a-service-through-server-load-balancer–server-load-balancer-.html

私有云(以MetalLB为例配置)
简介
MetalLB 是为裸机Kubernetes集群实现的负载均衡器,使用标准路由协议ARP或BGP。Kubernetes官方没有为裸机集群提供网络负载均衡器(LoadBalancer类型的服务)的实现。各家云厂商(GCP、AWS、Azure…)有相应实现,但必须运行在自身的云环境上才能使用,如果没有在受支持的IaaS平台(GCP、AWS、Azure…)上运行,那么负载均衡器在创建时将无限期地保持pending状态,如果你要使用loadbalancer service,那么就要用到metallb了

二、MetalLB介绍

MetalLB是一个为裸机Kubernetes集群设计的负载均衡器,它使用标准的路由协议(如BGP、ARP等)来确保集群外部的流量可以正确地路由到集群内的服务。
它提供了两个功能:

地址分配(address allocation):当创建 LoadBalancer Service 时,MetalLB 会为其分配 IP 地址。这个 IP 地址是从预先配置的 IP 地址库获取的。同样,当 Service 删除后,已分配的 IP 地址会重新回到地址库。
对外公告(external announcement):分配了 IP 地址之后,需要让集群外的网络知道这个地址的存在。使用了标准路由协议实现:
Layer2 模式:ARP(ipv4)、NDP(ipv6)
BGP 模式
不管是Layer2模式还是BGP模式,两者都不使用Linux的网络栈,即无法使用诸如ip命令准确的查看VIP所在的节点和相应的路由,相对应的是在每个节点上面都能看到一个kube-ipvs0网卡接口上面的IP。同时,两种模式都只是负责把VIP的请求引到对应的节点上面,之后的请求怎么到达pod,按什么规则轮询等都是由kube-proxy实现的。

对应的的两种工作负载:

Controller:Deployment,用于监听 Service 的变更,分配/回收 IP 地址。
Speaker:DaemonSet,对外广播 Service 的 IP 地址。把服务类型为LoadBalancer的服务的EXTERNAL-IP公布到网络中去,确保客户端能够正常访问到这个IP。

工作模式
layer 2模式:也就是工作在2层来负责相应arp请求,对于局域网中的人来说仿佛就是给服务分配了一个ip,但是2层模式不是真正的负载均衡,因为所有的流量会经过集群中的一个节点,当这个节点挂了的话,metallb会迁移ip到另外一个节点上。Layer 2模式更为通用,不需要用户有额外的设备;但由于Layer 2模式使用ARP/ND,地址池分配需要跟客户端在同一子网,地址分配略为繁琐。
在这里插入图片描述
bgp模式:集群中所有node都会跟上联路由器建立BGP连接,并且会告知路由器应该如何转发service的流量。
BGP模式是真正的LoadBalancer。但是需要你的路由器支持bgp,此处使用layer 2模式。
在这里插入图片描述
文档
安装:https://metallb.universe.tf/installation/
配置使用:https://metallb.universe.tf/configuration/

三、MetalLB 安装使用

# 如果kube-proxy使用的是IPVS模式,你需要启用staticARP
[root@k8s-master MetalLB]# kubectl edit configmap -n kube-system kube-proxy
# 设置staticARP为true
mode: "ipvs"
ipvs:
  strictARP: true
# 创建资源
[root@k8s-master MetalLB]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml
# 查看资源
[root@k8s-master MetalLB]# kubectl get pod -n metallb-system 
NAME                          READY   STATUS    RESTARTS   AGE
controller-79d46b9996-thtw2   1/1     Running   0          2m35s
speaker-9r59c                 1/1     Running   0          2m34s
speaker-shdvj                 1/1     Running   0          2m34s
speaker-w4g96                 1/1     Running   0          2m34s
# 设置ip地址池
[root@k8s-master MetalLB]# cat config.yaml 
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.10.200-192.168.10.250   #局域网,ip要在同一网段
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool

使用

[root@k8s-master k8s-test]# cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
  matchLabels:
    app: myapp
template:
  metadata:
    labels:
      app: myapp
  spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      ports:
      - containerPort: 80
        name: http
[root@k8s-master k8s-test]# cat svc.yaml 
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
type: LoadBalancer
selector:
  app: myapp
ports:
- name: http
  port: 80
  protocol: TCP
  targetPort: 80
loadBalancerIP: 192.168.10.222   # 可以指定ip,也可以自动分配,指定的ip必须在ip地址池内
# 查看svc
[root@k8s-master k8s-test]# kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>           443/TCP        5d4h
myapp        LoadBalancer   10.101.173.202   192.168.10.222   80:32482/TCP   16m
# 使用EXTERNAL-IP+端口访问
[root@k8s-master k8s-test]# curl 192.168.10.222:80
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
# 集群外部访问
http://192.168.10.222:80

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值