k8s的svc流量通过iptables和ipvs转发到pod的流程解析
文章目录
- 1. k8s的svc流量转发
- 1.1 service 说明
- 1.2 endpoints说明
- 1.3 pod 说明
- 1.4 svc流量转发的主要工作
- 2. iptables规则解析
- 2.1 svc涉及的iptables链流程说明
- 2.2 svc涉及的iptables规则实例
- 2.2.1 KUBE-SERVICES规则链
- 2.2.2 KUBE-SVC-EFPSQH5654KMWHJ5规则链
- 2.2.3 KUBE-SEP-LCXGRT47CYQENZGP规则链
- 2.2.4 KUBE-FW-EFPSQH5654KMWHJ5规则链
- 2.2.5 KUBE-XLB-EFPSQH5654KMWHJ5规则链
- 2.2.6 KUBE-XLB-EFPSQH5654KMWHJ5规则链
- 2.3 iptables转发链路总结
- 3. ipvs规则解析
- 3.1 ipvs工作原理
- 3.2 ipvs支持的负载均衡算法
- 3.3 svc涉及的ipvs链流程说明
- 4. 疑问和思考
- 4.1 KUBE-MARK-MASQ规则说明
- 4.2 KUBE-MARK-DROP规则说明
- 4.3 使用iptables规则有什么问题?
- 4.4 iptables和ipvs两者的优劣势如何?
- 5. 参考文档
在常用的k8s环境中,通常会通过iptables将流量进行负载均衡、snat、dnat等操作,从而流量转发到pod或者外部的服务。本文重点介绍iptables是如何进行流量转发的以及相关转发的iptables和ipvs解析。
1. k8s的svc流量转发
1.1 service 说明
service只是一个抽象概念,在逻辑上将一组pod(功能相同)给抽象出来一个统一入口。可以将他简单理解为做了一个服务的负载均衡。我们知道pod在重新部署之后ip会改变,所以一般会通过service来访问pod。core-dns会给service分配一个内部的虚拟ip(节点上根本查询不到这个ip,ping是不通的,具体是怎么访问到的继续往下看),因此内部服务可以通过这个ip或者是serviceName来访问到pod的服务。
service提供的常用type:
- ClusterIP,也是默认方式。Service会分配一个集群内部的固定虚拟IP,实现集群内通过该IP来对POD进行访问。这个又有两类,上面说到的最普通的Service,ClusterIP还有一种是Headless Service,这种形式不会分配IP也不会通过kube-proxy做反向代理或者负载均衡,而是通过DNS提供稳定的网络ID来访问,DNS会将headless service的后端直接解析为POD的IP列表,这种主要是共StatefulSet类型使用。
- NodePort,这种类型的Service是除了使用ClusterIP的功能外还会映射一个宿主机随机端口到service上,这样集群外部可以通过宿主机IP+随机端口来访问。这样得保证每一个node节点的该端口都可用才行,直接使用任意node节点的ip+端口就能直接访问pod。
- HostPort,他这个和nodeport的区别是,只在某一个node节点打开端口。
LoadBalancer:和nodePort类似,不过除了使用ClusterIP和NodePort之外还会向使用的公有云申请一个负载均衡器,从而实现集群外部通过LB来访问服务。这个主要是依托云lb。 - ExternalName:是Service的一种特例,此模式主要面对运行在集群外部的服务,通过它可以将外部服务映射到k8s集群,具备k8s内服务的一些特性,来为集群内部提供服务
apiVersion: v1
kind: Service
metadata:namespace: appname: eureka-serverlabels:name: eureka-server
spec:type: NodePort ##这个位置来指定service的类型selector:app: eureka-serverports:- port: 80targetPort: 9101nodePort: 31101
1.2 endpoints说明
endpoints也是k8s的一个资源,我们在创建service的时候如果我们设置了selector选中了需要关联的pod,那么就会创建一个与service同名的endpoints。他是用来记录service对应pod的访问地址。
[root@aliyun168-37 nginx]# kubectl get endpoints nginx-svc -n test
NAME ENDPOINTS AGE
nginx-svc 10.244.4.139:80,10.244.4.140:80,10.244.4.141:80 18m
1.3 pod 说明
Kubernetes(简称K8s)中的Pod是最小的可部署单元,它是一组相关容器的集合。一个Pod可以包含一个或多个容器,这些容器共享相同的资源(如网络和存储)。Pod提供了一种逻辑上独立的环境,使得应用可以在自己的虚拟空间中运行。
Service、Endpoint 和 Pod 的关系(下图)
1.4 svc流量转发的主要工作
Kubernetes服务(svc)能够感知Pod的变化是通过kube-proxy实现的,kube-proxy会监视Kubernetes API中的服务和端点对象,并根据Pod的变化来更新服务的endpoint信息,并进行流量转发。
总的说来,k8s的流量从svc转发到pod,一般来说需要做2个事情
- 流量负载均衡
- 包过滤,并针对来源ip、目的ip进行nat转换
如上2个功能需求,
- 通过iptables规则都能够实现,并且iptables规则主要集中在流量负载均衡上
- ipvs只能实现负载均衡部分,包过滤和nat转换需要iptables规则来实现,但是相关的iptables规则数量很少
2. iptables规则解析
集群内调用service,通常采用如下方式
- 集群内POD调用service,通常是使用Cluster IP。
- 集群内发起调用,通过cluster ip访问到service。
- 集群外发起调用,通过nodeport访问到service。
整体的转发流程图如下
node节点的iptables是由kube-proxy生成的,kube-proxy只修改了filter和nat表,它对iptables的链进行了扩充,自定义了KUBE-SERVICES,KUBE-NODEPORTS,KUBE-POSTROUTING,KUBE-MARK-MASQ和KUBE-MARK-DROP五个链,并主要通过为 KUBE-SERVICES链(附着在PREROUTING和OUTPUT)增加rule来配制traffic routing 规则
2.1 svc涉及的iptables链流程说明
svc涉及的iptables链路过程中的相关流程情况流程图如下
2.2 svc涉及的iptables规则实例
我们将针对一个iptables规则进行解析。
# 获取svc的
kubectl get svc -nkube-system -owide |grep kubernetes-lb kube-system kubernetes-lb LoadBalancer 192.168.11.23 172.29.163.9 6443:31714/TCP 2y47d cluster.infra.tce.io/component=kube-apiserver,component=kube-apiserver
# 获取svc后段的pod
kubectl get pods -n kube-system -owide |grep kube-apiserverkube-system kube-apiserver-172.33.0.11 1/1 Running 7 247d 172.33.0.11 172.33.0.11 <none> <none>
kube-system kube-apiserver-172.33.0.25 1/1 Running 1 247d 172.33.0.25 172.33.0.25 <none> <none>
kube-system kube-apiserver-172.33.0.30 1/1 Running 0 247d 172.33.0.30 172.33.0.30 <none> <none>
# 获取对应iptables情况
iptables-save |egrep "kubernetes-lb|KUBE-XLB-EFPSQH5654KMWHJ5|KUBE-SEP-LCXGRT47CYQENZGP|KUBE-SVC-EFPSQH5654KMWHJ5|KUBE-SEP-KJQQYC6E4EGY4UJE|KUBE-SEP-4DJFF4PKJG2GTZWW":KUBE-SEP-4DJFF4PKJG2GTZWW - [0:0]
:KUBE-SEP-KJQQYC6E4EGY4UJE - [0:0]
:KUBE-SEP-LCXGRT47CYQENZGP - [0:0]
:KUBE-SVC-EFPSQH5654KMWHJ5 - [0:0]
:KUBE-XLB-EFPSQH5654KMWHJ5 - [0:0]
-A KUBE-FW-EFPSQH5654KMWHJ5 -m comment --comment "kube-system/kubernetes-lb: loadbalancer IP" -j KUBE-XLB-EFPSQH5654KMWHJ5
-A KUBE-FW-EFPSQH5654KMWHJ5 -m comment --comment "kube-system/kubernetes-lb: loadbalancer IP" -j KUBE-MARK-DROP
-A KUBE-NODEPORTS -s 127.0.0.0/8 -p tcp -m comment --comment "kube-system/kubernetes-lb:" -m tcp --dport 31714 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "kube-system/kubernetes-lb:" -m tcp --dport 31714 -j KUBE-XLB-EFPSQH5654KMWHJ5
-A KUBE-SEP-4DJFF4PKJG2GTZWW -s 172.33.0.30/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-4DJFF4PKJG2GTZWW -p tcp -m tcp -j DNAT --to-destination :0 --persistent --to-destination :0 --persistent --to-destination 0.0.0.0 --persistent
-A KUBE-SEP-KJQQYC6E4EGY4UJE -s 172.33.0.25/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-KJQQYC6E4EGY4UJE -p tcp -m tcp -j DNAT --to-destination :0 --persistent --to-destination :0 --persistent --to-destination 0.0.0.0 --persistent
-A KUBE-SEP-LCXGRT47CYQENZGP -s 172.33.0.11/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-LCXGRT47CYQENZGP -p tcp -m tcp -j DNAT --to-destination :0 --persistent --to-destination :0 --persistent --to-destination 0.0.0.0 --persistent
-A KUBE-SERVICES ! -s 172.16.21.0/24 -d 192.168.11.23/32 -p tcp -m comment --comment "kube-system/kubernetes-lb: cluster IP" -m tcp --dport 6443 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 192.168.11.23/32 -p tcp -m comment --comment "kube-system/kubernetes-lb: cluster IP" -m tcp --dport 6443 -j KUBE-SVC-EFPSQH5654KMWHJ5
-A KUBE-SVC-EFPSQH5654KMWHJ5 -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-LCXGRT47CYQENZGP
-A KUBE-SVC-EFPSQH5654KMWHJ5 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-KJQQYC6E4EGY4UJE
-A KUBE-SVC-EFPSQH5654KMWHJ5 -j KUBE-SEP-4DJFF4PKJG2GTZWW
-A KUBE-XLB-EFPSQH5654KMWHJ5 -s 172.16.21.0/24 -m comment --comment "Redirect pods trying to reach external loadbalancer VIP to clusterIP" -j KUBE-SVC-EFPSQH5654KMWHJ5
-A KUBE-XLB-EFPSQH5654KMWHJ5 -m comment --comment "masquerade LOCAL traffic for kube-system/kubernetes-lb: LB IP" -m addrtype --src-type LOCAL -j KUBE-MARK-MASQ
-A KUBE-XLB-EFPSQH5654KMWHJ5 -m comment --comment "route LOCAL traffic for kube-system/kubernetes-lb: LB IP to service chain" -m addrtype --src-type LOCAL -j KUBE-SVC-EFPSQH5654KMWHJ5
-A KUBE-XLB-EFPSQH5654KMWHJ5 -m comment --comment "Balancing rule 0 for kube-system/kubernetes-lb:" -j KUBE-SEP-LCXGRT47CYQENZGP
2.2.1 KUBE-SERVICES规则链
# 将访问svc的流量访问打标记,后续流量进出节点时进行NAT转换
-A KUBE-SERVICES ! -s 172.16.21.0/24 -d 192.168.11.23/32 -p tcp -m comment --comment "kube-system/kubernetes-lb: cluster IP" -m tcp --dport 6443 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 192.168.11.23/32 -p tcp -m comment --comment "kube-system/kubernetes-lb: cluster IP" -m tcp --dport 6443 -j KUBE-SVC-EFPSQH5654KMWHJ5
访问192.168.11.23/32:6443的流量跳转到KUBE-SVC-EFPSQH5654KMWHJ5链路进行处理。
2.2.2 KUBE-SVC-EFPSQH5654KMWHJ5规则链
-A KUBE-SVC-EFPSQH5654KMWHJ5 -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-LCXGRT47CYQENZGP
-A KUBE-SVC-EFPSQH5654KMWHJ5 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-KJQQYC6E4EGY4UJE
-A KUBE-SVC-EFPSQH5654KMWHJ5 -j KUBE-SEP-4DJFF4PKJG2GTZWW
将流量进行负载均衡,给各个规则连分配权重
规则链 | 权重 |
---|---|
KUBE-SEP-LCXGRT47CYQENZGP | 0.33333333349 |
KUBE-SEP-KJQQYC6E4EGY4UJE | 0.50000000000 |
KUBE-SEP-4DJFF4PKJG2GTZWW | 1-0.33333333349-0.50000000000=0.16666666651000006 |
其中KUBE-SEP-4DJFF4PKJG2GTZWW不需要设置probability,因为可以计算出来
1 − K U B E − S E P − L C X G R T 47 C Y Q E N Z G P − K U B E − S E P − K J Q Q Y C 6 E 4 E G Y 4 U J E 1- KUBE-SEP-LCXGRT47CYQENZGP - KUBE-SEP-KJQQYC6E4EGY4UJE 1−KUBE−SEP−LCXGRT47CYQENZGP−KUBE−SEP−KJQQYC6E4EGY4UJE
2.2.3 KUBE-SEP-LCXGRT47CYQENZGP规则链
# 第1条规则:Pod通过Service访问自身时匹配,此规则仅作标记(MARK)处理;
-A KUBE-SEP-4DJFF4PKJG2GTZWW -s 172.33.0.30/32 -j KUBE-MARK-MASQ
# 第2条规则:通过DNAT重定向到后端Pod实例上,至此,通过Service最终将流量导向到后端实例上;
-A KUBE-SEP-4DJFF4PKJG2GTZWW -p tcp -m tcp -j DNAT --to-destination :0 --persistent --to-destination :0 --persistent --to-destination 0.0.0.0 --persistent
-A KUBE-SEP-KJQQYC6E4EGY4UJE -s 172.33.0.25/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-KJQQYC6E4EGY4UJE -p tcp -m tcp -j DNAT --to-destination :0 --persistent --to-destination :0 --persistent --to-destination 0.0.0.0 --persistent
-A KUBE-SEP-LCXGRT47CYQENZGP -s 172.33.0.11/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-LCXGRT47CYQENZGP -p tcp -m tcp -j DNAT --to-destination :0 --persistent --to-destination :0 --persistent --to-destination 0.0.0.0 --persistent
按照KUBE-SVC-EFPSQH5654KMWHJ5配置的负载均衡相关的权重,将相关流量转发到后段的pod,完成流量转发和负载均衡。
2.2.4 KUBE-FW-EFPSQH5654KMWHJ5规则链
-A KUBE-FW-EFPSQH5654KMWHJ5 -m comment --comment "kube-system/kubernetes-lb: loadbalancer IP" -j KUBE-XLB-EFPSQH5654KMWHJ5
-A KUBE-FW-EFPSQH5654KMWHJ5 -m comment --comment "kube-system/kubernetes-lb: loadbalancer IP" -j KUBE-MARK-DROP
KUBE-MARK-DROP设置标记的报文则会在KUBE_FIREWALL中全部丢弃
2.2.5 KUBE-XLB-EFPSQH5654KMWHJ5规则链
-A KUBE-XLB-EFPSQH5654KMWHJ5 -s 172.16.21.0/24 -m comment --comment "Redirect pods trying to reach external loadbalancer VIP to clusterIP" -j KUBE-SVC-EFPSQH5654KMWHJ5
-A KUBE-XLB-EFPSQH5654KMWHJ5 -m comment --comment "masquerade LOCAL traffic for kube-system/kubernetes-lb: LB IP" -m addrtype --src-type LOCAL -j KUBE-MARK-MASQ
-A KUBE-XLB-EFPSQH5654KMWHJ5 -m comment --comment "route LOCAL traffic for kube-system/kubernetes-lb: LB IP to service chain" -m addrtype --src-type LOCAL -j KUBE-SVC-EFPSQH5654KMWHJ5
-A KUBE-XLB-EFPSQH5654KMWHJ5 -m comment --comment "Balancing rule 0 for kube-system/kubernetes-lb:" -j KUBE-SEP-LCXGRT47CYQENZGP
2.2.6 KUBE-XLB-EFPSQH5654KMWHJ5规则链
在KUBE-XLB后,loadbalancer的IP在节点上截获后转给service
-A KUBE-SVC-EFPSQH5654KMWHJ5 -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-LCXGRT47CYQENZGP
-A KUBE-SVC-EFPSQH5654KMWHJ5 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-KJQQYC6E4EGY4UJE
-A KUBE-SVC-EFPSQH5654KMWHJ5 -j KUBE-SEP-4DJFF4PKJG2GTZWW
由此完成了流量转发。
2.3 iptables转发链路总结
- 可以发现当流量在本机节点/pod进出时,需要进行流量的过滤和通过KUBE-MARK-MASQ进行流量打标,从而进行NAT转换。
- 通过KUBE-SVC-EFPSQH5654KMWHJ5和KUBE-SEP-LCXGRT47CYQENZGP进行流量的负载均衡和转发,当svc和pod很多时,iptables相关的转发规则会很多
单个节点的 i p t a b l e s 规则大体上可以 = s v c 数量 ∗ e n d p o i n t 数量 单个节点的iptables规则大体上可以=svc数量*endpoint数量 单个节点的iptables规则大体上可以=svc数量∗endpoint数量
单个 k 8 s 集群的 i p t a b l e s 规则数量 = 单节点的 i p t a b l e s 规则数量 ∗ 节点数量 单个k8s集群的iptables规则数量=单节点的iptables规则数量*节点数量 单个k8s集群的iptables规则数量=单节点的iptables规则数量∗节点数量
- 由于iptables规则通过list类型数据结构进行管理,执行时间O(n),当svc和node节点数量很多时,iptables规则过多时,新规则的查询和创建会越来越慢
3. ipvs规则解析
在 IPVS 模式下,kube-proxy监视Kubernetes服务和端点,调用 netlink 接口创建 IPVS 规则, 并定期将 IPVS 规则与 Kubernetes 服务和端点同步。访问服务时,IPVS 将流量定向到后端Pod之一。IPVS代理模式基于类似于 iptables 模式的 netfilter 挂钩函数, 但是使用哈希表作为基础数据结构,执行时间O(1),并且在内核空间中工作。这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。与其他代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。
3.1 ipvs工作原理
IPVS 模式的工作原理,其实跟 iptables 模式类似。当我们创建了前面的 Service 之后,kube-proxy 首先会在宿主机上创建一个虚拟网卡(叫作:kube-ipvs0),并为它分配 Service VIP 作为 IP 地址。接下来,kube-proxy 就会通过 Linux 的 IPVS 模块,为这个 IP 地址设置三个 IPVS 虚拟主机,并设置这三个虚拟主机之间使用轮询模式 (rr) 来作为负载均衡策略。拓扑图如下所示拓扑图:
查看绑定的虚拟网卡
# ip addr...73:kube-ipvs0:<BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 1000link/ether 1a:ce:f5:5f:c1:4d brd ff:ff:ff:ff:ff:ffinet 10.0.1.175/32 scope global kube-ipvs0valid_lft forever preferred_lft forever
查看内部的转发规则
# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.102.128.4:80 rr-> 10.244.3.6:9376 Masq 1 0 0 -> 10.244.1.7:9376 Masq 1 0 0-> 10.244.2.3:9376 Masq 1 0 0
3.2 ipvs支持的负载均衡算法
- rr:轮询调度
- lc:最小连接数
- dh:目标地址散列
- sh:源地址散列
- sed:最短期望延迟
- nq:最少队列
3.3 svc涉及的ipvs链流程说明
- 使用ipvs进行负载均衡和流量转发时,相对于iptables来说,svc的流量转发流程整体上跟使用iptables是一致的。
- 差别是ipvs代替了iptables的KUBE-SVC-EFPSQH5654KMWHJ5和KUBE-SEP-LCXGRT47CYQENZGP进行流量的负载均衡和转发
- 针对流量过滤和NAT,还是基于iptables实现,但是这样的辅助性的规则数量有限,不会造成性能瓶颈
因此ipvs模式下,实际上是 ipvs负载均衡 + iptables过滤和NAT,实现svc的流量转发整体流程
4. 疑问和思考
4.1 KUBE-MARK-MASQ规则说明
KUBE-MARK-MASQ的作用是确保Kubernetes集群中的流量在转发到外部网络时可以正确地进行NAT处理,并提供网络隔离、安全性、负载均衡和故障转移等功能。
- 首先 KUBE-MARK-MASQ 的作用是把报文打上 0x4000/0x4000 的标记,在 KUBE-POSTROUTING 时,如果报文中包含这个标记,会执行 -j MASQUERADE 操作,而这个操作的作用就是做源地址转换(SNAT)。
- Kubernetes集群中的每个节点上都有一个名为KUBE-MARK-MASQ的iptables规则。当流量进入节点时,该规则将被应用于这些流量,将源IP地址和源端口替换为节点的IP地址和随机端口。这样可以确保流量在从集群中的任何节点转发到外部网络时,都具有相同的源IP地址和端口。
4.2 KUBE-MARK-DROP规则说明
KUBE-MARK-DROP设置标记的报文则会在KUBE_FIREWALL中全部丢弃
4.3 使用iptables规则有什么问题?
iptables规则通过list类型数据结构进行管理,执行时间O(n),当svc和node节点数量很多时,iptables规则过多时,新规则的查询和创建会越来越慢,并引发性能问题
- 规则顺序匹配延迟大
- 访问 service 时需要遍历每条链知道匹配,时间复杂度 O(N),当规则数增加时,匹配时间也增加。
- 规则更新延迟大
- iptables 规则更新不是增量式的,每更新一条规则,都会把全部规则加载刷新一遍。
- 规则数大时,会出现 kernel lock
- svc 数增加到 5000 时,会频繁出现 Another app is currently holding the xtables lock. Stopped waiting after 5s, 导致规则更新延迟变大,kube-proxy 定期同步时也会因为 超时导致 CrashLoopBackOff。
4.4 iptables和ipvs两者的优劣势如何?
- iptables和ipvs均是基于内核的netfilter进行流量转发,虽然实现方式上又差异,ipvs将相关操作转移到内核台进行,在性能上优于iptables,但是差别并不大,因此整体上认为性能上是相近的
- 在集群中不超过1000个服务的时候,iptables 和 ipvs 并无太大的差异。而且由于iptables 与网络策略实现的良好兼容性,iptables 是个非常好的选择
- 如果svc和节点数量持续增加,svc数量超过5000后,ipvs和iptables的性能差异开始显现出来,并且随着svc增加iptables的性能越来越差,而ipvs并不会随着svc增加出现性能上的差异
出现这样的差异,最主要的原因是
- iptables使用list类型作为基础数据结构,执行时间O(n)
- ipvs使用哈希表作为基础数据结构,执行时间O(1)
两者的性能压测情况,可以参考 对比 iptables 和 ipvs 的性能差异
5. 参考文档
- 分析k8s service生成的iptables规则数量
- 理解kubernetes的service流量转发链路
- 对比 iptables 和 ipvs 的性能差异
相关文章:
k8s的svc流量通过iptables和ipvs转发到pod的流程解析
文章目录 1. k8s的svc流量转发1.1 service 说明1.2 endpoints说明1.3 pod 说明1.4 svc流量转发的主要工作 2. iptables规则解析2.1 svc涉及的iptables链流程说明2.2 svc涉及的iptables规则实例2.2.1 KUBE-SERVICES规则链2.2.2 KUBE-SVC-EFPSQH5654KMWHJ5规则链2.2.3 KUBE-SEP-L…...
【踩坑】修复报错 you should not try to import numpy from its source directory
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 报错如下: 修复方法一: pip install pyinstaller5.9 修复方法二: pip install numpy1.24.1...
预测脱碳企业的信用评级-论文代码复现
文献来源 【Forecasting credit ratings of decarbonized firms: Comparative assessmentof machine learning models】 文章有代码复现有两个基本工作,1.是提取每个算法的重要性;2.计算每个算法的评价指标 算法有 CRT 分类决策树 ANN 人工神经网络 R…...
目标检测——KITTI目标跟踪数据集
KITTI目标跟踪数据集是由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创建的一个大规模自动驾驶场景下的计算机视觉算法评测数据集。这个数据集主要用于评估立体图像、光流、视觉测距、3D物体检测和3D跟踪等计算机视觉技术在车载环境下的性能这个数据集包含了在市区、乡村和…...
25-k8s集群中-RBAC用户角色资源权限
一、RBAC概述 1,k8s集群的交互逻辑(简单了解) 我们通过k8s各组件架构,知道各个组件之间是使用https进行数据加密及交互的,那么同理,我们作为“使用”k8s的各种资源的使用者,也是通过https进行数…...
Android 面试问题 2024 版(其二)
Android 面试问题 2024 版(其二) 六、多线程和并发七、性能优化八、测试九、安全十、Material设计和 **UX/UI** 六、多线程和并发 Android 中的进程和线程有什么区别? 答:进程是在自己的内存空间中运行的应用程序的单独实例&…...
SpringMVC的异常处理
异常分类 : 预期异常(检查型异常)和运行时异常 1、使用@ExceptionHandle注解处理异常 @ExceptionHandle(value={***.class} 异常类型) public modelandview handelException(){} 仅限当前类使用 2、全局处理方式 @ControllerAdvice + @ExceptionHandle 新建类 @Cont…...
【计算机网络】1 因特网概述
一.网络、互联网和因特网 1.网络(network),由若干结点(node)和连接这些结点的链路(link)组成。 2.多个网络还可以通过路由器互联起来,这样就构成了一个覆盖范围更大的网络…...
【Ubuntu】Anaconda的安装和使用
目录 1 安装 2 使用 1 安装 (1)下载安装包 官网地址:Unleash AI Innovation and Value | Anaconda 点击Free Download 按键。 然后 点击下图中的Download开始下载安装包。 (2)安装 在安装包路径下打开终端&#…...
OpenAI推出首个AI视频模型Sora:重塑视频创作与体验
链接:华为OD机考原题附代码 Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展,AI视频模型已成为科技领域的新热点。而在这个浪潮中,OpenAI推出的首个AI视频模型Sora,以其卓越的性能和前瞻性的技术,引领着…...
mybatis总结传参三
十、(不推荐)多个参数-按位置传参 参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是 #{arg0}, 第二个是 #{arg1} 注意: mybatis-3.3 版本和之前的版本使用 #{0},#{1} 方式, 从 myba…...
JSONVUE
1.JSON学习 1.概念: JSON是把JS对象变成字符串. 2.作用: 多用于网络中数据传输. JavaScript对象 let person{name:"张三",age:18}//将JS对象转换为 JSON数据let person2JSON{"name":"张三","age":18}; 3.JS对象与JSON字符串转换…...
OSCP靶机--Medjed
OSCP靶机–Medjed 考点:(1.ftp文件上传 2.sql注入写shell 3.第三软件提权) 1.nmap ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.200.127 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-25 19:42 EST Nmap scan repo…...
【Unity】Unity与安卓交互
问题描述 Unity和安卓手机进行交互,是我们开发游戏中最常见的场景。本教程将从一个简单的例子来演示一下。 本教程需要用到Android Studio2021.1.1 1.Android Studio新建一个工程 2.选择Empty Activity 然后点击Next 3.点击Finish完成创建 4.选择File-New-New Mo…...
QYFB-02 无线风力报警仪 风速风向超限声光报警
产品概述 无线风力报警仪是由测控报警仪、无线风速风向传感器和太阳能供电盒组成,可观测大气中的瞬时风速,具有风速报警设定和报警输出控制功能;风力报警仪采用无线信号传输、显示屏输出,风速显示采用高亮LED数码管显示ÿ…...
css知识:盒模型盒子塌陷BFC
1. css盒模型 标准盒子模型,content-box 设置宽度即content的宽度 width content 总宽度content(width设定值) padding border IE/怪异盒子模型,border-box width content border padding 总宽度 width设定值 2. 如何…...
Nginx的反向代理:实现灵活的请求转发和内容缓存
一、引言:代理服务器的简介 本节介绍代理服务器的基本配置。学习如何通过不同协议将 NGINX 请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。 代理通常用于在多个服务器之间分配负载&…...
免费享受企业级安全:雷池社区版WAF,高效专业的Web安全的方案
网站安全成为了每个企业及个人不可忽视的重要议题。 随着网络攻击手段日益狡猾和复杂,选择一个强大的安全防护平台变得尤为关键。 推荐的雷池社区版——一个为网站提供全面安全防护解决方案的平台,它不仅具备高效的安全防护能力,还让网站安…...
基于SpringBoot的航班进出港管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…...
Odoo系统安装部署并结合内网穿透实现固定域名访问本地ERP系统
文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…...
幻兽帕鲁(Palworld 1.4.1)私有服务器搭建(docker版)
文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 说明 服务器硬件要求:Linux系统/Window系统(x86架构,armbian架构…...
好书推荐丨细说Python编程:从入门到科学计算
文章目录 写在前面Python简介推荐图书内容简介编辑推荐作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本Python基础入门的全新正版书籍,对Python、机器学习、人工智能感兴趣的小伙伴们快来看看吧~ Python简介 Python 是一种广泛使用的高级、解…...
智慧城市与数字孪生:共创未来城市新篇章
一、引言 随着科技的飞速发展,智慧城市与数字孪生已成为现代城市建设的核心议题。智慧城市注重利用先进的信息通信技术,提升城市治理水平,改善市民生活品质。而数字孪生则通过建立物理城市与数字模型之间的连接,为城市管理、规划…...
Java数据结构---初识集合框架
目录 一、什么是集合框架 二、集合框架的重要性 三、背后涉及的数据结构及算法 1.什么是数据结构 2.容器背后对应的数据结构 3.相关的Java知识 4.什么是算法 一、什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 container ࿰…...
Spring Cloud学习
1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…...
【计算机网络】1.4 接入网和物理媒体
1.4 接入网和物理媒体 问题:怎样将端系统和边缘路由器连接? 答:有线方式(住宅接入网络、单位接入网络等)或无线方式(无线接入网络)。 有线接入方式 光纤同轴混合网是基于已有的有线电视网开发的…...
关于螺栓的基本拧紧技术了解多少——SunTorque智能扭矩系统
螺栓是机械中常见的紧固件之一,用于将两个或多个部件连接在一起,并保持它们之间的紧密配合。拧紧螺栓是一项基本的技术,但在实际操作中,许多工人并不了解正确的拧紧方法,从而导致螺栓松动、连接失效等问题的出现。因此…...
C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁
PublishFolderCleaner – Github 测试环境: .Net 8 Program.cs 代码 // https://github.com/dotnet-campus/dotnetcampus.DotNETBuildSDK/tree/master/PublishFolderCleanerusing System.Diagnostics; using System.Text;// 名称, 不用写 .exe var exeName "AbpDemo&…...
[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)
序言 之前开发的耕地占补平衡报备格式,现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见:软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具(插件),需要授权后才能使用; 本软件…...
todolist
一开始想自己写个todolist的网页,一直没时间,直接拿这个博客记录了,因为仅我可见比较麻烦,就放在全部可见记录了 目录 2024年3月todoes了解一下深入学习k8s,比如pod运行多个容器 ,编写自己的镜像 2024年2月…...
做外国美食的视频网站/做任务赚佣金的平台
恢复步骤: 1、在 非删除文件盘 安装 DiskGenius 数据恢复工具 https://pan.baidu.com/s/1kkj0YBaDxl1sE3PBAuPfxQ 提取码 ryl0 2、打开 恢复工具 3、先选择恢复文件按钮,再选择要恢复的盘区 4、-->选择 仅恢复误删除文件,-->取消 额外…...
品牌开发者应掌握的技能/荥阳seo推广
20175208 实验一 Java开发环境的熟悉 一、实验报告封面 课程:Java程序设计 班级:1752班 姓名:张家华 学号:20175208 指导教师:娄嘉鹏 实验日期:2019年4月2日 实验时间:13:45 - 15:25 实验序号…...
网站推广合作/广州网络科技有限公司
最近用虚拟机安装了centos7,但发现用yum install nginx 命令来安装nginx提示找不到相关的包,最后到nginx官网上找到了解决办法 步骤: cd /etc/yum.repos.d/然后建立 nginx.repo 文件 vi nginx.repo输入以下内容: [nginx] nameng…...
商业网站推广/国家认可的教育培训机构
首先要配置我们的spring.xml xmlns 多加下面的内容、 [html] view plaincopy xmlns:task"http://www.springframework.org/schema/task" 然后xsi:schemaLocation多加下面的内容、 [html] view plaincopy http://www.springframework.org/schema/task http://www.s…...
python 安装wordpress/武汉百度网站优化公司
促进成交的第一步,就是做好成功的铺垫,确保已经到了成交的阶段。假设我们已经罗列出自己的王牌清单,下面就该有所行动了,为我们的关系开启一个全新的篇章。 一、 推荐,不要仅限于展示。 任何情况,挑战也好…...
外贸网站建设熊掌号/外贸推广是做什么的
ViewPager指针项目,在使用ViewPager的时候能够指示ViewPager所在的位置,就像Google Play中切换的效果一样,还能使用在应用初始化的介绍页面1. 引入ViewPagerIndicator库2. 编写布局文件<com.viewpagerindicator.TabPageIndicatorandroid:i…...