当前位置: 首页 > news >正文

Kubernetes 负载均衡器解决方案 MetalLB实践

Kubernetes 负载均衡解决方案 MetalLB实践

MetalLB 是一个用于在 Kubernetes 集群中提供外部 IP 地址的负载均衡器实现。

准备工作

1. 安装需知

安装 MetalLB 有一些前置条件:

  • Kubernetesv1.13.0 或者更新的版本

  • 集群中的 CNI 要能兼容 MetalLB,最新的兼容性参考NETWORK ADDON COMPATIBILITY

    Network addonCompatible
    AntreaYes (Tested on version 1.4 and 1.5)
    CalicoMostly (see known issues)
    CanalYes
    CiliumYes
    FlannelYes
    Kube-ovnYes
    Kube-routerMostly (see known issues)
    Weave NetMostly (see known issues)

    备注:

    常见的 Flannel、Cilium 等都是兼容的,Calico 的话大部分情况都兼容,BGP 模式下需要额外处理。因为 BGP 单 session 的限制,如果 CNI 插件为 Calico ,同时 Calico 也是使用的 BGP 模式,就会有冲突从而导致 MetalLB 无法正常工作。

  • 提供一些 IPv4 地址给 MetalLB 用于分配。

  • 当使用 BGP 操作模式时,你将需要一个或多个能够支持 BGP 协议的路由器。

  • L2 模式下需要各个节点间 7946 端口(TCP & UDP)需要互通。

最新信息参考:requirements

2. 本文部署的环境

确保你的 Kubernetes 集群已经部署并且运行正常。

root@master1:~# kubectl get node -o wide
NAME      STATUS   ROLES           AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
master1   Ready    control-plane   2d19h   v1.28.2   192.168.0.61   <none>        Ubuntu 24.04 LTS   6.8.0-36-generic   containerd://1.7.12
node1     Ready    <none>          2d19h   v1.28.2   192.168.0.62   <none>        Ubuntu 24.04 LTS   6.8.0-36-generic   containerd://1.7.12
node2     Ready    <none>          2d19h   v1.28.2   192.168.0.63   <none>        Ubuntu 24.04 LTS   6.8.0-36-generic   containerd://1.7.12

CNI插件及版本信息:

root@master1:~# calicoctl version
Client Version:    v3.28.0
Git commit:        413e6f559
Cluster Version:   v3.28.0
Cluster Type:      typha,kdd,k8s,operator,bgp,kubeadm# calico使用bgp模式
root@master1:~# calicoctl node status
Calico process is running.IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
| PEER ADDRESS |     PEER TYPE     | STATE |  SINCE   |    INFO     |
+--------------+-------------------+-------+----------+-------------+
| 192.168.0.62 | node-to-node mesh | up    | 01:33:35 | Established |
| 192.168.0.63 | node-to-node mesh | up    | 02:48:04 | Established |
+--------------+-------------------+-------+----------+-------------+IPv6 BGP statusroot@master1:~# calicoctl get ippool -o wide
NAME                  CIDR            NAT    IPIPMODE   VXLANMODE     DISABLED   DISABLEBGPEXPORT   SELECTOR
default-ipv4-ippool   10.244.0.0/16   true   Never      CrossSubnet   false      false              all()root@master1:~# kubectl get pod -n calico-system
NAME                                      READY   STATUS    RESTARTS         AGE
calico-kube-controllers-b7fb9d96c-pbf9s   1/1     Running   3 (80m ago)      4d18h
calico-node-gdsjw                         1/1     Running   30 (2m32s ago)   4d18h
calico-node-hvqg4                         1/1     Running   3 (80m ago)      4d18h
calico-node-rj9dd                         1/1     Running   3 (80m ago)      4d17h
calico-typha-55ccdf44bf-v2zmm             1/1     Running   3 (80m ago)      4d18h
calico-typha-55ccdf44bf-w5l8w             1/1     Running   3 (80m ago)      4d18h
csi-node-driver-bqvb7                     2/2     Running   6 (80m ago)      4d18h
csi-node-driver-cw59h                     2/2     Running   6 (80m ago)      4d18h
csi-node-driver-hbw2n                     2/2     Running   6 (80m ago)      4d18h

概念原理说明

