K8s------Metallb实现Load Balancer服务
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服务相关推荐
- 在 Kubernetes 集群中使用 MetalLB 作为 Load Balancer(上)
作者 | Addo Zhang 来源 | 云原生指北 TL:DR 网络方面的知识又多又杂,很多又是系统内核的部分.原本自己不是做网络方面的,系统内核知识也薄弱.但恰恰是这些陌生的内容满满的诱惑,加上现 ...
- Kubernetes-负载均衡器Load Balancer(十八)
1 介绍 负载均衡器Load Balancer服务是NodePort服务的扩展,负载均衡器拥有独立的可公开访问的IP地址,并将所有连接都重定向到服务,外部客户端可以通过负载均衡器的IP地址访问到集 ...
- SpringCloudSpringCloud Alibaba、微服务架构、网站架构演变过程、Nacos、Feign远程调用、Load Balancer负载均衡、Sentinel限流、Hystriy
什么是微服务? 微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信.这些服务围绕业务能力来划分,并通过自动化部署机制来独立 ...
- 服务间调用报错:Load balancer does not have available server for client
使用微服务架构后,不同团队使用同一个eureka和zuul,各团队之间注册到eureka的方式不一样,有的是指明instanceId为机器IP+端口,有的服务是指明instanceId为机器名称+端口 ...
- 实操手册:如何在GKE上部署HTTP(S) Load Balancer及容器应用程式
Kubernetes(下文简称 k8s) 代表了 Google 的第三代容器管理系统,仅次于 Borg 和 Omega ,现在已经成为主要的容器平台.GKE 提供了了全套的 k8s 托管服务,将 Au ...
- Load balancer does not have available server for client
最近在研究spring-cloud,研究zuul组件时发生下列错误: Caused by: com.netflix.client.ClientException: Load balancer doe ...
- Azure负载均衡器Standard Load Balancer介绍
这篇文章的知识点包括:Standard Load Balancer和BasicLoad Balancer的区别以及Standard LB的优势和简单使用,阅读完整文相信大家对Standard Load ...
- HUE Load Balancer 启动失败
安装LoadBalancer服务的机器要安装mod_ssl,httpd 解决方案: yum -y install mod_ssl 注意:安装前也要安装httpd服务,安装完成后记得查看是否启动 yum ...
- Load Balancer as a Service (LBaaS V2.0)
1.安装服务以及配置 yum install openstack-neutron-lbaas haproxy 修改/etc/neutron/neutron.conf 的[DEFAULT]部分: cru ...
最新文章
- Struts1和Struts2的区别和对比(完整版)
- 小程序从浏览器返回有一个空白页_北京做一个小程序
- [scala-spark]3. 变量 数据类型 分支与循环
- [linux] ubuntu gnome 控制面板恢复
- C++:39---继承中构造函数、析构函数的关系
- 【OJ】华东师范大学Python程序设计OJ题解
- Qt学习笔记-SQL的基本操作【创建、查询、添加、索引等】
- 【QT】QT从零入门教程(十一):QT自定义窗口
- Vue的批量更新原理
- 按值对对象属性进行排序
- Bert做不好无监督文本匹配的原因找到了!!
- 【Python】字符串的一些操作
- 计算机论文数据建模怎么写,建模论文模板_数学建模论文范例_数学建模论文3000字...
- ArcGIS利用DEM提取河流水系
- 做大做强肉牛产业,生物资产解决方案助力乡村振兴
- 服务器显示htx插槽,华硕最新推出一系列服务器及主板解决方案
- oracle 关联查询两个表,两张表关联查询,该怎么处理
- 西安电子科技大学和东北大学计算机,西安电子科技大学和东北大学比较,哪个好,特别是计算机软件方面...
- 谷歌将英文网站翻译成中文
- Swiper的安装及使用