1 Metallb 的介绍

k8s的LoadBalancer类型的Service依赖于外部的云提供的Load Balancer
Metallb的作用就是通过k8s原生的方式提供LB类型的Service支持,开箱即用。

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

  • 地址分配:用户需要在配置中提供一个地址池,Metallb 将会在其中选取地址分配给服务
  • 地址广播:根据不同配置,Metallb 会以二层(ARP/NDP)或者 BGP 的方式进行地址的广播

官网:https://metallb.universe.tf/installation/

2 Metallb工作模式

Metallb支持两种工作模式:Layer2模式和BGP模式

(1)Layer2模式

Metallb在这种模式下,会从k8s节点中选一个Leader节点,在这个节点上面响应LB地址段的ARP请求,从而使上层路由把发往LB的流量都发到Leader节点。

缺点也很明显,所有对LB的请求都会发往Leader节点。如果当前Service下面的Pod分布在不同节点,那么这个流量还会从Leader发往相应的节点。

BGP模式

这种模式需要路由器支持接收Metallb的BGP广播,从而把请求分布到正确的节点上。跟L2模式的区别就是能够通过BGP协议正确分布流量了,不再需要一个Leader节点。

缺点就是需要上层路由器支持BGP。而且因为BGP单session的限制,如果Calico也是使用的BGP模式,就会有冲突从而导致metallb无法正常工作。

3 Metallb 的部署

(1)编辑kube-proxy:

kubectl edit configmap -n kube-system kube-proxy

  • 重载使配置生效:
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

  • 创建命名空间:kubectl apply -f namespace.yaml
  • 创建secret:
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"

(2)下载metallb的应用文件:

wget https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
  • 将安装metallb所需的镜像上传至私有仓库


  • 修改metallb的应用文件


(3)应用文件: kubectl apply -f metallb.yaml

  • 查看命名空间: kubectl get ns

(4)编辑ConfigMap文件:vim config.yml

apiVersion: v1
kind: ConfigMap
metadata:namespace: metallb-systemname: config
data:config: |address-pools:- name: defaultprotocol: layer2addresses:- 172.25.12.100-172.25.12.200
  • 应用文件:kubectl apply -f config.yml

(5)测试:

[root@server2 ~]# kubectl get svc # 查看服务
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1        <none>          443/TCP        2d12h
myservice    ClusterIP      10.102.183.155   <none>          80/TCP         12h
nginx-svc    LoadBalancer   10.106.176.102   172.25.12.100   80:32311/TCP   12h
curl 10.106.176.102/hostname.html

curl 172.25.12.100/hostname.html

  • 应用文件:kubectl apply -f demo-svc.yml,创建服务和pod
---
apiVersion: v1
kind: Service
metadata:name: demo-svc
spec:selector:app: demoports:- protocol: TCPport: 80targetPort: 80type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:name: demo-dep
spec:replicas: 3selector:matchLabels:app: demotemplate:metadata:labels:app: demospec:containers:- name: demoimage: myapp:v1

测试:

[root@server2 ~]# kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
demo-svc     LoadBalancer   10.110.166.42    172.25.12.101   80:32456/TCP   28s
kubernetes   ClusterIP      10.96.0.1        <none>          443/TCP        2d12h
myservice    ClusterIP      10.102.183.155   <none>          80/TCP         13h
nginx-svc    LoadBalancer   10.106.176.102   172.25.12.100   80:32311/TCP   12h
[root@server2 ~]# curl 10.110.166.42
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# curl 10.106.176.102
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@server2 ~]# kubectl get pod -L app
NAME                          READY   STATUS    RESTARTS   AGE   APP
demo-6d4f5bf58f-djlnv         1/1     Running   0          12h   nginx
demo-6d4f5bf58f-r49bq         1/1     Running   0          12h   nginx
demo-6d4f5bf58f-ztt7j         1/1     Running   0          12h   nginx
demo-dep-6b46986cc6-2hw9d     1/1     Running   0          51s   demo
demo-dep-6b46986cc6-nxtbp     1/1     Running   0          51s   demo
demo-dep-6b46986cc6-z4klp     1/1     Running   0          51s   demo
deployment-59dff4cf5d-fnhhb   1/1     Running   0          13h   myapp
deployment-59dff4cf5d-h56kz   1/1     Running   0          13h   myapp
deployment-59dff4cf5d-j7b7h   1/1     Running   0          13h   myapp

  • 应用文件:kubectl apply -f deploy.yaml



应用文件:kubectl apply -f nginx-svc.yml

---
apiVersion: v1
kind: Service
metadata:name: myservice
spec:selector:app: myappports:- protocol: TCPport: 80targetPort: 80---
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: myapp:v1

查看服务的信息:kubectl get svc


查看指定命名空间的服务信息:kubectl -n ingress-nginx get svc


应用文件:kubectl apply -f ingress.yaml

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: ingress-demo
spec:rules:- host: www1.westos.orghttp:paths:- path: /backend:serviceName: nginx-svcservicePort: 80


查看ingress的信息:kubectl get ingress

过滤端口:netstat -antl|grep :80,外部访问服务不是通过暴露端口实现

查看ingress-demo 的详细信息:kubectl describe ingress ingress-demo

测试:

  • 编辑测试主机的dns解析文件

  • 查看pod的信息

  • 可以通过域名访问服务