1. Layer2模式

该部分的官方文档请参考:[layer2模式](https://metallb.universe.tf/concepts/layer2/)

以下时摘取部分进行翻译:

在 Layer 2 模式下,一个节点承担起向本地网络广告服务的责任。从网络的角度来看,这台机器的网络接口上似乎分配了多个 IP 地址。

在底层,MetalLB 响应 IPv4 服务的 ARP 请求和 IPv6 服务的 NDP 请求。

Layer 2 模式的主要优势是其普遍性:它可以在任何以太网网络上工作,无需特殊硬件,甚至不需要高级路由器。

负载均衡行为

在 Layer 2 模式下,所有针对服务 IP 的流量都会转发到一个节点,然后kube-proxy 会将流量分发到所有的服务 pod。

从这个意义上讲,Layer 2 并没有实现一个负载均衡器,而是实现了一种故障转移机制,以便在当前主节点由于某种原因失败时,其他节点可以接管。

如果主节点由于某种原因失败,故障转移是自动的:使用 memberlist 检测到失败节点,此时新节点接管失败节点的 IP 地址。

局限性

Layer 2 模式有两个主要限制需要注意:单节点瓶颈和潜在的故障转移速度慢。

单节点瓶颈

在 Layer 2 模式下,一个通过选举产生的主节点接收所有服务 IP 的流量。这意味着服务的入口带宽被限制在单个节点的带宽范围内。这是使用 ARP 和 NDP 引导流量的一个根本性限制。

潜在的故障转移速度慢

在故障转移方面,MetalLB 也实现了自动故障转移。目前的机制是通过 memberlist 这个基于 gossip 协议的成员和故障检测的库,其他节点检测到 Leader 故障后自动重新选举出新 Leader,新的 Leader 自动接管所有 ExternalIP 并发送大量二层数据包来通知客户端(也就是区域网中的其他节点) ExternalIP 的 MAC 地址变化。

根据官网文档描述,大部分主流操作系统的现代版本(Windows、Mac、Linux)都正确实现了 Layer 2 故障转移,问题只会出现在较旧或不常见的操作系统上。故障转移正常情况下会在几秒内完成,一般不会超过 10 秒。在更新完成前 ExternalIP 会无法访问。

L2 主节点选举的工作原理

给定负载均衡器 IP 的“主节点”(将要广播 IP 的节点)的选举是无状态的,其工作方式如下:

  1. 每个 speaker 收集给定 IP 的潜在广播者列表,考虑活跃的 speaker、外部流量策略、活跃的端点、节点选择器等因素。
  2. 每个 speaker 都进行相同的计算:获取“节点+VIP”元素的哈希值排序列表,并在自己是该列表的第一个条目时宣布服务。

2. BGP模式

该部分的官方文档请参考:bgp模式

在BGP模式下,集群中的每个节点都会与你的网络路由器建立BGP对等会话,并利用这个对等会话来通告集群外部服务的IP地址。

假设你的路由器配置支持多路径,这就能实现真正的负载均衡:MetalLB发布的路由彼此等价,除了它们的下一跳(nexthop)不同。这意味着路由器会同时使用所有下一跳,并在这之间进行负载均衡。

当数据包到达节点后,kube-proxy负责最后一跳的流量路由,将数据包定向到服务中特定的一个Pod上。

负载均衡行为

负载均衡的具体行为取决于你使用的具体路由器型号和配置,但通常的行为是基于包哈希值,按连接进行负载均衡。“按连接”指的是单个TCP或UDP会话的所有数据包都将被导向集群中的单一机器。流量的分发仅发生在不同的连接间,而不是在一个连接内的数据包之间。

将单个连接的数据包分散到多个集群节点会导致以下问题:

  • 将单个连接分散到多条路径上会导致线路上的数据包重排序,这对终端主机的性能影响巨大。

  • Kubernetes内部的节点间流量路由并不保证一致性。这意味着两个不同的节点可能会将同一连接的数据包路由到不同的Pod,导致连接失败。

局限性

BGP 模式最大的弊端就是不能优雅的处理节点下线。当集群中某个节点下线时,所有客户端对这个节点的连接都会被主动断开。

客户端一般会出现一个 Connection reset by peer 错误

同时由于是对每个数据包基于 hash 值进行负载均衡,因此对后端节点数是非常敏感的,这也是 BGP 的一个优点,故障转移非常快。

正因为 BGP 故障转移很快,反而引发了一个 BGP 模式的最大缺点:由于 BGP 会对每个数据包做负载均衡,在主机发生故障时会快速切换到新的主机上,从而引发节点变动时同一连接的不同数据包可能会发送到不同主机上导致网络导致的网络重排问题

比如第一个包转发到节点 A,然后处理第二个包时添加或故障了一个节点,按照新的节点数进行负载均衡计算,可能第二个数据包就被分到节点 B 了,节点 B 很明显是不能正确处理这个数据包的。

对客户端来说就是这次请求直接失败了。

解决该弊端的方法没有太理想的解决办法,只能尽量采取一些优化手段:

  • BGP路由器配置使用更稳定的ECMP哈希算法。比如“弹性ECMP”或“弹性LAG”。使用这样的算法极大地减少了后端节点更改时受影响的连接。
  • 将你的服务部署固定到特定的节点上,尽量少的增删节点。
  • 在流量“低谷期”进行服务部署的变更。
  • 将每个逻辑服务拆分为两个具有不同IP的Kubernetes服务,并借助DNS优雅地将用户流量从一个服务迁移到另一个服务。
  • 在客户端添加透明的重试逻辑,以优雅地从突然的断开中恢复。如果客户端是如移动应用或富单页Web应用这类应用,这种方法尤其有效。
  • 将你的服务置于入口控制器(ingress controller)之后。入口控制器本身可以使用MetalLB来接收流量,但在BGP和你的服务之间有一个有状态的层意味着你可以更改服务而不必担心。你只需要在更改入口控制器本身的部署时小心(例如,当增加更多的NGINX Pod来扩展规模时)。
  • 接受偶尔会有连接重置的爆发。对于低可用性的内部服务而言,这可能是可接受的现状。

部署 MetalLB

官方提供了好几种安装方式,yaml、helm、operator 等,这里使用 yaml 方式安装。

如果kube-proxy使用的是IPVS模式,在v1.14.2版本之后,需要启用strict ARP mode。

root@master1:~# kubectl edit configmap -n kube-system kube-proxy
...ipvs:excludeCIDRs: nullminSyncPeriod: 0sscheduler: ""strictARP: true   # 启用strictARPsyncPeriod: 0stcpFinTimeout: 0stcpTimeout: 0sudpTimeout: 0skind: KubeProxyConfigurationlogging:flushFrequency: 0options:json:infoBufferSize: "0"verbosity: 0metricsBindAddress: ""mode: "ipvs"      # kube-proxy模式,默认为iptablesnodePortAddresses: nulloomScoreAdj: null
...# 重启kube-proxy生效
kubectl rollout restart daemonset/kube-proxy -n kube-system

说明:

kube-proxy默认使用的是iptables转发模式,在大规模集群中,建议改为ipvs。如果当前转发模式是ipvs,启用严格的 ARP。

1. 创建 MetalLB 命名空间

kubectl create namespace metallb-system

2. 使用Manifest安装MetalLB

MetalLB 提供了一组清单文件来部署所需的组,使用如下命令部署:

curl https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml -O
kubectl apply -f metallb-native.yaml

查询官网文档获取最新的安装命令。

3. 验证安装

root@master1:~# kubectl get pods -n metallb-system
NAME                          READY   STATUS    RESTARTS      AGE
controller-56bb48dcd4-pp4w4   1/1     Running   2 (60m ago)   47h
speaker-4kfhv                 1/1     Running   1 (60m ago)   43h
speaker-5b5sq                 1/1     Running   7 (60m ago)   47h
speaker-wctd6                 1/1     Running   7 (60m ago)   47h

4. 配置 MetalLB

MetalLB 支持两种操作模式:Layer 2 模式和 BGP 模式。因为 BGP 对路由器有要求,POC测试时建议使用 Layer2 模式。

Layer2模式配置

Layer 2 模式是最简单的配置方式:在许多情况下,你不需要任何特定协议的配置,只需要 IP 地址。

Layer 2 模式不需要将 IP 绑定到你的工作节点的网络接口上。它通过直接响应本地网络上的 ARP 请求,向客户端提供机器的 MAC 地址来工作。

Layer2模式配置,首先创建一个IPAddressPool资源对象:

root@master1:~/metallb# cat ip-pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:name: ip-poolnamespace: metallb-system
spec:addresses:- 192.168.0.240-192.168.0.250 #分配给LB的IP池

备注

  1. IP地址池与集群IP位于同一个网段。
  2. 多个实例IP地址池可以共存,并且可以分配IPV4和IPV6地址。

应用创建资源:

kubectl apply -f ip-pool.yaml

创建一个广播声明,关联上面的 IP 池对象:

root@master1:~/metallb# cat advertise.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:name: l2advernamespace: metallb-system
spec:ipAddressPools:- ip-pool

应用创建资源:

kubectl apply -f advertise.yaml

说明:

如果不设置关联到 IPAdressPool,L2Advertisement 默认会关联所有可用的 IPAdressPool。

BGP模式配置

本文使用Layer2模式测试,后续补充BGP模式的POC验证。关于使用配置可以参考:https://metallb.universe.tf/configuration/#bgp-configuration

高级配置

Metal LB支持一些高级配置用于特殊的需求场景,详见官方文档:

  1. 区分不同的IP地址池:https://metallb.universe.tf/configuration/_advanced_ipaddresspool_configuration/#controlling-automatic-address-allocation

  2. 将IP地址池分配给指定的命名空间和服务:https://metallb.universe.tf/configuration/_advanced_ipaddresspool_configuration/#reduce-scope-of-address-allocation-to-specific-namespace-and-service

Layer2模式demo应用示例

1. 创建一个示例应用

为了验证 MetalLB 的配置是否正确,你可以创建一个简单的 Nginx 服务。

创建一个 nginx-deployment.yaml 文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80

应用创建资源:

kubectl apply -f nginx-deployment.yaml

2. 暴露 Nginx 服务

创建一个 nginx-service.yaml 文件,内容如下:

apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80type: LoadBalancer

应用此服务:

kubectl apply -f nginx-service.yaml

3. 验证服务

检查服务的外部 IP 地址是否已分配:

kubectl get svc nginx-service

你应该会看到类似以下的输出:

root@master1:~/metallb# kubectl get svc nginx-service
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
nginx-service   LoadBalancer   10.101.212.243   192.168.0.240   80:30981/TCP   2d16h

在浏览器中访问 http://<EXTERNAL-IP>,例如 http://192.168.0.240,应该可以看到 Nginx 的默认页面。

或者使用curl测试:

root@master1:~/metallb# curl http://192.168.0.240
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

总结

1. MetalLB工作流程

MetalLB 做的工作可以分为两个部分:

  1. 地址分配:当创建 LoadBalancer Service 时,MetalLB 会为其分配 IP 地址。这个 IP 地址是从预先配置的 IP 地址库获取的。当 Service 删除后,已分配的 IP 地址会重新回到地址库。使用Controller实现地址分配,以 Deployment方式运行,用于监听 Service 的变更,分配/回收 IP 地址。

  2. 对外广播:分配了 IP 地址之后,需要让集群外的网络知道这个地址的存在。由Speaker实现地址对外广播,以 DaemonSet 方式运行,对外广播 Service 的 IP 地址。MetalLB 使用了标准的TCP/IP协议实现:ARP、NDP 或者 BGP。

  • 在 Layer 2 模式,使用 ARP(ipv4)/NDP(ipv6) 协议;
  • 在 BPG 模式,自然是使用 BGP 协议。

ARP(Address Resolution Protocol):是根据IP地址获取物理地址的一个TCP/IP协议。

NDP(neighbor Discovery protocol):ICMPv6的子协议,是IPV6协议体系中一个重要的基础协议,NDP替代了IPV4中的ARP。定义了使用ICMPv6报文实现地址解析,跟踪邻居状态,重复地址检测,路由器发现,以及重定向等功能。

具体的工作流如下:

  • Controller 负责监听 Service 变化并分配或回收 IP。

    当 Service 配置为 LoadBalancer 模式时,从 IP 池分配给到相应的 IP 地址并对该 IP 的生命周期进行管理。

    • 创建 Service 时(或者从非 LoadBalancer 类型修改为 LoadBalancer 类型)时从 IP 池选择一个 IP 并分配,
    • 删除 Service (或者从 LoadBalancer 类型修改为非 LoadBalancer 类型)时回收该 IP 到 IP 池
  • Speaker 则会依据选择的协议进行相应的广播或应答,实现 IP 地址的通信响应

    当业务流量通过 TCP/UDP 协议到达指定的 Node 时,由 Node 上面运行的 Kube-Proxy 组件对流量进行处理,并分发到对应服务的 Pod 上面。

    • 如果是 Layer2 模式 Speaker 就会响应 ARP(ipv4)/NDP(ipv6)请求。
    • 如果是 BGP 模式 Speaker 则发送 BGP 广播,将路由规则同步给 peer。

2. 两种模式的优缺点

Layer2 模式
  • 优点:通用性好,适用于任何网络环境,不需要特殊的硬件。
  • 缺点:单节点瓶颈和故障转移慢

Layer2 模式是一种基础、通用的实现,能用,而且易于使用,没有任何限制,但是局限性比较大。

BGP 模式
  • 优点:使用 BGP 可以在多节点间负载均衡,没有单节点瓶颈,同时故障转移很快。
  • 缺点: 需要支持 BGP 路由协议的软路由或者硬件 路由器设备。

参考资料

  1. MetalLB, bare metal load-balancer for Kubernetes
  2. Metal LB installation
  3. 裸机 Kubernetes 集群负载均衡器: MetalLB 简明教程 - (lixueduan.com)

相关文章:

Kubernetes 负载均衡器解决方案 MetalLB实践

Kubernetes 负载均衡解决方案 MetalLB实践 MetalLB 是一个用于在 Kubernetes 集群中提供外部 IP 地址的负载均衡器实现。 准备工作 1. 安装需知 安装 MetalLB 有一些前置条件&#xff1a; Kubernetesv1.13.0 或者更新的版本 集群中的 CNI 要能兼容 MetalLB&#xff0c;最新…...

力扣爆刷第159天之TOP100五连刷61-65(翻转单词、对称二叉树、遍历求和)

力扣爆刷第159天之TOP100五连刷61-65&#xff08;翻转单词、对称二叉树、遍历求和&#xff09; 文章目录 力扣爆刷第159天之TOP100五连刷61-65&#xff08;翻转单词、对称二叉树、遍历求和&#xff09;一、151. 反转字符串中的单词二、129. 求根节点到叶节点数字之和三、104. 二…...

(七)[重制]C++命名空间与标准模板库(STL)

​ 引言 在专栏C教程的第六篇C中的结构体与联合体中&#xff0c;介绍了C中的结构体和联合体&#xff0c;包括它们的定义、初始化、内存布局和对齐&#xff0c;以及作为函数参数和返回值的应用。在专栏C教程的第七篇中&#xff0c;我们将深入了解C中的命名空间&#xff08;nam…...

Elasticsearch:Runtime fields - 运行时字段(一)

目录 使用运行时字段带来的好处 激励 折衷 映射运行时字段 定义运行时字段而不使用脚本 忽略运行时字段上的脚本错误 更新和删除运行时字段 在搜索请求中定义运行时字段 创建使用其他运行时字段的运行时字段 运行时字段&#xff08;runtime fields&#xff09;是在查询…...

03:C语言运算符

C语言运算符 1、常见运算符2、赋值运算符3、判断运算符4、与- - 1、常见运算符 数学运算符号。常见数学运算符号&#xff0c;跟数学中理解相同 加号 - 减号 * 乘号 / 除号&#xff0c;相除以后的商 % 取余符号&#xff0c;相除以后余数是几 ()括号括起来优先级最高&#xff0…...

JAVA每日作业day7.4

ok了家人们今天学习了Date类和simpleDateformat类&#xff0c;话不多说我们一起看看吧 一.Date类 类 java.util.Date 表示特定的瞬间 ( 日期和时间 ) &#xff0c;精确到毫秒。 1.2 Date类的构造方法 public Date(): 用来创建当前系统时间对应的日期对象。 public Date(long …...

WordPress网站违法关键词字过滤插件下载text-filter

插件下载地址&#xff1a;https://www.wpadmin.cn/2025.html 插件介绍 WordPress网站违法关键词字过滤插件text-filter由本站原创开发,支持中英文关键字自动替换成**号&#xff0c;可以通过自定义保存修改按钮增加“预设关键字”&#xff0c;也可以导入定义好的txt文本形式的关…...

ros1仿真导航机器人 navigation

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1navigation导航框架 2导航设置过程 &#xff08;1&#xff09;启动仿真环境 roslaunch why_simulation why_robocup.launch &#xff08;2&#xff09;启动move_base导航、amcl定位 roslaunch why_simulation nav…...

Python制作动态颜色变换:颜色渐变动效

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame颜色变换函数主循环 完整代码 引言 颜色渐变动画是一种视觉上非常吸引人的效果&#xff0c;常用于网页设计和图形应用中。在这篇博客中&#xff0c;我们将使用Python创建一个动态颜色变换的动画效果。通…...

Python 异步编程介绍与代码示例

Python 异步编程介绍与代码示例 一、异步编程概述 异步编程是一种编程范式&#xff0c;它旨在处理那些需要等待I/O操作完成或执行耗时任务的情况。在传统的同步编程中&#xff0c;代码会按照顺序逐行执行&#xff0c;直到遇到一个耗时操作&#xff0c;它会阻塞程序的执行直到…...

堆叠的作用

一、为什么要堆叠 传统的园区网络采用设备和链路冗余来保证高可靠性&#xff0c;但其链路利用率低、网络维护成本高&#xff0c;堆叠技术将多台交换机虚拟成一台交换机&#xff0c;达到简化网络部署和降低网络维护工作量的目的。 二、堆叠优势 1、提高可靠性 堆叠系统多台成…...

ubuntu 如何查看某一个网卡的ip地址

在Ubuntu中&#xff0c;你可以使用多种方法来查看某一个网卡的IP地址。以下是一些常用的方法&#xff1a; 使用ip命令&#xff1a; ip命令是现代Linux系统中用于显示和操作路由、网络设备、策略路由和隧道的工具。要查看所有网络接口的IP地址&#xff0c;你可以使用&#xff1a…...

跨界客户服务:拓展服务边界,创造更多价值

在当今这个日新月异的商业时代&#xff0c;跨界合作已不再是新鲜词汇&#xff0c;它如同一股强劲的东风&#xff0c;吹散了行业间的壁垒&#xff0c;为企业服务创新开辟了前所未有的广阔天地。特别是在客户服务领域&#xff0c;跨界合作正以前所未有的深度和广度&#xff0c;拓…...

linux驱动编程 - kfifo先进先出队列

简介&#xff1a; kfifo是Linux Kernel里面的一个 FIFO&#xff08;先进先出&#xff09;数据结构&#xff0c;它采用环形循环队列的数据结构来实现&#xff0c;提供一个无边界的字节流服务&#xff0c;并且使用并行无锁编程技术&#xff0c;即当它用于只有一个入队线程和一个出…...

JS 四舍五入使用整理

一、Number.toFixed() 把数字转换为字符串,结果的小数点后有指定位数的数字,重点返回的数据类型为字符串 toFixed() 方法将一个浮点数转换为指定小数位数的字符串表示,如果小数位数高于数字,则使用 0 来填充。 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。…...

上万组风电,光伏,用户负荷数据分享

上万组风电&#xff0c;光伏&#xff0c;用户负荷数据分享 可用于风光负荷预测等研究 获取链接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取码&#xff1a;381i 获取链接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…...

在物联网快速发展的趋势下,Java 怎样优化对低功耗、资源受限的边缘设备的支持,保障物联网应用的稳定运行?

在物联网快速发展的趋势下&#xff0c;Java可以通过以下方式优化对低功耗、资源受限的边缘设备的支持&#xff0c;以保障物联网应用的稳定运行&#xff1a; 精简Java运行环境&#xff1a;针对边缘设备的资源限制&#xff0c;可以使用精简型的Java运行环境&#xff0c;避免不必要…...

java-HashSet 源码分析 1

## 深入分析 Java 中的 HashSet 源码 HashSet 是 Java 集合框架中的一个重要类&#xff0c;它基于哈希表实现&#xff0c;用于存储不重复的元素。HashSet 允许 null 元素&#xff0c;并且不保证元素的顺序。本文将详细分析 HashSet 的源码&#xff0c;包括其数据结构、构造方法…...

K8S 部署 EFK

安装说明 系统版本为 Centos7.9 内核版本为 6.3.5-1.el7 K8S版本为 v1.26.14 ES官网 开始安装 本次安装使用官方ECK方式部署 EFK&#xff0c;部署的是当前的最新版本。 在 Kubernetes 集群中部署 ECK 安装自定义资源 如果能打开这个网址的话直接用这个命令安装,打不开的话…...

AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)

AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …...

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务9:HBase的安装和部署

任务描述 任务内容为HBase的安装部署与测试。 任务指导 HBase集群需要整个集群所有节点安装的HBase版本保持一致&#xff0c;并且拥有相同的配置 具体配置步骤如下&#xff1a; 1. 解压缩HBase的压缩包 2. 配置HBase的环境变量 3. 修改HBase的配置文件&#xff0c;HBase…...

go语言day09 通道 协程的死锁

Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com) 目录 通道 创建通道 1&#xff09;无缓冲通道 2&#xff09;有缓冲通道 通道的使用 1) 值从通道入口进 2) 值从通道出口出 信道死锁&#xff1a; 0&#xff09;死锁现场0 1&#xff09;死…...

黑马的ES课程中的不足

在我自己做项目使用ES的时候&#xff0c;发现了黑马没教的方法&#xff0c;以及一些它项目的小问题 搜索时的匹配方法 这个boolQuery().should 我的项目是通过文章的标题title和内容content来进行搜索 但是黑马它的项目只用了must 如果我们的title和content都用must&#x…...

STM32 中断编程入门

目录 一、中断系统 1、中断的原理 2、中断类型 外部中断 定时器中断 DMA中断 3、中断处理函数 中断标志位清除 中断服务程序退出 二、实际应用 中断控制LED 任务要求 代码示例 中断控制串口通信 任务要求1 代码示例 任务要求2 代码示例 总结 学习目标&…...

