首页 > 其他分享 >Cilium Socket LB 特性

Cilium Socket LB 特性

时间:2024-07-10 18:30:31浏览次数:16  
标签:10.0 set LB Socket -- Cilium length 80 cilium

Cilium Socket LB

一、环境信息

主机 IP
ubuntu 172.16.94.141
软件 版本
docker 26.1.4
helm v3.15.0-rc.2
kind 0.18.0
kubernetes 1.23.4
ubuntu os Ubuntu 20.04.6 LTS
kernel 5.11.5 内核升级文档

二、Cilium SocketLB 模式认知

负载均衡的实现方式通常有如下两种:

  • 客户端负载均衡,自行选择目标端点。这样做的好处是,在建立连接时预先支付负载均衡的成本,并且在连接的生命周期内不存在额外的开销。这种方法的缺点是这对应用程序不透明。
  • 服务端负载均衡,通过一个中间服务将请求转换为对应服务 IP 来执行负载平衡。与客户端负载平衡相比,此方法的优点是透明。应用程序本身不涉及。然而,缺点是每个网络数据包都需要在请求和响应上更改其 IP 地址。

Cilium 1.6 中,引入了基于套接字的负载平衡(socket-based load-balancing),它结合了两种方法的优点:

img

  • Transparent: 负载平衡对应用程序保持 100% 透明。服务是使用标准 Kubernetes svc
  • Highly efficient: 通过转换地址在socket层面执行负载平衡,LB的成本是在建立连接时预先支付的,并且在之后的连接持续时间内不需要额外的ip地址转换。性能与应用程序直接与后端对话相同。

三、传统 kube-proxy 实现 service 负载均衡

img

可以查看此文档 Cilium Native Routing with kubeProxy 模式 中,Service 网络通讯,数据包转发流程一致

四、Cilium Socket LB 如何实现东西向流量的负载均衡

kind 配置文件信息

root@kind:~# cat install.sh

#!/bin/bash
date
set -v

# 1.prep noCNI env
cat <<EOF | kind create cluster --name=cilium-socket-lb --image=kindest/node:v1.23.4 --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  # kind 默认使用 rancher cni,cni 我们需要自己创建
  disableDefaultCNI: true
  # kind 安装 k8s 集群需要禁用 kube-proxy 安装,是 cilium 代替 kube-proxy 功能
  kubeProxyMode: "none"

nodes:
 - role: control-plane
 - role: worker
 - role: worker

containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.evescn.com"]
    endpoint = ["https://harbor.evescn.com"]
EOF

# 2.remove taints
controller_node_ip=`kubectl get node -o wide --no-headers | grep -E "control-plane|bpf1" | awk -F " " '{print $6}'`
#kubectl taint nodes $(kubectl get nodes -o name | grep control-plane) node-role.kubernetes.io/master:NoSchedule-
kubectl get nodes -o wide

# 3.install cni
helm repo add cilium https://helm.cilium.io > /dev/null 2>&1
helm repo update > /dev/null 2>&1

# Direct Routing Options(--set kubeProxyReplacement=strict --set tunnel=disabled --set autoDirectNodeRoutes=true --set ipv4NativeRoutingCIDR="10.0.0.0/8")
# Host Routing[EBPF](--set bpf.masquerade=true)

helm install cilium cilium/cilium \
   --set k8sServiceHost=$controller_node_ip \
   --set k8sServicePort=6443 \
   --version 1.13.0-rc5 \
   --namespace kube-system \
   --set debug.enabled=true \
   --set debug.verbose=datapath \
   --set monitorAggregation=none \
   --set ipam.mode=cluster-pool \
   --set cluster.name=cilium-socket-lb \
   --set kubeProxyReplacement=strict \
   --set tunnel=disabled \
   --set autoDirectNodeRoutes=true \
   --set ipv4NativeRoutingCIDR="10.0.0.0/8" \
   --set bpf.masquerade=true \
   --set installNoConntrackIptablesRules=true \
   --set socketLB.enabled=true


# 4.install necessary tools
for i in $(docker ps -a --format "table {{.Names}}" | grep cilium) 
do
    echo $i
    docker cp /usr/bin/ping $i:/usr/bin/ping
    docker exec -it $i bash -c "sed -i -e 's/jp.archive.ubuntu.com\|archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list"
    docker exec -it $i bash -c "apt-get -y update >/dev/null && apt-get -y install net-tools tcpdump lrzsz bridge-utils >/dev/null 2>&1"
done