(2)加密

原理:client——>vip(metallb)——>ingress-nginx——>nginx-svc——>pod

(1)生成加密文件:

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=www1.westos.org/O=www1.westos.org" kubectl create secret tls tls-secret --key tls.key --cert tls.crt

(2)应用文件:kubectl apply -f ingress.yaml

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: ingress-demo
spec:tls:- hosts:- www1.westos.orgsecretName: tls-secretrules:- host: www1.westos.orghttp:paths:- path: /backend:serviceName: nginx-svcservicePort: 80
  • 查看ingress-demo的详细信息:kubectl describe ingress ingress-demo


测试

  • 加密后不能通过域名访问服务

在浏览器端访问:忽略警告后可以在浏览器页面访问



K8s------Metallb实现Load Balancer服务相关推荐

  1. 在 Kubernetes 集群中使用 MetalLB 作为 Load Balancer(上)

    作者 | Addo Zhang 来源 | 云原生指北 TL:DR 网络方面的知识又多又杂,很多又是系统内核的部分.原本自己不是做网络方面的,系统内核知识也薄弱.但恰恰是这些陌生的内容满满的诱惑,加上现 ...

  2. Kubernetes-负载均衡器Load Balancer(十八)

    1 介绍   负载均衡器Load Balancer服务是NodePort服务的扩展,负载均衡器拥有独立的可公开访问的IP地址,并将所有连接都重定向到服务,外部客户端可以通过负载均衡器的IP地址访问到集 ...

  3. SpringCloudSpringCloud Alibaba、微服务架构、网站架构演变过程、Nacos、Feign远程调用、Load Balancer负载均衡、Sentinel限流、Hystriy

    什么是微服务? 微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信.这些服务围绕业务能力来划分,并通过自动化部署机制来独立 ...

  4. 服务间调用报错:Load balancer does not have available server for client

    使用微服务架构后,不同团队使用同一个eureka和zuul,各团队之间注册到eureka的方式不一样,有的是指明instanceId为机器IP+端口,有的服务是指明instanceId为机器名称+端口 ...

  5. 实操手册:如何在GKE上部署HTTP(S) Load Balancer及容器应用程式

    Kubernetes(下文简称 k8s) 代表了 Google 的第三代容器管理系统,仅次于 Borg 和 Omega ,现在已经成为主要的容器平台.GKE 提供了了全套的 k8s 托管服务,将 Au ...

  6. Load balancer does not have available server for client

    最近在研究spring-cloud,研究zuul组件时发生下列错误:  Caused by: com.netflix.client.ClientException: Load balancer doe ...

  7. Azure负载均衡器Standard Load Balancer介绍

    这篇文章的知识点包括:Standard Load Balancer和BasicLoad Balancer的区别以及Standard LB的优势和简单使用,阅读完整文相信大家对Standard Load ...

  8. HUE Load Balancer 启动失败

    安装LoadBalancer服务的机器要安装mod_ssl,httpd 解决方案: yum -y install mod_ssl 注意:安装前也要安装httpd服务,安装完成后记得查看是否启动 yum ...

  9. Load Balancer as a Service (LBaaS V2.0)

    1.安装服务以及配置 yum install openstack-neutron-lbaas haproxy 修改/etc/neutron/neutron.conf 的[DEFAULT]部分: cru ...

最新文章

  1. Struts1和Struts2的区别和对比(完整版)
  2. 小程序从浏览器返回有一个空白页_北京做一个小程序
  3. [scala-spark]3. 变量 数据类型 分支与循环
  4. [linux] ubuntu gnome 控制面板恢复
  5. C++:39---继承中构造函数、析构函数的关系
  6. 【OJ】华东师范大学Python程序设计OJ题解
  7. Qt学习笔记-SQL的基本操作【创建、查询、添加、索引等】
  8. 【QT】QT从零入门教程(十一):QT自定义窗口
  9. Vue的批量更新原理
  10. 按值对对象属性进行排序
  11. Bert做不好无监督文本匹配的原因找到了!!
  12. 【Python】字符串的一些操作
  13. 计算机论文数据建模怎么写,建模论文模板_数学建模论文范例_数学建模论文3000字...
  14. ArcGIS利用DEM提取河流水系
  15. 做大做强肉牛产业,生物资产解决方案助力乡村振兴
  16. 服务器显示htx插槽,华硕最新推出一系列服务器及主板解决方案
  17. oracle 关联查询两个表,两张表关联查询,该怎么处理
  18. 西安电子科技大学和东北大学计算机,西安电子科技大学和东北大学比较,哪个好,特别是计算机软件方面...
  19. 谷歌将英文网站翻译成中文
  20. Swiper的安装及使用

热门文章

  1. 免费的播放器软件--mpv
  2. JAVA的成长之路(自勉)
  3. 前端面试题集锦——前端综合问题
  4. 读书笔记 -- 算法入门
  5. 手机红米5android7.11,这些是不支持ANDROID 11更新的小米和红米手机
  6. 爬楼梯当中的递归简化计算
  7. FPGA中inout端口使用方法总结
  8. 客观的看待人工智能,也许并没有那么可怕
  9. 基于ITIL的医院信息化服务管理实践(客户说)
  10. SVN 如何解决冲突?