使用maven搭建一个SpingBoot项目

1.首先创建一个maven项目 注意选择合适的jdk版本 2.添加依赖 2.在pom.xml中至少添加依赖 spring-boot-starter-web 依赖&#xff0c;目的是引入Tomcat&#xff0c;以及SpringMVC等&#xff0c;使项目具有web功能。 <!-- 引入 包含tomcat&#xff0c;SpringMVC&#xff0c…...

使用 HTTPS 已成为网站的标配了

网站使用HTTPS的原因 背景&#xff1a;十年前&#xff0c;HTTPS并不普遍&#xff0c;但随着网络安全意识的提高&#xff0c;现在已成为网站标配。 网站升级到HTTPS的动机 安全问题&#xff1a;HTTP缺乏安全机制&#xff0c;易被窃取和篡改数据。例如&#xff0c;电信运营商劫…...

前后端分离Nginx

背景 旧的部署方式是将前端代码打包进后端包的resource server {listen 80;listen 443 ssl;server_name xxx.test.com;location / {proxy_pass http://xxx.test.com;} }后端&#xff1a;https:// xxx.test.com/simcard/querySimcard 前端&#xff1a;https:// x…...

【简单讲解下Tauri】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

mac上挂载linux目录

在 macOS 上挂载 CentOS 目录步骤&#xff1a; 在挂载前确保 macOS 和 CentOS 在同一个局域网内&#xff0c;并且可以相互访问。如果有网络配置问题&#xff0c;可能会导致挂载失败或连接被拒绝的错误。 要在 macOS 上将 CentOS 的 /disk2/go 目录通过 NFS 挂载到 /Users/zon…...

Linux系统的服务——以Centos7为例

一、Linux系统的服务简介 服务是向外部提供对应功能的进程&#xff0c;其运行在系统后台&#xff0c;能够7*24小时持续不断的提供外界随时发来的服务请求&#xff0c;且服务进程常驻在内存中&#xff0c;具有固定的端口号&#xff0c;通过端口号就能找到服务内容。 提供服务的一…...