【k8s】8、service详解

news2025/1/9 1:36:35

文章目录

  • 一、Service详解
    • 1、Service介绍
      • 1.1 userspace模式
      • 1.2 iptables 模式
      • 1.3 ipvs模式
    • 2、Service类型
    • 3、Service使用
      • 3.1 实现环境准备
      • 3.2 Cluster类型的Service
        • 3.2.1 cluster类型的生成ip
        • 3.2.2 cluster类型不生成ip
      • 3.3 NodePort类型的service
      • 3.4 LoadBalancer类型的Service
      • 3.5 ExternelName类型的Service
    • 4、Ingress详解
      • 4.1 Ingress介绍
      • 4.2 Ingress使用
        • 4.2.1 环境准备,搭建ingress环境
        • 4.2.2 准备service和pod
        • 4.2.3 配置 http代理
        • 4.2.4 配置https代理
      • 4.3 ingress总结

一、Service详解

1、Service介绍

在k8s中,pod是应用程序的载体,我们可以通过Pod的ip来访问应用程序,但是Pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。

为解决这个问题,k8s提供了service资源,service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址,通过访问service的入口地址就能访问到后面的pod服务。

image-20221010222443737

service在很多情况下只是一个概念,真正起作用的是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程, 当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种service的变动,然后它会将最新的service信息转换成对应的访问规则。

image-20221010223000591

安装service的ipvs内核模块后,需要开启ipvs

kubectl edit cm kube-proxy -n kube-system
#在线编辑,开启ipvs(cm为配置资源的configmaps的缩写)

kubectl delete pod -l k8s-app-kube-proxy -n kube-system
#删除以前的pod,因为它是控制器创建的坡度,它会根据yum文件重建

ipvsadm -Ln
#查看各项规则

image-20221010223734790

image-20221010223725940

image-20221010223824428

1.1 userspace模式

userspace 模式下,kube-proxy会为每一个Service创建一个监听端口,发向Cluster IP 的请求被iptables 规则重定向kube-proxy 监听的端口上,kube-proxy 根据LB 算法选择一个提供服务的Pod并和其建立连接,以将请求转发到Pod上。

该模式下,kube-proxy充当了一个四层负载均衡器的角色,由于kube-proxy 运行在userspace 中,在进行转发处理时会增加内核和用户空间之间的数据拷贝。虽然比较稳定,但是效率比较低。

image-20221010224514185

1.2 iptables 模式

iptables模式下,kube-proxy 为service 后端的每个pod 创建对应的iptables规则,直接将发向 Cluster IP 的请求重定向到一个Pod IP,该模式下 kube-proxy 不承担四层负载均衡器的角色,只负责创建iptables 规则。

该模式的优点是比userspace模式效率更高,但不能提供灵活的LB策略,当后端Pod不可用时也无法进行重试。

image-20221010225037242

1.3 ipvs模式

ipvs模式和iptables类似,kube-proxy监控Pod的变化并创建相应的ipvs规则,ipvs相对iptables转发效率更高,除此以外,ipvs支持更多的LB算法。

image-20221010225241725

2、Service类型

service的资源清单文件:

apiVersion: v1       #资源版本
kind: Service        #资源类型
metadata:            #元数据
  name: service      #资源名称
  namespace: dev     #命名空间
spec:                #描述
  selector:          #标签选择器,用于确定当前service代理哪些Pod
    app: nginx       
  type:               #service类型,指定service的访问方式
  clusterIP:          #虚拟服务的ip地址
  sessionAffinity:    #session亲和性,支持clientIP、None两个选项
  ports:                 #端口信息
    - protocol: TCP      
      port: 3017         #service端口
      targetPort: 5003   #pod端口
      nodePort: 31122    #主机端口

service的四种类型

  • ClusterIP : 默认值,同时kubernetes系统自动分配的虚拟IP,只能在集群内部访问
  • NodePort: 将Service通过指定的Node上的端口暴露给外部,通过此方法,就可以在集群外部访问服务
  • LoadBalancer: 使用外界负载均衡器完成到服务的负载分发,注意此模式需要外部云环境支持。
  • EXternalName: 把集群外部的服务映入集群内部,直接使用

3、Service使用

3.1 实现环境准备

在使用service之前,首先要利用Deployment创建出3个Pod,注意要为Pod设置app=nginx-pod的标签

