16.ingress

news2024/11/26 11:43:49

文章目录

  • ingress
    • 外部访问
    • externalIP
    • 组成
    • Ingress-Nginx
    • 部署 nginx-ingress-controller
    • DaemonSet+HostNetwork
      • 创建 ingress控制器
      • 创建ingress资源
    • Deployment+NodePort模式
    • Ingress HTTPS 代理访问
      • 生成证书和私钥
      • 创建secret资源
      • 创建Ingress资源
    • Nginx 进行 BasicAuth
    • nginx进行重写
    • 总结

ingress

外部访问

在Kubernetes中,Pod的IP地址和service的ClusterIP仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,Kubernetes目前提供了以下几种方案:

  • NodePort:将service暴露在节点网络上,NodePort背后就是Kube-Proxy,Kube-Proxy是沟通service网络、Pod网络和节点网络的桥梁。
    • 测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理就是个灾难。因为每个端口只能是一种服务,默认端口范围只能是 30000-32767。
  • LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置 Service 的场景。
    • 受限于云平台,且通常在云平台部署LoadBalancer还需要额外的费用。
      在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。
  • externalIPs:service允许为其分配外部IP,如果外部IP路由到集群中一个或多个Node上,Service会被暴露给这些externalIPs。
    • 通过外部IP进入到集群的流量,将会被路由到Service的Endpoint上。
  • Ingress:只需一个或者少量的公网IP和LB,即可同时将多个HTTP服务暴露到外网,七层反向代理。
    • 可以简单理解为service的service,它其实就是一组基于域名和URL路径,把用户的请求转发到一个或多个service的规则

在这里插入图片描述

externalIP

  • 实现外部网络访问node内部
##创建deployment
kubectl create deployment deploy-demo1 --image=nginx:1.14 --port=80 --replicas=3
##创建  service
kubectl expose deployment deploy-demo1 --port=80 --target-port=80

在这里插入图片描述

apiVersion: v1
kind: Service
metadata:
  labels:
    app: deploy-demo1
  name: deploy-demo1
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: deploy-demo1
  externalIPs:                   ##设置  externalIP
  - 192.168.10.22
status:
  loadBalancer: {}

在这里插入图片描述

组成

  • ingress

    • ingress是一个API对象,通过yaml文件来配置,ingress对象的作用是定义请求如何转发到service的规则,可以理解为配置模板。
    • ingress通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于域名的反向代理。ingress要依靠 ingress-controller 来具体实现以上功能。
  • ingress-controller:

    • ingress-controller是具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
    • 一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据 ingress对象生成配置并应用新配置到反向代理,比如ingress-nginx就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置
  • Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx

  • Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/

  • 总结

    • ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controller, 而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名、哪些URL要转发到哪些service等等。

在这里插入图片描述

Ingress-Nginx

  • Ingress-Nginx 工作原理
    1. ingress-controller通过和 kubernetes APIServer 交互,动态的去感知集群中ingress规则变化,
    2. 然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,
    3. 再写到nginx-ingress-controller的pod里,这个ingress-controller的pod里运行着一个Nginx服务,控制器会把生成的 nginx配置写入 /etc/nginx.conf文件中,
    4. 然后reload一下使配置生效。以此达到域名区分配置和动态更新的作用

在这里插入图片描述

部署 nginx-ingress-controller

###在线下载ingress-controller Pod及相关资源
wget https://gitee.com/mirrors/ingress-nginx/raw/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml
##修改镜像地址

修改镜像地址为:
image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5


image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

DaemonSet+HostNetwork

  • 用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。
  • 这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。
  • 比较适合大并发的生产环境使用。

创建 ingress控制器

##修改 Deployment 为 DaemonSet ,指定节点运行,并开启 hostNetwork 网络

vim deploy.yaml
...
apiVersion: apps/v1
# 修改 kind
#kind: Deployment
kind: DaemonSet
......
spec:
  ......
  template:
    ......
    spec:
      # 使用宿主机网络
      hostNetwork: true
      # 修改选择节点选择器
      nodeSelector:
        ingress: "true"
......

在这里插入图片描述

##创建
kubectl apply -f deploy.yaml

