为私有Kubernetes集群建立LoadBalancer服务

为私有Kubernetes集群建立LoadBalancer服务

MetalLB - 能够为私有 Kubernetes 集群提供LoadBalancer类型的负载均衡支持。nginx

在Kubernetes集群中,可使用Nodeport、Loadbalancer和Ingress三种方式老来暴露服务给外部访问(缺省状况下,内部Pod提供的服务是在相互隔离的子网中,只有同一个Pod内部的几个容器能够直接进行网络访问)。不过,目前只有Nodeport和Ingress在Kuberntes有内部实现,而要使用Loadbalancer,只能在GCP/AWS等云服务平台上使用。Nodeport和Ingress有必定的局限性,这里介绍的MetalLB能够在私有的Kubernetes集群提供Loadbalancer至此,从而与云服务商的配置实现彻底一致。git

简介

在私有网络上运行 Kubernetes,和御三家相比,对 LoadBalancer 类型的服务的支持应该是众多表面差别中最醒目的一个了。类型为 LoadBalancer 的服务在 Kubernetes 中并无直接支持,NodePort 和 ExternalIP 方案让不少私有云用户成为了 K8S 世界中的二等公民。接下来介绍的 Metallb,就给私有 Kubernetes 用户带来了一个方便、可用(并且不太成熟)的软件解决方案。github

该项目发布于 2017 年末,当前处于 Beta 阶段。api

Metallb 会在 Kubernetes 内运行,监控服务对象的变化,一旦察觉有新的 LoadBalancer 服务运行,而且没有可申请的负载均衡器以后,就会完成两部分的工做:网络

地址分配

用户须要在配置中提供一个地址池,Metallb 将会在其中选取地址分配给服务。app

地址广播

根据不一样配置,Metallb 会以二层(ARP/NDP)或者 BGP 的方式进行地址的广播。负载均衡

支持范围

不支持 IPVScurl

网络插件 兼容性
Calico 部分支持(有附加文档)
Flannel 支持
Kube-router 不支持(正在跟进)
Romana 支持(有附加文档)
Weave Net 支持

一个小测试

安装

Metallb 支持 Helm 和 YAML 两种安装方法,这里咱们使用第二种:post

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.7.1/manifests/metallb.yaml测试

很简单,Metallb 就会开始安装,会生成本身的命名空间以及 RBAC 配置。

$ kubectl get pods -n metallb-system
NAME                         READY     STATUS    RESTARTS   AGE
controller-b7896bf94-g449l   1/1       Running   0          51m
speaker-mt6kd                1/1       Running   0          51m
speaker-sqbn4                1/1       Running   0          51m

配置

接下来咱们要生成一个 Configmap 文件,为 Metallb 设置网址范围以及协议相关的选择和配置,这里以一个简单的二层配置为例:

apiVersion: v1
kind: ConfigMap
metadata:
 namespace: metallb-system
 name: config
data:
 config: |  address-pools:
 - name: my-ip-space
 protocol: layer2
 addresses:
 - 10.211.55.240/28

注意:这里的 IP 地址范围须要跟集群实际状况相对应。

使用 kubectl apply 命令应用以后,使用 kubectl logs -f [metallb-controller-pod] 会看到配置更新过程。

测试

建立一个 Nginx 的服务,服务类型为 LoadBalancer

apiVersion: apps/v1beta2
kind: Deployment
metadata:
 name: nginx
spec:
 selector:
 matchLabels:
 app: nginx
 template:
 metadata:
 labels:
 app: nginx
 spec:
 containers:
 - name: nginx
 image: nginx:1
 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

服务建立运行以后,能够列出服务信息:

kubectl get svc
NAME       TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)         AGE
kube-dns   ClusterIP      10.96.0.10      <none>          53/UDP,53/TCP   7d
nginx      LoadBalancer   10.96.245.212   10.211.55.240   80:32207/TCP    54m

这里就发现,LoadBalancer 类型的服务,分配到了咱们地址池中的第一个 IP。

用 curl http://10.211.55.240 验证,就会发现返回了 Nginx 的欢迎信息。

补充

除了这里提到的一点点简单配置以外,Metallb 的配置能力仍是比较强大的,这点能够参考官网,其中谈及了很多较为务实的案例,另外还提到了部分 Issue 供用户参考。

相关文章
相关标签/搜索