创建deployment.yaml文件

apiVersion: apps/v1
kind: Deployment      
metadata:
  name: pc-deployment
  namespace: dev
spec: 
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

image-20221011000351812

下面开始创建pod

kubectl create -f deployment.yaml
#创建pod

kubectl get pods -n dev -o wide --show-labels
#查看pod详情

image-20221011000257740

###为了方便后面测试,修改三台nginx的index.html的页面

kubectl exec -it 【pod名称】 -n dev /bin/sh
#进入pod中更多容器

echo "10.244.2.240" >> /usr/share/nginx/html/index.html
#修改页面标签

curl 10.244.2.240

image-20221011001117826

3.2 Cluster类型的Service

3.2.1 cluster类型的生成ip

创建service-clusterip.yaml

apiVersion: v1
kind: Service
metadata:
  name: service-clusterip
  namespace: dev
spec:
  selector:
    app: nginx-pod
 # clusterIP: 10.97.97.97    # service的ip地址,如果不写,默认会生成一个
 # type: ClusterIP           #service类型,不写,默认clusterIP
  ports:
  - port: 80       # Service端口       
    targetPort: 80 # pod端口

image-20221011002335299

下面开始创建service

kubectl create -f service-clusterip.yaml
#创建service

kubectl get svc -n dev -o wide
#查看service

kubectl describe svc service-clusterip -n dev
#查看service的详细信息
//这里面有一个Endpoints列表,里面就是当前service可以负载到的服务入口

ipvsadm -Ln
#查看ipvs的映射
image-20221011002142001 image-20221011002224117

Endpoints讲解

  • Endpoint是kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有的pod的访问记录,它是根据service配置文件中的selector描述产生的。
  • 一个service由一组Pod组成,这些Pod通过Endpoints暴露出来, Endpoints 是实现实际服务的端口集合。简单来说,service和pod自检的联系是通过Endpoints实现的。

image-20221011002756059

image-20221011003038080

负载分发策略讲解

对service的访问被分发到了后端的Pod上去,目前kubernetes提供了两种负载分发策略

  • 如果不定义,默认使用lube-proxy的策略,比如随机、轮询
  • 基于了护短地址的会话保持模式,即来自同一个客户端发起的所有请求都会被转发到固定的一个pod上。 这个需要在spec属性中设置sessionAffinity:ClientIP 选项,添加亲和性
while true ;do curl 10.105.129.66:80;sleep 2;done
#循环访问service查看页面返回的效果

image-20221011003646531

此时,修改spec的分发策略

kubectl delete -f service-clisterip.yaml
#删除svc

vim service-clusterip.yaml
#在spec下面添加 sessionAffinity: ClientIP(表示会话保持模式)

ipvsadm -Ln
#查看转发策略

while true; curl 10.100.1.174:80;sleep 2; done;
image-20221011004120363

image-20221011004521748

3.2.2 cluster类型不生成ip

在某些场景中,开发人员可能不想使用Serbice提供的负载均衡功能,而希望自己来控制负载均衡策略。

针对这种情况,kubernetes 提供了 HeadLiness Service , 这类Service 不会分配 Cluster IP,如果想要访问service,只能通过service的域名进行查询。

创建service-headliness.yaml

apiVersion: v1
kind: Service
metadata:
  name: service-headliness
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: None    # 将clusterIP设置为None,即可创建headliness Service
  type: ClusterIP
  ports:
  - port: 80    
    targetPort: 80
image-20221011173020495

下面创建service,进行验证

kubectl create -f service-headliness.yaml
#创建service

kubectl get svc service-headliness -n dev -o wide
#获取service,发现Cluster-ip 未分配

kubectl describe svc service-headliness -n dev
#查看service详情

kubectl exec -it 【pod名称】 -n dev /bin/sh
#进入pod中的容器
cat /etc/resolv.conf
#查看域名解析

dig @10.96.0.10 service-headliness.dev.svc.cluster.local
#使用dig访问一下域名服务
image-20221011172614364 image-20221011172901230

3.3 NodePort类型的service

在之前的样例中,创建的Service的匹配地址只有集群内部才可以访问,如果希望将Service暴露给集群外部使用,那么就要使用到另一种类型的Service,称为NodePort类型。

NodePort的工作原理其实就是将Service的断就映射到Node的一个端口上,然后就可以通过NodeIP:NodePort 来访问service了。