在这里插入图片描述

##在随便一个 node节点中查看
netstat -lntp | grep nginx

在这里插入图片描述

由于配置了 hostnetwork,nginx 已经在 node 主机本地监听 80/443/8181 端口。

其中 8181 是 nginx-controller 默认配置的一个 default backend(Ingress 资源没有匹配的 rule 对象时,流量就会被导向这个 default backend)。

这样,只要访问 node 主机有公网 IP,就可以直接映射域名来对外网暴露服务了

创建ingress资源

##创建pod资源
kubectl create deployment deploy-demo1 --image=nginx:1.14 --port=80 --replicas=3
##为pod节点创建service资源
kubectl expose deployment deploy-demo1 --port=8080 --target-port=80

在这里插入图片描述

##创建ingress
kubectl create ingress ingress-demo1 --class=nginx --rule="www.a.com/=deploy-demo1:8080" --dry-run=client -o yaml > ingress-demo1.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-demo1
spec:
  ingressClassName: nginx
  rules:
  - host: www.a.com
    http:
      paths:
      - backend:
          service:
            name: deploy-demo1
            port:
              number: 8080
        path: /
        pathType: Prefix
status:
  loadBalancer: {}
ingressClassName 指定 IngressClass,用来指定选择的 Ingress Controller

host 主机名可以是精确匹配,或者使用通配符来匹配,但通配符仅覆盖一个 DNS 标签(例如 *.foo.com 不匹配 baz.bar.foo.com)。

pathType 支持的路径类型有三种:
Exact:精确匹配 URL 路径,且区分大小写。

Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写。如果路径的最后一个元素是请求路径中最后一个元素的子字符串,则不会匹配 (例如:/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz)。

ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。

具体可详见:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#the-ingress-resource

在这里插入图片描述

在这里插入图片描述

##在另外一台主机上
##修改host
vim /etc/hosts
192.168.10.20 www.a.com

##访问网址查看
curl http://www.a.com

在这里插入图片描述

###在创建一个  deployment和servoce

kubectl create deployment deploy-demo2 --image=nginx:1.15 --port=80 --replicas=3

kubectl expose deployment deploy-demo2 --port=9090 --target-port=80

在这里插入图片描述

##创建ingress

kubectl create ingress ingress-demo1 --class=nginx --rule="www.b.com/=deploy-demo2:9090" --dry-run=client -o yaml > ingress-demo2.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-demo2
spec:
  ingressClassName: nginx
  rules:
  - host: www.b.com
    http:
      paths:
      - backend:
          service:
            name: deploy-demo2
            port:
              number: 9090
        path: /
        pathType: Prefix
status:
  loadBalancer: {}

在这里插入图片描述

在这里插入图片描述

Deployment+NodePort模式

  • 同样用deployment模式部署ingress-controller,并创建对应的service,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。
  • 由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
  • NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响
##修改配置文件
vim deploy.yaml


kind: Deployment

type: NodePort

externalTrafficPolicy: Cluster

在这里插入图片描述

##创建ingress资源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-demo1
spec:
  ingressClassName: nginx
  rules:
  - host: www.a.com
    http:
      paths:
      - backend:
          service:
            name: deploy-demo1
            port:
              number: 8080
        path: /
        pathType: Prefix
  - host: www.b.com
    http:
      paths:
      - backend:
          service:
            name: deploy-demo2
            port:
              number: 9090
        path: /
        pathType: Prefix

status:
  loadBalancer: {}

在这里插入图片描述

##访问验证

curl http://www.a.com:30080
curl http://www.b.com:30080

在这里插入图片描述

Ingress HTTPS 代理访问

生成证书和私钥

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

在这里插入图片描述

创建secret资源

kubectl create secret tls tls-secret --key tls.key --cert tls.crt 

在这里插入图片描述

创建Ingress资源

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-https
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - www.a.com
    secretName: tls-secret
  rules:
  - host: www.a.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service: 
            name: deploy-demo1
            port:
              number: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-http
spec:
  ingressClassName: nginx
  rules:
  - host: www.b.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service: 
            name: deploy-demo2
            port:
              number: 9090

在这里插入图片描述

Nginx 进行 BasicAuth

