本地自己安装的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/v1alpha1kind: KubeProxyConfigurationmode: "ipvs"ipvs: strictARP: true
安装 metalLB:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yamlkubectl 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-systemNAME READY STATUS RESTARTS AGEcontroller-6b78bff7d9-84cvr 1/1 Running 0 16dspeaker-5n8pm 1/1 Running 0 16dspeaker-5zsbb 1/1 Running 0 16dspeaker-wc47c 1/1 Running 0 16d
如果看到metallb-system命名空间下有controller, speaker等进程已经在Running状态, 说明正常.
配置IP池
这里我们使用layer2协议, 毕竟本地测试没有BGP设备, 如果是正式用, 还是要上BGP设备的.
先找网络管理员申请预留的IP端, 配置如下:
apiVersion: v1kind: ConfigMapmetadata: namespace: metallb-system name: configdata: 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/v1kind: Deploymentmetadata: name: nginx-metallb-testspec: 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: v1kind: Servicemetadata: name: nginx-servicespec: 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 wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORapple-service ClusterIP 10.98.221.159 5678/TCP 17h app=applekubernetes ClusterIP 10.96.0.1 443/TCP 23h 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