image-20221011173928185

创建service-nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: service-nodeport
  namespace: dev
spec:
  selector:
    app: nginx-pod
  type: NodePort   # service类型
  ports:
  - port: 80
    nodePort: 30002    # 指定绑定的node的端口(默认的取值范围是:30000-32767), 如果不指定,会默认分配
    targetPort: 80

image-20221011174616558

下面创建service,然后进行访问

kubectl get svc service-nodeport -n dev
#查看service的信息

image-20221011174357264

image-20221011174701957

3.4 LoadBalancer类型的Service

LoadBalancer和NodePort很相似,目的都是向外暴露一个端口,区别在于LoadBalancer会在集群外部再来做个负载均衡设备。

而这个设备需要外部环境支持的,外部服务发送到这个设备上的请求,会被设备负载之后转发到集群中。

image-20221011175122535

3.5 ExternelName类型的Service

ExternelName类型的Service用于引入集群外部的服务,它通过externelname属性指定外部一个服务的地址,然后在集群内部访问此service就可以访问到外部服务了。

image-20221011183459534

创建 service-externalname.yaml

apiVersion: v1
kind: Service
metadata:
  name: service-externalname
  namespace: dev
spec:
  type: ExternalName     # service类型
  externalName: www.baidu.com  #改成ip地址也可以

image-20221011184113460

下面创建service进行访问一下

dig @10.96.0.10 service-externalname.dev.svc.cluster.local
#域名解析

image-20221011184007113

4、Ingress详解

image-20221017110313828

image-20221017115445848

4.1 Ingress介绍

早前面介绍到。service对集群之外暴露服务的主要方式有两种:NotPort 和LoadBalancer,但是这两种方式都有一定的缺点。

  • NodePort: 会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就会越发明显。
  • LoadBalancer: 每个serice需要一个LB设备。浪费、麻烦、并且需要k8s之外的设备支持。

基于这种现状,kubernetes 提供了Ingress资源对象。Ingress只需要一个NodePort 或者一个LB就可满足暴露多个service的需求。

image-20221011185935135

实际上,Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类似于nginx, 可以理解成在Ingress里建立诸多映射规则,Ingress Controller 通过监听这些配置规则并转化成Nginx的反向代理配置,然后对外部提供服务。

  • Ingress: kubernetes中的一个对象,作用是定义请求如何转发到service的规则
  • Ingress controller : 具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有多种,比如nginx、contour、haproxy等。

Ingress(以nginx为例)的工作原理如下:

  • 用户编写Ingress规则,说明哪个域名对应k8s集群中的哪个service
  • Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的nginx反向代理配置。
  • Ingress控制器会将生成的nginx配置写入到一个运行着的nginx服务中,并动态更新。
  • 到此为止,其实真正工作的就是一个nginx了,内部配置了用户定义的请求转发规则。
image-20221011190605483

4.2 Ingress使用

4.2.1 环境准备,搭建ingress环境

# 创建文件夹
mkdir ingress-controller
cd ingress-controller/

# 获取ingress-nginx,本次案例使用的是0.30版本
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

kubectl apply -f ./
#执行所有yaml文件

# 查看ingress-nginx
kubectl get pod -n ingress-nginx

# 查看service
kubectl get svc -n ingress-nginx

image-20221011193330476

image-20221011195321327

4.2.2 准备service和pod

为了后续实现,创建两组service,一组nginx的pod,一组tomcat的pod,分别通过两个service出来

image-20221011195420367

创建tomcat-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-deployment
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tomcat-pod
  template:
    metadata:
      labels:
        app: tomcat-pod
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5-jre10-slim
        ports:
        - containerPort: 8080

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: None
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: tomcat-service
  namespace: dev
spec:
  selector:
    app: tomcat-pod
  clusterIP: None
  type: ClusterIP
  ports:
  - port: 8080
    targetPort: 8080
kubectl create -f tomcat-nginx.yaml

kubectl get svc -n dev

kubectl get pods -n dev

image-20221011201154878

4.2.3 配置 http代理

配置好ingress资源后,这些信息会被apiserver存储到etcd中。ingress-controller会一直监听etcd中的ingress的变化,感知变化后,它知道当有请求访问时,它就知道往哪个service中转发了。

image-20221017101515176

创建ingress-http.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-http
  namespace: dev