yum -y install httpd-tools
htpasswd -c auth zhangsan


New password:  123
Re-type new password: 123
Adding password for user zhangsan
kubectl create secret generic basic-auth --from-file=auth

在这里插入图片描述

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-http
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - zhangsan'
spec:
  ingressClassName: nginx
  rules:
  - host: www.b.com
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service: 
            name: deploy-demo2
            port:
              number: 9090

在这里插入图片描述

nginx进行重写

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: www.a.com
    http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: deply-demo1
            port: 
              number: 8080

在这里插入图片描述

在这里插入图片描述

总结

  • K8S集群外的客户端应用访问K8S集群内部服务的方案

    • Service:NodePort LoadBalancer externalIPs 只支持四层反向代理,端口数量有限,如果业务服务应用很多时端口的管理成本会比较高
    • Ingress:支持七层反向代理,可自定义规则根据用户请求的 域名 或 URL路径 转发给指定的 Service
  • ingress 的组成:

    • ingress资源对象:设置转发规则,告诉 ingress控制器应该根据什么域名或URL路径转发给相应的 Service 资源
    • ingress控制器(ingress-controller):根据 ingress 资源配置的转发规则转发用户请求的组件,以 Pod 形式运行的
  • ingress 的使用:

    • DaemonSet + Host网络模式 部署 ingress-controller
    • 数据流向:
      • 客户端 -> 防火墙、前端负载均衡器 -> Node节点的80/443端口进入ingress-controller -> 根据转发规则 -> 业务Pod的Service -> 业务Pod
    • Deployment + NodePort/LoadBalancer类型的Service 部署 ingress-controller
    • 数据流向:
      • 客户端 -> 防火墙、前端负载均衡器 -> ingress-controller的Service(NodeIP:NodePort)-> ingress-controller -> 根据转发规则 -> 业务Pod的Service -> 业务Pod
ingress 的配置:
kubectl create ingress <资源名称> --rule=<域名>/<URL路径>=<Service名称>:<Service端口> --class=<ingress控制器类>

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: 资源名称
spec:
  ingressClassName: 指定ingress控制器类
  rules:
  - host: 目标域名(可以精确匹配或通配符匹配,比如 *.kgc.com 可以匹配www.kgc.com或mail.kgc.com等,但不能匹配ky22.www.kgc.com)
    http:
      paths:
      - path: 目标域名后的URL路径(比如 / 代表网页根路径,或者 /test)
        pathType: Prefix|Exact(Exact用于精确匹配URL路径;Prefix用于前缀匹配,且只能匹配完整的字符串,/abc能匹配/abc/123,但不能匹配/abc123)
        backend:
          service:
            name: 目标Service资源的名称
            port:
              number: 目标Service的端口
      
	  #基于不同的 URL路径 的代理转发
      - path: URL路径2
	    ....
  #基于不同的 域名 的代理转发
  - host: 域名2
    http:
	....
#基于 https 代理转发
1)先获取 tls 证书和私钥文件
2)创建 tls 类型的 Secret资源   kubectl create secret tls <资源名称> --cert=证书文件路径  --key=私钥文件路径
3)创建 ingress 资源,引用 tls 类型的 Secret资源
spec:
  tls:
  - hosts:
    - 指定使用 https 访问的目标域名
    secretName: 指定tls类型的Secret资源
#基于 basic-auth 访问认证
1)使用 htpasswd 创建用户数据文件,固定文件名为 auth
2)创建 Secret资源 kubectl create secret generic <资源名称> --from-file=auth
3)创建 ingress 资源,在 annotations 注释字段中添加配置信息
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: Secret资源名称
    nginx.ingress.kubernetes.io/auth-realm: '窗口提示信息'
#基于 rewrite 重写访问路径
创建 ingress 资源,在 annotations 注释字段中添加配置信息
metadata:
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  ....
spec:
  rules:
  - host: "www.kgc.com"
    http:
      paths:
      - pathType: Prefix
        path: /something(/|$)(.*)
        backend:
          service:
            name: myapp-ky29
            port:
              number: 9090
