1.准备
如果您在 IPVS 模式下使用 kube-proxy,从 Kubernetes v1.14.2 开始,您必须启用严格的 ARP 模式。
请注意,如果您使用 kube-router 作为服务代理,则不需要它,因为它默认启用严格的 ARP。
您可以通过编辑当前集群中的 kube-proxy 配置来实现此目的:
kubectl edit configmap -n kube-system kube-proxy
并设置:
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
2.安装MetalLB
2.1.下载镜像
部署yaml文件下载地址:
下载好后在可以联网的机器中用docker下载里面的镜像,并打包上传到私有镜像仓库中
https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml
在可以联网的机器中下载镜像,并打包上传到私有镜像服务器中
docker pull quay.io/metallb/speaker:v0.11.0
docker pull quay.io/metallb/controller:v0.11.0
# 报错镜像为tar包,并上传到离线私有镜像服务器中
docker save -o speaker-0.11.0.tar quay.io/metallb/speaker:v0.11.0
docker save -o controller-0.11.0.tar quay.io/metallb/controller:v0.11.0
加载镜像到私有镜像仓库中
# 在私有镜像服务器中加载镜像
docker load -i speaker-0.11.0.tar
docker load -i controller-0.11.0.tar
# 创建tag
docker tag quay.io/metallb/speaker:v0.11.0 192.168.28.127:8001/kubesphere-install/quay.io/metallb/speaker:v0.11.0
docker tag quay.io/metallb/controller:v0.11.0 192.168.28.127:8001/kubesphere-install/quay.io/metallb/controller:v0.11.0
# push到私有镜像仓库中
docker push 192.168.28.127:8001/kubesphere-install/quay.io/metallb/speaker:v0.11.0
docker push 192.168.28.127:8001/kubesphere-install/quay.io/metallb/controller:v0.11.0
2.2.开始安装
kubectl apply -f namespace.yaml
kubectl apply -f metallb.yaml
3.配置
3.1.Layer 2 Configuration
第 2 层模式配置最简单:在许多情况下,您不需要任何特定于协议的配置,只需要 IP 地址。
第 2 层模式不需要将 IP 绑定到工作程序节点的网络接口。它的工作原理是直接响应本地网络上的 ARP 请求,将机器的 MAC 地址提供给客户端。
例如,以下配置使 MetalLB
可以控制从192.168.1.240
到 IP 192.168.1.250
,并配置第 2 层模式:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.240-192.168.1.250
4.用法
安装和配置 MetalLB
后,要向外部公开服务,只需将 spec.type
设置为 LoadBalancer
,MetalLB
将完成剩下的工作。
MetalLB 将信息事件附加到它控制的服务。如果您的 LoadBalancer
行为异常,请运行kubectl describe service <service name>
并检查事件日志。
4.1.请求特定的 IP
MetalLB 尊重 spec.loadBalancerIP
参数,因此如果您希望使用特定地址设置您的服务,您可以通过设置该参数来请求它。 如果 MetalLB 不拥有所请求的地址,或者该地址已被其他服务使用,则分配将失败并且 MetalLB 将记录在 kubectl describe service <service name>
中可见的警告事件。
MetalLB 还支持请求一个特定的地址池,如果你想要某种地址但不关心具体是哪一种。 要从特定池请求分配,请将 metallb.universe.tf/address-pool
注释添加到您的服务中,并将地址池的名称作为注释值。 例如:
apiVersion: v1
kind: Service
metadata:
name: nginx
annotations:
metallb.universe.tf/address-pool: production-public-ips
spec:
ports:
- port: 80
targetPort: 80
selector:
app: nginx
type: LoadBalancer