spec:  
  rules:                    #配置ingress规则
  - host: nginx.ydq.com     #访问的域名
    http:                       #设置连接协议
      paths:                    #设置路径和访问的service
      - path: /                 #设置路径
        backend:                #设置后端的service
          serviceName: nginx-service     #设置要访问的service名称
          servicePort: 80                #设置访问的service端口
  - host: tomcat.ydq.com
    http:
      paths:
      - path: /
        backend:
          serviceName: tomcat-service
          servicePort: 8080

image-20221011202549856

kubectl get create -f ingress-http.yaml
#创建ingress

kubectl get ing ingress-http -n dev
#查看ingerss信息

kubectl describe ing ingress-http -n dev
#查看详细信息

#### 接下来,在本地电脑上配置host文件,解析上面的两个域名到20.0.0.55(master)

image-20221011202445061

配置好host解析文件,就能进行访问了。通过域名加ingress暴露在外面的端口即可完成访问。

kubectl get svc -n ingress-ngin
#可查看到ingress的保留端口

http://nginx.ydq.com:32762

http://tomcat.ydq.com:32762
#宿主机访问

image-20221011203551546

4.2.4 配置https代理

创建证书

# 生成证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=BJ/L=BJ/O=nginx/CN=itheima.com"

# 创建密钥
kubectl create secret tls tls-secret --key tls.key --cert tls.crt

image-20221011205129260

创建ingress-https.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-https
  namespace: dev
spec:
  tls:
    - hosts:
      - nginx.ydq.com
      - tomcat.ydq.com
      secretName: tls-secret   # 指定秘钥
  rules:
  - host: nginx.itheima.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80
  - host: tomcat.itheima.com
    http:
      paths:
      - path: /
        backend:
          serviceName: tomcat-service
          servicePort: 8080

image-20221011205734239

kubectl create -f ingress-https.yaml
#创建https的ingress

kubectl get ing ingress-https -n dev
#查看ingress的信息

kubectl describe ing ingress-https -n dev
#查看详细信息

image-20221011205657861

最后,也是通过宿主机访问域名,然后再访问ingress暴露的https的端口,进行查看

kubectl get svc -n ingress-nginx
#查看ingress暴露的端口

https://nginx.ydq.com:30765

https://tomcat.ydq.com:30765
#宿主机访问

image-20221011210030033

4.3 ingress总结

ingress主要就是先创建ingress环境,ingress环境就是需要生成含有ingress的pod,以及ingress暴露的端口。最后通过配置ingress类型的service中配置一些ingress的转发规则,将请求转发到指定的service上面,然后用户通过访问ingress的上面定义的域名以及ingress上面暴露的端口进行访问指定service,可以配置http或https进行相应的访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】MySQL体系结构与内部组件工作原理解析(原理篇)(MySQL专栏启动)

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

GEE两行代码下载任意范围影像python API

GEE三行代码下载任意范围影像 前不久,吴秋生博士更新了geemap,现在能更方便地下载影像了最新的下载再也不受有限的Google Drive、图像过大会自动分割、缓慢的下载速度影响了。 有兴趣的同学可以see this: https://geemap.org/notebooks/118_download_i…

蓝牙传输 LE Audio技术

蓝牙 蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,利用"蓝牙"技术,能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信,也能够成功地简化以上这些设备与因特网Internet之间的通信&…

react(受控组件、生命周期、使用脚手架)

目录 使用脚手架 其他: 学习js: mdn 文档 MDN Web Docs 在react官方文档的 CDN 链接里下载最新的react版本react官网:React 官方中文文档 – 用于构建用户界面的 JavaScript 库 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1. 受控组件…

ES6 入门教程 15 Proxy 15.3 Proxy.revocable() 15.4 this 问题 15.5 实例:Web 服务的客户端

ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录ES6 入门教程15 Proxy15.3 Proxy.revocable()15.4 this 问题15.5 实例:Web 服务的客户端15 Proxy 15.3 Proxy.revocable() …

BLDC的列子2

1.三相采样电流的采集以u相为举例。 采集下桥臂I-V的电压。在除以采样电阻。就可以得到采样电流。但由于I-V的电压比较小。 需要一个放大电路把电压放大ADC才采集的到。 放大后的电压是AMP_IU.用ADC去采集这个电压。从而算出I_V的电压。 在电机停止的时候也会有微小的电压。…