捕获的正则表达式 任何字符(.*) 将其分配给占位符 $2,然后将其用作注释中的参数 rewrite-target
www.kgc.com[:端口]/something 重写为 www.kgc.com[:端口]/
www.kgc.com[:端口]/something/ 重写为 www.kgc.com[:端口]/
www.kgc.com[:端口]/something/new 重写为 www.kgc.com[:端口]/new
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: https://www.accp.com:30443
spec:
  rules:
  - host: "www.kgc.com"

将任何使用 www.kgc.com 作域名的访问请求,都重写成 https://www.accp.com:30443
metadata:
  annotations:
    nginx.ingress.kubernetes.io/app-root: /app1
spec:
  rules:
  - host: "www.kgc.com"
    http:
      paths:
      - pathType: Prefix
        path: /

将访问 www.kgc.com[:端口]/ 的请求,都重写成 www.kgc.com[:端口]/app1

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

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

相关文章

18----注释

本节是markdown教程的最后一节&#xff0c;也是最简单的一节----注释。 我们常见的注释可能是这样的&#xff1a; 也可能是这样的&#xff1a; 注释无处不在&#xff0c;就让我们抱着一丝期待&#xff0c;来看看markdown的注释吧&#xff01; 一、基本用法&#xff1a; Ma…

深入AQS原理(我在一开始学的时候就把非公平锁和公平锁给弄混了)

谈到并发&#xff0c;我们不得不说AQS(AbstractQueuedSynchronizer)&#xff0c;所谓的AQS即是抽象的队列式的同步器&#xff0c;内部定义了很多锁相关的方法&#xff0c;我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。 …

13.实现业务功能--板块信息

目录 获取在首页中显示的版块 1. 实现逻辑 2. 创建扩展 Mapper.xml 3. 修改 DAO 4. 创建 Service 接口 5. 实现 Service 接口 6. 生成测试方法 7. 实现 Controller 8. 实现前端页面 在数据库中执行以下 SQL 语句&#xff1a; INSERT INTO t_board (id, name, article…

Dockerfile制作Web应用系统nginx镜像

目录 1.所需实现的具体内容 2.编写Dockerfile Dockerfile文件内容&#xff1a; 默认网页内容&#xff1a; 3.构建镜像 4.现在我们运行一个容器&#xff0c;查看我们的网页是否可访问 5.现在再将我们的镜像打包并上传到镜像仓库 1.所需实现的具体内容 基于centos基础镜像…

GAN:对抗生成网络,前向传播和后巷传播的区别

目录 GAN&#xff1a;对抗生成网络 损失函数 判别器开始波动很大&#xff0c;先调整判别器 生成样本和真实样本的统一&#xff1a;真假难辨​编辑 文字专图片​编辑 头像转表情包​编辑 头像转3D​编辑 后向传播 1. 前向传播&#xff08;forward&#xff09; 2. 反向传播&…

自我管理篇--“90%的简历会被刷掉”这个现象背后的原因

以上简历模板资源的排版可能不是最优&#xff0c;但工作经历可以借鉴 文章目录 一、简历问题出在什么地方二、如何提升简历的质量三、如何避免常见的简历错误四、如何让你的简历脱颖而出五、如何准备面试 为什么90%的简历会被淘汰 在当今竞争激烈的就业市场中&#xff0c;求职者…

OCR扫描仪应该怎么选?

选择OCR扫描仪时&#xff0c;以下几个因素需要考虑&#xff1a; 1. 扫描质量&#xff1a;确保选购的OCR扫描仪能够提供高质量的扫描结果。关注分辨率&#xff08;通常以dpi表示&#xff09;&#xff0c;辨识度和颜色深度等技术指标&#xff0c;以满足您的需求。 2. 扫描速度&a…

电脑报错vcomp100.dll丢失怎样修复?这三个方法可以解决

vcomp100.dll是微软Visual C 2005 Redistributable Package的一部分&#xff0c;它包含了运行某些程序所需的C运行时库。当电脑中的vcomp100.dll文件丢失或损坏时&#xff0c;可能会导致一些程序无法正常运行&#xff0c;甚至出现系统崩溃等问题。 那么&#xff0c;当遇到这样的…

openpnp - 自动换刀的设置

