k8s: 使用metalLB来实现负载均衡Load Balancer
本地自己安装的k8s集群, 默认是不支持LoadBlancer的, 需要自己安装一个组件来支持. 而云上的k8s, 肯定是都支持LoadBalancer的.
如果自己公司搭建集群, 那肯定也是需要安装LoadBlancer的, 我们看看都有哪些支持本地集群的实现哪:
- metalLB: Netlify是一家位于旧金山的云计算公司,为Web应用程序和静态网站提供托管和无服务器后端服务.
- openelb: 之前是PorterLB, KubeSphere公司开源的, 是有中文文档的, 不过改名的过程中, 有点乱.
然后这是 OpenELB写的对比: https://github.com/kubesphere/openelb/blob/master/doc/zh/compared_with_metallb.md
最终我测试了metalLB
- openelb的文档太乱了
- metalLB使用ConfigMap来配置IP池, openELB使用 eip来配置IP池--方便监控
- metaLB声明的时候无需特殊设置, openELB必须使用 annotations: lb.kubesphere.io/v1alpha1: porter
我们来看看如何安装使用metalLB, (其实步骤都很简单, 切换为openELB也很容易)
确认strictARP模式
如果你的网络是运行在IPVS模式下(默认是iptables), 那么需要设置strictARP模式:
kubectl edit configmap -n kube-system kube-proxy
修改其中的strictARP为true:
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
安装 metalLB:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml
如果镜像来不下来, 就用vpn.... 我发现用k8s就必须学会用vpn或者迁移大法才行...因为好多镜像都拉不下来...也没警告!!
手工检查Pod是否启动正常, 会不会卡在拉镜像的步骤?
[root@centos1 ~]# k get pods -n metallb-system
NAME READY STATUS RESTARTS AGE
controller-6b78bff7d9-84cvr 1/1 Running 0 16d
speaker-5n8pm 1/1 Running 0 16d
speaker-5zsbb 1/1 Running 0 16d
speaker-wc47c 1/1 Running 0 16d
如果看到metallb-system命名空间下有controller, speaker等进程已经在Running状态, 说明正常.
配置IP池
这里我们使用layer2协议, 毕竟本地测试没有BGP设备, 如果是正式用, 还是要上BGP设备的.
先找网络管理员申请预留的IP端, 配置如下:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.18.0.203-172.18.0.210
然后配置上去
kubectl apply -f metallb.ip.yaml
如果是BGP的话, 文档在这: https://metallb.universe.tf/configuration/
测试效果
现在我们来部署一个Nginx来看看
kubectl apply -f nginx.test.yaml
其中内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-metallb-test
spec:
selector:
matchLabels:
app: nginx-metallb-test
template:
metadata:
labels:
app: nginx-metallb-test
spec:
containers:
- name: nginx
image: nginx:1.8
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx-metallb-test
type: LoadBalancer
上面声明的Service的类型为LoadBalancer, 无其他特殊设置.
服务创建之后, 我们来看看效果:
[root@centos1 metalLB]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
apple-service ClusterIP 10.98.221.159 <none> 5678/TCP 17h app=apple
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 23h <none>
nginx-service LoadBalancer 10.103.59.125 172.18.0.203 80:32046/TCP 3s app=nginx-metallb-test
打开浏览器, 访问 172.18.0.203 即可访问nginx.
如果是正式环境, 则使用DNS解析到此IP, 使用域名访问服务即可.
当然如果你有多个服务, 你也可以使用Nginx Ingress来通过域名和路径区分不同的服务, 那就是另外的话题了.
本文来自博客园,作者:飞云~风之谷,转载请注明原文链接:https://www.cnblogs.com/cnscud/p/15305433.html