k8s 的网络通信
目录
1 k8s通信整体架构
2 flannel 网络插件
2.1 flannel 插件组成
2.2 flannel 插件的通信过程
2.3 flannel 支持的后端模式
3 calico 网络插件
3.1 calico 简介
3.2 calico 网络架构
3.3 部署 calico
1 k8s通信整体架构
-
k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel,calico等
-
CNI插件存放位置:# cat /etc/cni/net.d/10-flannel.conflist
-
插件使用的解决方案如下
-
虚拟网桥,虚拟网卡,多个容器共用一个虚拟网卡进行通信。
-
多路复用:MacVLAN,多个容器共用一个物理网卡进行通信。
-
硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好。
-
-
容器间通信:
-
同一个pod内的多个容器间的通信,通过lo即可实现pod之间的通信
-
同一节点的pod之间通过cni网桥转发数据包。
-
不同节点的pod之间的通信需要网络插件支持
-
-
pod和service通信: 通过iptables或ipvs实现通信,ipvs取代不了iptables,因为ipvs只能做负载均衡,而做不了nat转换
-
pod和外网通信:iptables的MASQUERADE
-
Service与集群外部客户端的通信;(ingress、nodeport、loadbalancer)
2 flannel 网络插件
2.1 flannel 插件组成
插件 | 功能 |
---|---|
VXLAN | 即Virtual Extensible LAN(虚拟可扩展局域网),是Linux本身支持的一网种网络虚拟化技术。VXLAN可以完全在内核态实现封装和解封装工作,从而通过“隧道”机制,构建出覆盖网络(Overlay Network) |
VTEP | VXLAN Tunnel End Point(虚拟隧道端点),在Flannel中 VNI的默认值是1,这也是为什么宿主机的VTEP设备都叫flannel.1的原因 |
Cni0 | 网桥设备,每创建一个pod都会创建一对 veth pair。其中一端是pod中的eth0,另一端是Cni0网桥中的端口(网卡) |
Flannel.1 | TUN设备(虚拟网卡),用来进行 vxlan 报文的处理(封包和解包)。不同node之间的pod数据流量都从overlay设备以隧道的形式发送到对端 |
Flanneld | flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。同时Flanneld监听K8s集群数据库,为flannel.1设备提供封装数据时必要的mac、ip等网络数据信息 |
2.2 flannel 插件的通信过程
-
当容器发送IP包,通过veth pair 发往cni网桥,再路由到本机的flannel.1设备进行处理。
-
VTEP设备之间通过二层数据帧进行通信,源VTEP设备收到原始IP包后,在上面加上一个目的MAC地址,封装成一个内部数据帧,发送给目的VTEP设备。
-
内部数据桢,并不能在宿主机的二层网络传输,Linux内核还需要把它进一步封装成为宿主机的一个普通的数据帧,承载着内部数据帧通过宿主机的eth0进行传输。
-
Linux会在内部数据帧前面,加上一个VXLAN头,VXLAN头里有一个重要的标志叫VNI,它是VTEP识别某个数据桢是不是应该归自己处理的重要标识。
-
flannel.1设备只知道另一端flannel.1设备的MAC地址,却不知道对应的宿主机地址是什么。在linux内核里面,网络设备进行转发的依据,来自FDB的转发数据库,这个flannel.1网桥对应的FDB信息,是由flanneld进程维护的。
-
linux内核在IP包前面再加上二层数据帧头,把目标节点的MAC地址填进去,MAC地址从宿主机的ARP表获取。
-
此时flannel.1设备就可以把这个数据帧从eth0发出去,再经过宿主机网络来到目标节点的eth0设备。目标主机内核网络栈会发现这个数据帧有VXLAN Header,并且VNI为1,Linux内核会对它进行拆包,拿到内部数据帧,根据VNI的值,交给本机flannel.1设备处理,flannel.1拆包,根据路由表发往cni网桥,最后到达目标容器。
# 默认网络通信路由[root@k8s-master ~]# ip route
default via 192.168.239.2 dev eth0 proto static metric 100
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink # flannel.1 onlink 即vxlan模式
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
192.168.239.0/24 dev eth0 proto kernel scope link src 192.168.239.100 metric 100 # 桥接转发数据库
[root@k8s-master ~]# bridge fdb
01:00:5e:00:00:01 dev eth0 self permanent
01:00:5e:00:00:fb dev eth0 self permanent
01:00:5e:00:00:01 dev virbr0 self permanent
01:00:5e:00:00:fb dev virbr0 self permanent
52:54:00:e9:79:9d dev virbr0-nic vlan 1 master virbr0 permanent
52:54:00:e9:79:9d dev virbr0-nic master virbr0 permanent
33:33:00:00:00:01 dev docker0 self permanent
01:00:5e:00:00:01 dev docker0 self permanent
01:00:5e:00:00:fb dev docker0 self permanent
02:42:c5:53:18:d6 dev docker0 vlan 1 master docker0 permanent
02:42:c5:53:18:d6 dev docker0 master docker0 permanent
33:33:00:00:00:01 dev dummy0 self permanent
33:33:00:00:00:01 dev kube-ipvs0 self permanent
aa:51:31:0d:75:9c dev flannel.1 dst 192.168.239.120 self permanent
ae:69:8d:48:73:fe dev flannel.1 dst 192.168.239.110 self permanent
33:33:00:00:00:01 dev cni0 self permanent
01:00:5e:00:00:01 dev cni0 self permanent
33:33:ff:3c:1a:c8 dev cni0 self permanent
01:00:5e:00:00:fb dev cni0 self permanent
32:70:25:3c:1a:c8 dev cni0 vlan 1 master cni0 permanent
32:70:25:3c:1a:c8 dev cni0 master cni0 permanent
d6:f4:e8:62:81:f4 dev veth981accb8 vlan 1 master cni0 permanent
e2:32:52:80:6b:7e dev veth981accb8 master cni0
d6:f4:e8:62:81:f4 dev veth981accb8 master cni0 permanent
33:33:00:00:00:01 dev veth981accb8 self permanent
01:00:5e:00:00:01 dev veth981accb8 self permanent
33:33:ff:62:81:f4 dev veth981accb8 self permanent
2e:6d:1d:95:6d:60 dev veth77413d63 master cni0 permanent
2e:6d:1d:95:6d:60 dev veth77413d63 vlan 1 master cni0 permanent
be:f6:e4:24:ba:a1 dev veth77413d63 master cni0
33:33:00:00:00:01 dev veth77413d63 self permanent
01:00:5e:00:00:01 dev veth77413d63 self permanent
33:33:ff:95:6d:60 dev veth77413d63 self permanent# arp列表
[root@k8s-master ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.239.1 ether 00:50:56:c0:00:08 C eth0
10.244.1.0 ether ae:69:8d:48:73:fe CM flannel.1
10.244.0.10 ether e2:32:52:80:6b:7e C cni0
10.244.0.11 ether be:f6:e4:24:ba:a1 C cni0
192.168.239.110 ether 00:0c:29:e8:3a:34 C eth0
192.168.239.2 ether 00:50:56:e7:94:f6 C eth0
192.168.239.120 ether 00:0c:29:58:a0:fd C eth0
10.244.2.0 ether aa:51:31:0d:75:9c CM flannel.1
2.3 flannel 支持的后端模式
网络模式 | 功能 |
---|---|
vxlan | 报文封装,默认模式 |
Directrouting | 直接路由,跨网段使用vxlan,同网段使用host-gw模式 |
host-gw | 主机网关,性能好,但只能在二层网络中,不支持跨网络 如果有成千上万的Pod,容易产生广播风暴,不推荐 |
UDP | 性能差,不推荐 |
[root@k8s-master ~]# kubectl -n kube-flannel edit configmaps kube-flannel-cfg
apiVersion: v1
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","EnableNFTables": false,"Backend": {"Type": "host-gw" # 默认为 vxlan 这里更改为 host-gw}}
#重启pod
[root@k8s-master ~]# kubectl -n kube-flannel delete pod --all
pod "kube-flannel-ds-6k567" deleted
pod "kube-flannel-ds-x7x7l" deleted
pod "kube-flannel-ds-xxp9b" deleted
[root@k8s-master ~]# ip route
default via 192.168.239.2 dev eth0 proto static metric 100
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1
10.244.1.0/24 via 192.168.239.110 dev eth0
10.244.2.0/24 via 192.168.239.120 dev eth0
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
192.168.239.0/24 dev eth0 proto kernel scope link src 192.168.239.100 metric 100
3 calico 网络插件
3.1 calico 简介
-
纯三层的转发,中间没有任何的NAT和overlay,转发效率最好。
-
Calico 仅依赖三层路由可达。Calico 较少的依赖性使它能适配所有 VM、Container、白盒或者混合环境场景。
官网:Install Calico networking and network policy for on-premises deployments | Calico DocumentationInstall Calico networking and network policy for on-premises deployments.https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
3.2 calico 网络架构
-
Felix:监听ECTD中心的存储获取事件,用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。
-
BIRD:一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,路由的时候到这里
3.3 部署 calico
删除原有的网络插件 flannel
[root@k8s-master cri-plugin]# ls
kube-flannel.yml# 通过清单文件 删除 flannel 资源类型
[root@k8s-master cri-plugin]# kubectl delete -f kube-flannel.yml
namespace "kube-flannel" deleted
serviceaccount "flannel" deleted
clusterrole.rbac.authorization.k8s.io "flannel" deleted
clusterrolebinding.rbac.authorization.k8s.io "flannel" deleted
configmap "kube-flannel-cfg" deleted
daemonset.apps "kube-flannel-ds" deleted# 删除 Flannel 网络配置文件 防止 不同插件其冲突
[root@k8s-master cri-plugin]# rm -rf /etc/cni/net.d/10-flannel.conflist
官网地址 下载 calico 清单文件
[root@k8s-master calico]# curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.2/manifests/calico-typha.yaml -o calico.yaml
将镜像使用 docker 拉取下来
[root@harbor ~]# docker pull docker.io/calico/typha:v3.28.2
[root@harbor ~]# docker pull docker.io/calico/node:v3.28.2
[root@harbor ~]# docker pull docker.io/calico/kube-controllers:v3.28.2
[root@harbor ~]# docker pull docker.io/calico/cni:v3.28.2
修改calico清单文件的配置
[root@k8s-master calico]# vim calico.yaml
4835 image: calico/cni:v3.28.2
4835 image: calico/cni:v3.28.2
4906 image: calico/node:v3.28.2
4932 image: calico/node:v3.28.2
5160 image: calico/kube-controllers:v3.28.2
5249 - image: calico/typha:v3.28.24973 - name: CALICO_IPV4POOL_VXLAN
4974 value: "Never"4999 - name: CALICO_IPV4POOL_CIDR
5000 value: "10.244.0.0/16"
5001 - name: CALICO_AUTODETECTION_METHOD
5002 value: "interface=eth0"
声明清单文件
[root@k8s-master calico]# kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
poddisruptionbudget.policy/calico-typha created
serviceaccount/calico-kube-controllers created
serviceaccount/calico-node created
serviceaccount/calico-cni-plugin created
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
service/calico-typha created
daemonset.apps/calico-node created
deployment.apps/calico-kube-controllers created
deployment.apps/calico-typha created
是否加载了calico插件
[root@k8s-master calico]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-56cd9cdfcd-mq9wq 1/1 Running 0 32s
calico-node-bgd7s 1/1 Running 0 32s
calico-node-l957p 1/1 Running 0 32s
calico-node-ts4mq 1/1 Running 0 32s
calico-typha-7c66d894d-8t6rv 1/1 Running 0 32s
coredns-66d4c695bb-f7bvq 1/1 Running 4 (27h ago) 10d
coredns-66d4c695bb-llnfv 1/1 Running 4 (27h ago) 10d
etcd-k8s-master 1/1 Running 4 (27h ago) 10d
kube-apiserver-k8s-master 1/1 Running 4 (27h ago) 10d
kube-controller-manager-k8s-master 1/1 Running 5 (27h ago) 10d
kube-proxy-pgzvt 1/1 Running 2 (27h ago) 7d6h
kube-proxy-qv44r 1/1 Running 2 (27h ago) 7d6h
kube-proxy-zwt7c 1/1 Running 2 (27h ago) 7d6h
kube-scheduler-k8s-master 1/1 Running 5 (27h ago) 10d[root@k8s-master calico]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 10d v1.30.0
k8s-node1 Ready <none> 10d v1.30.0
k8s-node2 Ready <none> 10d v1.30.0[root@k8s-master calico]# kubectl run web --image nginx:latest --port 80
pod/web created[root@k8s-master calico]# curl 10.244.169.129
<!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>
这个时候需要重启重新加载网卡集群
不重启看不到网卡效果
[root@k8s-master ~]# reboot
[root@k8s-node1 ~]# reboot
[root@k8s-node2 ~]# reboot
查看是否重新加载
# master
[root@k8s-master ~]# ifconfig | grep -A 6 cali
calibb4b7ff266b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
--
calif66e318b6af: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# node1
[root@k8s-node1 ~]# ifconfig | grep -A 6 cali
cali38611089018: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
--
cali61bb03b2f20: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
--
cali96923616f01: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
--
cali9f2541b8e98: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# node2
[root@k8s-node2 ~]# ifconfig | grep -A 6 cali
cali290a9f54e70: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
--
cali4a60cab99b6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
--
cali68caf03a5f4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1480inet6 fe80::ecee:eeff:feee:eeee prefixlen 64 scopeid 0x20<link>ether ee:ee:ee:ee:ee:ee txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0# 最后一行倒数第三行
[root@k8s-master ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.239.110 ether 00:0c:29:e8:3a:34 C eth0
192.168.239.120 ether 00:0c:29:58:a0:fd C eth0
192.168.239.2 ether 00:50:56:e7:94:f6 C eth0
10.244.235.193 ether ee:ba:6a:62:1e:19 C calibb4b7ff266b
192.168.239.1 ether 00:50:56:c0:00:08 C eth0
10.244.235.194 ether aa:49:13:e7:00:a5 C calif66e318b6af# 第二第三行使用bird路由程序,这个是获取路由变化的,并且是calico独有的
[root@k8s-master ~]# ip route
default via 192.168.239.2 dev eth0 proto static metric 100
10.244.36.64/26 via 192.168.239.110 dev tunl0 proto bird onlink
10.244.169.128/26 via 192.168.239.120 dev tunl0 proto bird onlink
blackhole 10.244.235.192/26 proto bird
10.244.235.193 dev calibb4b7ff266b scope link
10.244.235.194 dev calif66e318b6af scope link
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
192.168.239.0/24 dev eth0 proto kernel scope link src 192.168.239.100 metric 100
相关文章:

k8s 的网络通信
目录 1 k8s通信整体架构 2 flannel 网络插件 2.1 flannel 插件组成 2.2 flannel 插件的通信过程 2.3 flannel 支持的后端模式 3 calico 网络插件 3.1 calico 简介 3.2 calico 网络架构 3.3 部署 calico 1 k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较…...

【编程基础知识】掌握Spring MVC:从入门到精通
摘要: 本文将深入探讨Spring MVC框架的核心概念、组件和工作流程。读者将学习如何将Spring MVC应用于现代Web应用程序开发中,并通过实际代码示例和流程图,理解其强大的功能和灵活性。文章最后,我们将通过一个Excel表格总结全文内容…...

多线程下,@Transactional失效解决
一、问题复现 批量插入时,使用多线程对插入数据实现分批插入,在service层使用Transactional注解,对应方法中线程池中开辟的子线程抛出异常时,没有回滚事务。 二、原因分析 事务管理范围不正确:Transactional注解仅对…...

PyCharm 项目解释器切换指南:如何在项目中更换 Python Interpreter
PyCharm 项目解释器切换指南:如何在项目中更换 Python Interpreter 文章目录 PyCharm 项目解释器切换指南:如何在项目中更换 Python Interpreter一 Settings 设置二 Project 选项三 Conda Environment四 更换 Environment 本文详细介绍了在 macOS 系统中…...

STM32F407寄存器操作(DMA+SPI)
1.前言 前面看B站中有些小伙伴吐槽F4的SPIDMA没有硬件可控的CS引脚,那么今天我就来攻破这个问题 我这边暂时没有SPI的从机芯片,并且接收的过程与发送的过程类似,所以这里我就以发送的过程为例了。 2.理论 手册上给出了如下的描述 我们关注…...

Oracle 的 OCP 与 MySQL 的 OCP 的区别
事务开始与提交(以 Java 代码中的事务操作为例) Oracle(在 Java 中使用 JDBC 进行事务操作) import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public cla…...

数据治理、数据清洗定义、区别以及数据清洗常用方法
一、数据治理定义 数据治理是一种组织数据管理的方法,涉及数据的收集、存储、处理、分析和共享等方面,旨在最大程度地利用数据资产并降低数据相关的风险。 数据治理确保数据的质量、安全性、合规性和可用性,以支持组织的决策和运营活动。…...

web基础-攻防世界
get-post 一、WP (题目本质:get与post传参方法) 用 GET 给后端传参的方法是:在?后跟变量名字,不同的变量之间用&隔开。例如,在 url 后添加/?a1 即可发送 get 请求。 利用 hackbar 进行…...

Java基础-String Class(字符串类)
String Java String 类概览 String 类是 Java 中最常用的类之一,用于处理字符串。以下是 String 类的主要特性和操作: 特性/操作描述不可变性String 对象一旦创建就不能被修改创建方式使用双引号 “” 或 String 构造函数字符串池Java 维护字符串常量池…...

《Linux服务与安全管理》| 服务进程与网络配置
《Linux服务与安全管理》| 服务进程与网络配置 目录 《Linux服务与安全管理》| 服务进程与网络配置 (1) 写出查看NetworkManager服务状态的命令。 (2) 写出查看NetworkManager服务自启动状态的命令。 (3࿰…...

No.15 笔记 | CSRF 跨站请求伪造
目录 一、基础知识 (一)cookie 和 session、同源策略 (二)CSRF 原理 二、CSRF 类型 (一)GET 类型 (二)POST 类型 三、CSRF 实例讲解 (一)真实案例 &am…...

解决linux中pip速度过慢问题
在 Linux 系统下,如果你发现使用 pip 下载 Python 库时速度非常慢,可以考虑以下几种方法来加速下载: 使用 pip 的 -i 选项: 如果你只想临时使用其他镜像,可以在安装时加上 -i 选项: pip install package_n…...

FlinkSQL中 的 双流JOIN
在 Flink SQL 中,流与流的 JOIN 是一种复杂的操作,因为它涉及到实时数据的无界处理。理解 Flink SQL 流与流 JOIN 的底层原理和实现需要从多个角度来分析,包括 状态管理、事件时间处理、窗口机制 以及 内部数据流处理模型 等。下面将从这些角…...

Mysql(五) --- 数据库设计
文章目录 前言1.范式1.1.第一范式1.1.1 定义1.1.2.例子 1.2.第二范式1.2.1 定义1.2.2 例子1.2.3.不满足第二范式可能会出现的问题 1.3.第三范式1.3.1 定义2.3.2 示例 2. 设计过程3. 实体-关系图3.1 E-R图的基本组成3.2 关系的类型3.2.1 一对一关系(1:1)3.2.2 ⼀对多关系(1:N)3.…...

po框架的了解和应用
https://www.cnblogs.com/xiaolehong/p/18458470 笔记 任务:1、通过po框架输入测试报告 2、编写自动化测试框架 3、总结测试讲解稿 自动化测试框架概念: 自动化测试框架是一个集成体系,这个体系中包含测试功能的函数、测试数据源、测试对以及重要的模块。 作用:用于解决或…...

Linux云计算 |【第四阶段】RDBMS2-DAY5
主要内容: PXC概述、部署PXC(自动故障恢复测试)、存储引擎、读锁/写锁、表锁/行锁、常用的存储引擎介绍 一、PXC概述 PXC(Percona XtraDB Cluster,简称PXC集群),是基于Galera的MySQL高可用集群…...

从0开始深度学习(9)——softmax回归的逐步实现
文章使用Fashion-MNIST数据集,做一次分类识别任务 Fashion-MNIST中包含的10个类别,分别为: t-shirt(T恤)、trouser(裤子)、pullover(套衫)、dress(连衣裙&…...

Cannot inspect org.apache.hadoop.hive.serde2.io.HiveDecimalWritable 问题分析处理
报错; org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.UnsupportedOperationException: Cannot inspect org.apache.hadoop.hive.serde2.io.HiveDecimalWritable 该问题常见于parquet格式hive表查询时,一般原因为hive表对应数据文件元数据对应格式与…...

电子取证新视角:USB键盘流量提取密码方法研究与实现
0x01 引言 在当今数字化时代,USB设备的广泛使用使得信息安全和电子取证领域面临着新的挑战与机遇。特别是USB键盘,作为一种常见的输入设备,其流量中可能包含用户输入的敏感信息,如密码和其他私人数据。因此,研究USB键…...

Tongweb7049m4+THS6010-6012配置故障轉移+重試机制(by lqw)
使用场景 1.ths代理tongweb多套后端,假如有其中一套tongweb因为服务器重启或者宕机后没有及时启动,导致ths一直轮询在这个出故障的节点上。 2.即使在tongweb重启了,有的应用启动也需要一定的时间,这个时候只是启动了应用端口&…...

在线客服系统网站源码-网页聊天客服实现代码
源码简介 在线客服系统 – 网上客服系统,在线客服系统网站源码。 消息预知功能就是别人在聊天框打字你都能看到 1.新增客服坐席消息互动,客服之间可以互相接收消息,可以智能分配 2.新增消息预知功能,可提前预知访客已输入未发…...

JioNLP:一款实用的中文NLP预处理工具包
一、什么是 JioNLP? JioNLP是一个面向NLP开发者的工具包,提供了常见的中文文本预处理、解析等功能,使用简单、高效准确、无需配置,可极大加快NLP项目的开发进度。 主要特点包括: 代码开源,使用MIT协议功能丰富,涵盖多个NLP预处理需求使用简单,无需复杂配置即可调用准确高效…...

GR-ConvNet论文 学习笔记
GR-ConvNet 文章目录 GR-ConvNet前言一、引言二、相关研究三、问题阐述四、方法A.推理模块B.控制模块C.模型结构D.训练方法E.损失函数 五、评估A.数据集B.抓取评判标准 六、实验A.设置B.家庭测试物体C.对抗性测试物体D.混合物体 七、结果A.康奈尔数据集B.Jacquard数据集C.抓取新…...

windows环境批量删除指定目录下的全部指定文件
写在开头: 1. 涉及文件删除,先在小范围内测试(更改D:\扫描文件路径) 2. 命令会递归该目录下的所有文件 命令: forfiles /p D:\ /s /m _maven.repositories /c "cmd /c del path"解释: /p D:\ …...

水深探测仪的作用和使用方法
在水域救援的行动里,救援人员时刻面临着复杂多变、充满未知的水域状况。当接到救援任务奔赴现场,那片需要涉足的水域就像一个神秘莫测的异世界,挑战着所有人的认知与勇气。 水深探测仪作为一种专用于测量水域深度的设备,通过声波和…...

Leetcode 搜索插入位置
这段代码的核心思想是 二分查找,用于在一个已经排序的数组中查找目标值的位置。如果目标值存在于数组中,返回它的索引;如果目标值不存在,返回它按顺序应该插入的位置。 算法思想步骤: 定义左右边界: 我们使…...

jsp怎么实现点赞功能
在JSP中实现点赞功能通常涉及前端页面的设计、后端逻辑处理以及数据存储。为了实现点赞功能,你可以使用以下步骤: 前端(JSP页面)设计 前端部分包括显示点赞按钮,并通过Ajax发送点赞请求,以避免页面刷新。 …...

取消microsoft edge作为默认浏览器 ,修改方法,默认修改不了的原因
将Microsoft Edge或其它浏览器设置为默认浏览器,可以尝试以下方法来解决此问题: 一, 通过浏览器设置修改:打开Microsoft Edge浏览器,单击右上角的“更多”按钮,然后选择“设置”。在设置页面左侧找到“默认…...

C++面试速通宝典——17
283. Nginx负载均衡算法 Nginx支持多种负载均衡算法。 轮询(Round Robin):默认算法,按顺序逐个分配请求到后端服务器。加权轮询(Weighted Round Robin):与轮询类似,但…...

10、论文阅读:基于双阶对比损失解纠缠表示的无监督水下图像增强
Unsupervised Underwater Image Enhancement Based on Disentangled Representations via Double-Order Contrastive Loss 前言引言方法介绍解耦框架多尺度生成器双阶对比损失双阶对比损失总结损失函数实验前言 在水下环境中拍摄的图像通常会受到颜色失真、低对比度和视觉质量…...