文章目录 openpnp - 自动换刀的设置概述笔记采用的openpnp版本自动换刀库的类型选择自动换刀设置前的注意事项先卸掉吸嘴座上所有的吸嘴删掉所有的吸嘴设置自动换刀的视觉识别设置吸嘴座为自动换刀 - 以N1为例备注补充 - 吸嘴轴差个0.3mm, 就有可能怼坏吸嘴END openpnp - 自动换…

Laravel 框架构造器的排序分组.子查询 JOIN 查询 构造器的增删改 ⑦

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

go1.21.0.windows-amd64.msi

go1.21.0.windows-amd64.msi Windows 10 or greater required.

漏洞指呗-VluFocus靶场专栏-番外篇

漏洞指呗-VluFocus靶场专栏-番外篇奇技淫巧 &#x1f338;struts2漏洞扫描工具&#x1f338;step1 修改ip和端口step2 验证漏洞是否存在step3 执行cmd命令&#xff0c;获取flag &#x1f338;Goby插件工具headshot&#x1f338;step1 输入ip和端口 检测step2 cmd 输入指令 &…

LeetCode 833. Find And Replace in String【字符串,哈希表,模拟】1460

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

stm32单片机开关控制LED灯(中断方式)(proteus电路图)

注意了&#xff1a;一般人都是用按键button实现这个功能&#xff0c;但是我就是喜欢用Switch&#xff0c;然后我就用了Switch&#xff0c;喜欢的朋友欢迎看一看 不同地方在于&#xff1a;这里是interrupt 函数 void EXTI0_IRQHandler(void) {/* USER CODE BEGIN EXTI0_IRQn 0…

【Apollo学习笔记】——规划模块TASK之LANE_CHANGE_DECIDER

文章目录 前言LANE_CHANGE_DECIDER功能简介LANE_CHANGE_DECIDER相关配置LANE_CHANGE_DECIDER总体流程LANE_CHANGE_DECIDER相关子函数PrioritizeChangeLaneUpdateStatusIsClearToChangeLaneHysteresisFilter 参考 前言 在Apollo星火计划学习笔记——Apollo路径规划算法原理与实…

线性代数的学习和整理8: 方阵和行列式相关(草稿-----未完成)

1.4.1 方阵 矩阵里&#xff0c;行数列数的矩阵叫做方阵方阵有很多很好的特殊属性 1.4.2 行列式 行列式是方阵的一种特殊运算如果矩阵行数列数相等&#xff0c;那么这个矩阵是方阵。行列数的计算方式和矩阵的不同只有方阵才有行列式行列式其实是&#xff0c;矩阵变化的一个面…

SLAM-VIO视觉惯性里程计

SLAM 文章目录 SLAM前言IMU与视觉比较单目视觉缺陷&#xff1a;融合IMU优势&#xff1a;相机-IMU标定松耦合紧耦合基于滤波的融合方案&#xff1a;基于优化的融合方案&#xff1a; 前言 VIO&#xff08;visual-inertial odometry&#xff09;即视觉惯性里程计&#xff0c;有时…

第十三章MyBatis高级映射

多对一映射 创建数据表 student是主表class_id关联class表的id class表 student表 创建pojo Class类 Data AllArgsConstructor NoArgsConstructor public class Class {private Long id;private String name;private List<Student> students; }Student类 Data A…

【算法系列篇】滑动窗口

文章目录 前言什么是滑动窗口1.长度最小的子数组1.1 题目要求1.2 做题思路 1.3 Java代码实现2.无重复字符的最长子串2.1 题目要求2.2 做题思路2.3 Java代码实现 3.最大连续1的个数 III3.1 题目要求3.2 做题思路3.3 Java代码实现 4.将x减到0的最小操作数4.1 题目要求4.2 做题思路…

ubuntu上使用osg3.2+osgearth2.9

一、介绍 在ubuntu上使用osgearth加载三维数字地球&#xff0c;首先要有osg和osgearth的库&#xff0c;这些可以直接使用apt-get下载安装&#xff0c;但是版本有些老&#xff0c;如果需要新版本的就需要自己编译。 #查看现有版本 sudo apt-cache madison openscenegraph #安装…