--set 参数解释

  1. --set kubeProxyReplacement=strict

    • 含义: 启用 kube-proxy 替代功能,并以严格模式运行。
    • 用途: Cilium 将完全替代 kube-proxy 实现服务负载均衡,提供更高效的流量转发和网络策略管理。
  2. --set tunnel=disabled

    • 含义: 禁用隧道模式。
    • 用途: 禁用后,Cilium 将不使用 vxlan 技术,直接在主机之间路由数据包,即 direct-routing 模式。
  3. --set autoDirectNodeRoutes=true

    • 含义: 启用自动直接节点路由。
    • 用途: 使 Cilium 自动设置直接节点路由,优化网络流量。
  4. --set ipv4NativeRoutingCIDR="10.0.0.0/8"

    • 含义: 指定用于 IPv4 本地路由的 CIDR 范围,这里是 10.0.0.0/8
    • 用途: 配置 Cilium 使其知道哪些 IP 地址范围应该通过本地路由进行处理,不做 snat , Cilium 默认会对所用地址做 snat。
  5. --set bpf.masquerade

    • 含义: 启用 eBPF 功能。
    • 用途: 使用 eBPF 实现数据路由,提供更高效和灵活的网络地址转换功能。
  6. --set installNoConntrackIptablesRules=true:

    • 安装无连接跟踪的 iptables 规则,这样可以减少 iptables 规则集中的连接跟踪负担。
  7. --set socketLB.enabled=true:

    • 启用 Socket Load Balancer(SLB),用于优化服务之间的负载均衡。
  • 安装 k8s 集群和 cilium 服务
root@kind:~# ./install.sh

Creating cluster "cilium-socket-lb" ...
 ✓ Ensuring node image (kindest/node:v1.23.4) 

标签:10.0,set,LB,Socket,--,Cilium,length,80,cilium
From: https://www.cnblogs.com/evescn/p/18294781

相关文章

  • Lbview调用python脚本报错:错误1667...无法导入指定的python模块
    前提注意:NILabVIEW2021(32位)Python3.9.10(32位)32位对应32位,64位同理,否则可能会报错报错的原因:LabVIEW中使用的Python环境与安装的Python包不匹配也就是说Labview中使用的是python版本安装的系统路径,而PyCharm使用的虚拟环境路径,它的包都是下载到项目文件夹内可......
  • Java socket 获取gps定位
    1.Javasocket获取gps定位的方法在Java中使用Socket来直接获取GPS定位信息并不直接可行,因为GPS数据通常不是通过Socket通信来获取的。GPS数据通常由设备(如智能手机、GPS接收器)上的GPS硬件模块生成,并通过操作系统或专门的GPS软件库来访问。然而,如果我们的目的是通过Socket从某个......
  • ELB Ingress网关助力云原生应用轻松管理流量
    本文分享自华为云社区《ELBIngress网关助力云原生应用轻松管理流量》,作者:云容器大未来。背景通常情况下,K8s集群的容器网络平面和外部网络是隔离的,外部网络无法直接访问到集群内部的容器业务,如何为容器提供并管理统一的外部流量入口?社区提供的常见方式是使用NodeportService,Lo......
  • Linux网络:网络字节序及socket套接字
    目录一、认识端口号二、浅谈TCP及UDP协议三、网络字节序四、socket编程4.1常见接口4.2sockAPI4.2.1sockaddr4.2.2sockaddr_in4.2.3in_addr一、认识端口号端口号(port)是传输层协议的内容.端口号是一个2字节16位的整数;端口号用来标识一个进程,告诉操......
  • ROS2开发BUG记录:在将 use_sim_timer 置为 true 时,节点的 Timer_Callback 行为“异常”
    问题:在将use_sim_timer置为true时,节点Timer_Callback行为“异常”。在回调函数中,使用self.get_logger().info("xxxx")输出信息,希望通过查看Info中的时间戳(如下),测试Timer_Callback回调频率是否正常。发现该时间戳与预期回调频率不符。[target_server-7][INFO][17......
  • go 使用websocket
    packagechatimport( "encoding/json" "github.com/gorilla/websocket" "github.com/zeromicro/go-zero/core/logx" "log" "net/http" "sync")typeClientstruct{ conn*websocket.Conn......
  • python socket模块实现上传文件到服务器
    socket模块文件上传案例catserver.py#-*-coding:UTF-8-*-importsocketsock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.bind(('0.0.0.0',8001))#127.0.0.1或查看自己局域网本地IP地址sock.listen(1)conn,addr=sock.accept()#接收......
  • Linux开发:进程间通过Unix Domain Socket传递数据
    进程间传递数据的方式有很多种,Linux还提供一种特殊的Socket用于在多进程间传递数据,就是UnixDomainSocket(UDS)。虽然通过普通的Socket也能做到在多进程间传递数据,不过这样需要通过协议栈层的打包与拆包,未免有些浪费效率,通过UDS,数据仅仅通过一个特殊的sock文件就可以进行传递。......
  • 【无人机通信】Stackelberg算法无人机边缘计算抗干扰信道分配【含Matlab源码 4957期】
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • SpringBoot引入WebSocket
    WebSocket是一种在客户端和服务器之间提供低延迟、全双工通信的网络协议。它允许双方在建立一次连接后,进行实时、持续的数据交换,无需像HTTP那样为每一个请求和响应建立新的连接。WebSocket的设计初衷是解决传统HTTP协议在实时通信方面的不足,比如实现实时聊天、游戏、股票报价等......