Azure 深入浅出[2] --- App Service的部署并查看应用Log

假设读者已经申请了Azure的免费订阅的账户。如果想部署一个前端NodeJS的服务到Azure的App Service应该如何部署并查看应用程序本身的日志呢?笔者在这边文章就带大家快速看一下。 1.环境准备 安装Visual Studio Code以及在Visual Studio Code里面安装Azure App Ser…

文件上传漏洞 | iwebsec

文章目录靶场搭建文件上传漏洞前端JS过滤绕过文件名过滤绕过Content-Type过滤绕过文件头过滤绕过.htaccess文件上传文件截断上传条件竞争文件上传靶场搭建 参考文章https://juejin.cn/post/7068931744547733517出现个小问题,我的端口冲突了,所以换了一个…

Linux-unbuntu修改apt源

本文介绍如何将ubuntu的apt源修改为清华大学的镜像源 主要是修改/etc/apt/source.list的文件,并且使用sudo apt-get update来刷新源 修改apt源 unbuntu安装好之后,apt的源是us的,这样下载速度比较慢 apt源的地址放在/etc/apt/source.list中…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.14 ES 索引操作

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.14 ES 索引操作4.14.1 索引操作4.14.2 小结4 数据…

m基于OFDM数字电视地面广播系统中频域同步技术研究

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 OFDM技术的基本构架如下所示: 注意系统中的虚线部分就是你要做的OFDM的频域同步模块。我们的MATLAB代码就是参考这个系统结构进行设计的。其中虚线就是本课题要做的代码部分…

[附源码]java毕业设计停车场管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

day04 spring 声明式事务

day04 spring 声明式事务 1.JDBCTemplate 1.1 简介 为了在特定领域帮助我们简化代码,Spring 封装了很多 『Template』形式的模板类。例如:RedisTemplate、RestTemplate 等等,包括我们今天要学习的 JDBCTemplate。 1.2 准备工作 1.2.1 加…

Python之TCP网络编程

目录 1. python3编码转换 2. TCP网络应用程序开发 2.1 概述 2.2 开发流程 2.3 TCP客户端程序开发 2.4 TCP服务端程序开发 2.5 注意点 3. socket之send和recv原理 4. 案例 1. python3编码转换 1.网络传输是以二进制数据进行传输的。 2.数据转化用到了encode和decode函数…

ES6 入门教程 15 Proxy 15.2 Proxy 实例的方法 15.2.1 get()

ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录ES6 入门教程15 Proxy15.2 Proxy 实例的方法15.2.1 get()15 Proxy 15.2 Proxy 实例的方法 拦截方法的详细介绍。 15.2.1 get() get方…

应急响应-进程排查

进程排查 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。无论在Windows还是Linux中,主机在感染恶意程序后,恶意程序都会启动相应进程来完成恶意操作。 Window…

Android 深入理解View.post() 、Window加载View原理

文章目录背景:如何在onCreate()中获取View的宽高?View.post()原理Window加载View流程setContentView()ActivityThread#handleResumeActivity()总结扩展Window、Activity及View三者之间的关系是否可以在子线程中更新UI资料背景:如何在onCreate…

m认知无线电信号检测算法matlab仿真,能量检测,循环平稳检测以及自相关检测

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 频谱感测是认知无线电的一项关键技术。我们将频谱感知作为一个分类问题,提出一种基于深度学习分类的感知方法。我们归一化接收信号功率以克服噪声功率不确定性的影响。我们使…

postgresql源码学习(49)—— MVCC⑤-cmin与cmax 同事务内的可见性判断

一、 难以理解的场景 postgresql源码学习(十九)—— MVCC④-可见性判断 HeapTupleSatisfiesMVCC函数_Hehuyi_In的博客-CSDN博客 在前篇的可见性判断中有个一直没想明白的问题 —— 本事务插入的数据,什么场景可能会出现去查询获取快照后插入…

路面坑洼检测中的视觉算法

3D道路成像和路面坑洼检测的经典工作综述。论文链接:https://arxiv.org/pdf/2204.13590.pdf 计算机视觉算法在3D道路成像和路面坑洼检测中的应用已有二十多年的历史。这里先介绍了用于2D和3D道路数据采集的传感系统,包括摄像机、激光扫描仪和微软Kinect…