【K8s】Service详解

news2024/11/28 8:40:44

文章目录

  • 一、Service介绍
    • 1、认识Service
    • 2、kube-proxy的三种工作模式
    • 3、Service的类型
  • 二、Service的使用
    • 1、实验数据准备
    • 2、Service类型为ClusterIP
      • 补充:Endpoints
      • 补充:负载分发策略
    • 3、Service类型为HeadLiness
    • 3、Service类型为NodePort
    • 4、Service的类型是LoadBalancer
    • 5、Service的类型是ExternalName

接下来是K8s的流量负载组件–Service和Ingress

一、Service介绍

1、认识Service

程序在容器中、容器在Pod中,可以通过pod的ip来访问应用程序,但是podIP会随着创建销毁而改变。由此,Service出现:

Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。

在整个Service的生命周期中,ServiceIP是不会变化的。
在这里插入图片描述
Service是一个概念,真正起作用的是kube-proxy服务进程:

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

在这里插入图片描述

[root@node1 ~] ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.97.97.97:80 rr
  -> 10.244.1.39:80               Masq    1      0          0
  -> 10.244.1.40:80               Masq    1      0          0
  -> 10.244.2.33:80               Masq    1      0          0
  • 10.97.97.97:80 是service提供的访问入口
  • 当访问这个入口的时候,可以发现后面有三个pod的服务在等待调用
  • kube-proxy会基于rr(轮询)的策略,将请求分发到其中一个pod上去
  • 这个规则信息会同时在集群内的所有节点上都生成,所以在任何一个节点上,都可以访问

2、kube-proxy的三种工作模式

userspace 模式

userspace模式下,kube-proxy会为每一个Service创建一个监听端口,发向Cluster IP的请求被Iptables规则重定向到kube-proxy监听的端口上,kube-proxy根据LB算法选择一个提供服务的Pod并和其建立链接,以将请求转发到Pod上。 该模式下,kube-proxy充当了一个四层负责均衡器的角色。由于kube-proxy运行在userspace中,在进行转发处理时会增加内核和用户空间之间的数据拷贝,虽然比较稳定,但是效率比较低。

在这里插入图片描述

iptables 模式

iptables模式下,kube-proxy为service后端的每个Pod创建对应的iptables规则,直接将发向Cluster IP的请求重定向到一个Pod IP。 该模式下kube-proxy不承担四层负责均衡器的角色,只负责创建iptables规则。该模式的优点是较userspace模式效率更高,但不能提供灵活的LB策略,当后端Pod不可用时也无法进行重试(转发到了podA,podA不可用也不会去试其他pod)。

在这里插入图片描述

ipvs 模式

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

在这里插入图片描述
此模式必须安装ipvs内核模块(在第二章搭建集群时已完成),否则会降级为iptables

# 开启ipvs
[root@k8s-master01 ~] kubectl edit cm kube-proxy -n kube-system
# 修改mode: "ipvs"

按标签删除kube-proxy的pod:

# 按标签删除kube-proxy的pod,使刚改的配置生效
[root@k8s-master01 ~] kubectl delete pod -l k8s-app=kube-proxy -n kube-system
[root@node1 ~] ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.97.97.97:80 rr
  -> 10.244.1.39:80               Masq    1      0          0
  -> 10.244.1.40:80               Masq    1      0          0
  -> 10.244.2.33:80               Masq    1      0          0

3、Service的类型

Service的资源清单文件:

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

关于type字段,service有四种类型:

  • ClusterIP:默认值,它是Kubernetes系统自动分配的虚拟IP,只能在集群内部访问(除了集群里的主从节点机器,其他机器即使网络和集群机器相通也不能访问)
  • NodePort:将Service通过集群某节点Node上指定的端口暴露给外部,如此,集群外部的机器就可以访问服务
  • LoadBalancer:使用外接负载均衡器完成到服务的负载分发,注意此模式需要外部云环境支持
  • ExternalName: 把集群外部的服务引入集群内部,直接使用

二、Service的使用

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
[root@k8s-master01 ~] kubectl create -f deployment.yaml
deployment.apps/pc-deployment created

查看pod详情,加 -o wide和 --show-labels

[root@k8s-master01 ~] kubectl get pods -n dev -o wide --show-labels
NAME                             READY   STATUS     IP            NODE     LABELS
pc-deployment-66cb59b984-8p84h   1/1     Running    10.244.1.39   node1    app=nginx-pod
pc-deployment-66cb59b984-vx8vx   1/1     Running    10.244.2.33   node2    app=nginx-pod
pc-deployment-66cb59b984-wnncx   1/1     Running    10.244.1.40   node1    app=nginx-pod

此时,通过podIP和容器暴露的端口就可以访问:

curl 10.244.1.39: 80
# 但现在都返回nginx的主页

为了方便直观看到请求被转发到哪个pod,修改三个pod的nginx的index.html页面:

[root@k8s-master01 ~] kubectl exec -it pc-deployment-66cb59b984-8p84h -n dev /bin/sh
: echo "10.244.1.39" > /usr/share/nginx/html/index.html

#修改完毕之后,访问测试
[root@k8s-master01 ~] curl 10.244.1.39:80
10.244.1.39
[root@k8s-master01 ~] curl 10.244.2.33:80
10.244.2.33
[root@k8s-master01 ~] curl 10.244.1.40:80
10.244.1.40

2、Service类型为ClusterIP

创建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
  ports:
  - port: 80  # Service端口,自己指定       
    targetPort: 80 # pod端口,注意和上面要选择的pod保持一致

创建和查看service:

# 创建service
[root@k8s-master01 ~] kubectl create -f service-clusterip.yaml
service/service-clusterip created

# 查看service
[root@k8s-master01 ~] kubectl get svc -n dev -o wide
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service-clusterip   ClusterIP   10.97.97.97   <none>        80/TCP    13s   app=nginx-po

查看service的详细信息,在这里有一个Endpoints列表,里面就是当前service可以负载到的服务入口:

[root@k8s-master01 ~] kubectl describe svc service-clusterip -n dev
Name:              service-clusterip
Namespace:         dev
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-pod
Type:              ClusterIP
IP:                10.97.97.97
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.39:80,10.244.1.40:80,10.244.2.33:80
Session Affinity:  None
Events:            <none>
# 查看ipvs的映射规则
[root@k8s-master01 ~] ipvsadm -Ln
TCP  10.97.97.97:80 rr
  -> 10.244.1.39:80               Masq    1      0          0
  -> 10.244.1.40:80               Masq    1      0          0
  -> 10.244.2.33:80               Masq    1      0          0

# 访问10.97.97.97:80观察效果
[root@k8s-master01 ~] curl 10.97.97.97:80
10.244.2.33

补充:Endpoints

  • Endpoint是kubernetes中的一个资源对象,存储在etcd中
  • 用来记录一个service对应的所有pod的访问地址
  • 它是根据service配置文件中selector描述产生的

一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现实际服务的端点集合。换句话说,service和pod之间的联系是通过endpoints实现的
在这里插入图片描述

补充:负载分发策略

对Service的访问最后是转发到后面的pod,目前k8s有两种负载分发策略:

  • 不定义默认使用kube-proxy的策略,比如随机、轮询

  • 基于客户端地址的会话保持模式,即来自同一个客户端发起的所有请求都会转发到固定的一个Pod上。此模式可以使在spec中添加sessionAffinity:ClientIP配置

# 查看ipvs的映射规则【rr 轮询】
[root@k8s-master01 ~] ipvsadm -Ln
TCP  10.97.97.97:80 rr
  -> 10.244.1.39:80               Masq    1      0          0
  -> 10.244.1.40:80               Masq    1      0          0
  -> 10.244.2.33:80               Masq    1      0          0

# 循环访问测试
[root@k8s-master01 ~] while true;do curl 10.97.97.97:80; sleep 5; done;
10.244.1.40
10.244.1.39
10.244.2.33
10.244.1.40
10.244.1.39
10.244.2.33

# 可以看到访问被轮询到了每个pod上

修改分发策略----service的yaml文件中加一行sessionAffinity:ClientIP

# 查看ipvs规则【persistent 代表持久】10800是有效时间
[root@k8s-master01 ~] ipvsadm -Ln
TCP  10.97.97.97:80 rr persistent 10800
  -> 10.244.1.39:80               Masq    1      0          0
  -> 10.244.1.40:80               Masq    1      0          0
  -> 10.244.2.33:80               Masq    1      0          0

# 循环访问测试
[root@k8s-master01 ~] while true;do curl 10.97.97.97; sleep 5; done;
10.244.2.33
10.244.2.33
10.244.2.33

# 同一个客户端发起的请求,第一次被转发到了10.244.2.33
# 那以后有效时间内,该客户端的请求都是转发到10.244.2.33
  

删除service

[root@k8s-master01 ~] kubectl delete -f service-clusterip.yaml
service "service-clusterip" deleted

3、Service类型为HeadLiness

有些开发场景,k8s提供的负载均衡策略不能满足需求,即既不想轮询,也不想随机,而希望自己来控制负载均衡策略。此时就需要HeadLiness(无头类型服务)

HeadLiness类Service不会分配Cluster IP,如果想要访问service,只能通过service的域名进行查询。

创建service-headliness.yaml,将clusterIP设置为None,即可创建headliness Service

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
# 创建service
[root@k8s-master01 ~] kubectl create -f service-headliness.yaml
service/service-headliness created

# 获取service, 发现CLUSTER-IP未分配
[root@k8s-master01 ~] kubectl get svc service-headliness -n dev -o wide
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service-headliness   ClusterIP   None         <none>        80/TCP    11s   app=nginx-pod

查看service详情,可以看到虽然Cluster-IP为none,但endpoints信息一切照旧正常:

# 查看service详情
[root@k8s-master01 ~] kubectl describe svc service-headliness  -n dev
Name:              service-headliness
Namespace:         dev
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-pod
Type:              ClusterIP
IP:                None
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.39:80,10.244.1.40:80,10.244.2.33:80
Session Affinity:  None
Events:            <none>

随便进入其中一个pod,cat /etc/resolv.conf查看域名解析情况:

# 查看域名的解析情况
[root@k8s-master01 ~] kubectl exec -it pc-deployment-66cb59b984-8p84h -n dev /bin/sh
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local

# dig@IP serviceName.namespace.svc.cluster.local
# .svc.cluster.local这一串默认,创建集群的时候也可自己配置
[root@k8s-master01 ~] dig @10.96.0.10 service-headliness.dev.svc.cluster.local
service-headliness.dev.svc.cluster.local. 30 IN A 10.244.1.40
service-headliness.dev.svc.cluster.local. 30 IN A 10.244.1.39
service-headliness.dev.svc.cluster.local. 30 IN A 10.244.2.33

3、Service类型为NodePort

ClusterIP类型的Service,只能给集群内的机器访问,想将Service暴露给外部机器使用,就得使用NodePort类型的Service。

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

在这里插入图片描述
创建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
# 创建service
[root@k8s-master01 ~] kubectl create -f service-nodeport.yaml
service/service-nodeport created

# 查看service
[root@k8s-master01 ~] kubectl get svc -n dev -o wide
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)       SELECTOR
service-nodeport   NodePort   10.105.64.191   <none>        80:30002/TCP  app=nginx-pod

接下来可以通过电脑主机的浏览器(集群外部节点)去访问集群中任意一个nodeip的30002端口,即可转发到10.105.64.191:80,再访问到pod

4、Service的类型是LoadBalancer

LoadBalancer类型和NodePort类型都是向外部暴露一个端口,区别在于LoadBalancer会在集群的外部再来做一个负载均衡设备,而这个设备需要外部环境支持的,外部服务发送到这个设备上的请求,会被设备负载之后转发到集群中。

在这里插入图片描述

5、Service的类型是ExternalName

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

在这里插入图片描述

apiVersion: v1
kind: Service
metadata:
  name: service-externalname
  namespace: dev
spec:
  type: ExternalName # service类型
  externalName: www.baidu.com  #改成ip地址也可以
# 创建service
[root@k8s-master01 ~] kubectl  create -f service-externalname.yaml
service/service-externalname created

# 域名解析
[root@k8s-master01 ~] dig @10.96.0.10 service-externalname.dev.svc.cluster.local
service-externalname.dev.svc.cluster.local. 30 IN CNAME www.baidu.com.
www.baidu.com.          30      IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       30      IN      A       39.156.66.18
www.a.shifen.com.       30      IN      A       39.156.66.14

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

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

相关文章

Ovito渲染技巧之体系边界识别

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩&#xff01; 主要专栏内容包括&#xff1a; †《LAMMPS小技巧》&#xff1a; ‾ \textbf…

性能、性能还是性能---下一代Android性能框架分析

性能优化的重要性和难度毋庸置疑&#xff0c;事实上&#xff0c;性能优化也是一个永无止境的游戏&#xff0c;总会发现有一些东西需要优化。但是不可避免的是&#xff0c;这也是一个边际效益递减的事情&#xff0c;项目或应用获得的收益在一定程度上也会逐渐降低。What’s new …

ReentrantLock 原理

目录 ReentrantLock 概述 ReentrantLock 的原理 什么是 AQS ? 获取锁资源(以⾮公平锁为例) tryAcquire addWaiter acquireQueued 释放锁资源 ⾮公平锁体现在哪⾥&#xff1f; 调试代码 总结 ReentrantLock 概述 ReentrantLock是Lock接⼝的默认实现&#xff0c;是⼀…

【Linux】-关于Linux的指令(下)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 文章目录 前言一、时间相关的指令二、cal指令三、find -name指…

Centos7 经典模式安装GBase 8s 图文教程

Centos7安装GBase 8s 图文教程 前言1.1 硬件要求1.2 系统要求1.3 虚拟 PC 软件1.4 安装及配置数据库服务器1.4.1 创建 gbasedbt 组和用户1.4.2 创建 GBase 8s 数据库安装目录1.4.3 上传并解压安装包1.4.4 执行安装 参考文献 前言 本篇博文分享如何在Centos7 x86架构的系统中安…

第2章-Selenium-API操作

目标&#xff1a; 1. 熟练应用八种元素定位方式 2. 掌握对元素和浏览器的操作方法 3. 掌握键盘鼠标的操作 4. 掌握元素等待的操作 5. 掌握下拉选择框、 警告框和滚动条的操作 6. 掌握如何切换frame框架和多窗口 7. 掌握如何实现窗口截图 1.元素定位 1. 掌握id、 name、 cla…

【leetcode】622 二叉树的最大宽度

题目描述 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长度。将这个二叉树视作与满二叉树结构相同&#…

MATLAB 之 M 文件和程序控制结构(顺序、选择、循环)

文章目录 一、M 文件1. M 文件的建立与打开1.1 建立新的 M 文件1.2 打开已有的 M 文件 2. M 文件的分类 二、 程序控制之顺序结构1. 数据的输入2. 数据的输出3. 程序的暂停 三、程序控制之选择结构1. if 语句2. switch 语句3. try 语句 四、程序控制之循环结构1. for 语句2. wh…

畸变像差校正技术(畸变相位补偿)发展现状及其仿真实验研究-技术汇总-Matlab代码

▒▒本文目录▒▒ 一、引言二、物理方法2.1 基于二次曝光法的畸变像差补偿仿真实验验证 三、数值方法3.1 基于主成分分析法的畸变像差补偿仿真实验验证3.2 基于标准多项式拟合法的畸变像差校正仿真实验验证3.3 基于最小二乘拟合法的畸变像差校正仿真实验验证3.4 基于泽尼克多项…

Simulink 自动代码生成电机控制——永磁同步电机参数获取

目录 前言 极对数测量 电阻测量&#xff08;Rs&#xff09; 电感测量&#xff08;Ld和Lq&#xff09; 磁链测量 总结 前言 在建模之前或者需要更换一个新电机&#xff0c;需要获取目标电机的电气参数&#xff0c;如果参数不对&#xff0c;对于电流环参数的整定&#xff0…

2023/05/08~14 刷题记录

A - Plus and Multiply 题意&#xff1a; 题解&#xff1a; 题目说可以将集合里面的数字 *a 或者 b 操作&#xff0c;并将新的值放进集合中&#xff0c;首先想到 dfs 暴力求解&#xff0c;但是太暴力了&#xff0c;直接 时间超限 。通过观察我们可以知道&#xff0c;要求 n 是否…

前端模块化

什么是模块化 事实上模块化开发最终目的是将程序划分成一个个小的结构在这个结构中编写属于自己的逻辑代码&#xff0c;有自己的作用域&#xff0c;不会影响到其他的结构这个结构可以将自己希望暴露的变量、函数、对象等导出给其他结构使用。可以通过某种方式&#xff0c;导入…

电脑软件:国内最好用解压缩软件 7-Zip 新版本发布

5 月 9 日消息&#xff0c;7-Zip 是一款拥有极高压缩比的的开源压缩软件&#xff0c;支持 LZMA2 等 7 种开源算法&#xff0c;以及支持较广泛的压缩格式 .7z&#xff0c;体积不大&#xff08;1.5MB&#xff09;、功能完善&#xff0c;除了默认 UI 不符合国内审美外几乎没什么可…

Oracle数据库安装教程,并实现公网远程连接【内网穿透】

✨ 目录 &#x1f388; 前言&#x1f388; 1. 数据库搭建&#x1f388; 2. 内网穿透&#x1f388; 2.1 安装cpolar内网穿透&#x1f388; 2.2 创建隧道映射 &#x1f388; 3. 公网远程访问&#x1f388; 4. 配置固定TCP端口地址&#x1f388; 4.1 保留一个固定的公网TCP端口地址…

Java经典笔试题—day08

Java经典笔试题—day08 &#x1f50e;选择题&#x1f50e;编程题&#x1f95d;两种排序方法&#x1f95d;求最小公倍数 &#x1f50e;结尾 &#x1f50e;选择题 (1)下列选项中关于Java中super关键字的说法正确的是&#xff08;&#xff09; A.super关键字是在子类对象内部指代…

JAVA JDK下载安装手册

JDK的介绍与安装 JDK简介 JDK是 Java 语言的软件开发工具包&#xff0c;主要用于移动设备、嵌入式设备上的java应用程序。编写 Java 程序必须使用 JDK&#xff0c;它提供了编译和运行 Java 程序的环境。是整个java开发的核心。 准备JDK 本次使用的是JDK1.8 如下所示: 下载完…

记两道AES-CBC题

文章目录 知识导入&#xff08;AES-CBC模式&#xff09;题一(buu [ACTF新生赛2020]crypto-aes 1)题目描述&#xff1a;题目分析&#xff1a;知识导入os.urandom(n)函数比特&#xff0c;字节&#xff0c;二进制数之间的关系AES.new(key,AES.MODE_CBC,iv) 题二(crack AES-CBC IV)…

小黑子—Java从入门到入土过程:第九章-IO流

Java零基础入门9.0 Java系列第九章- IO流1. 初识IO流2. IO流的体系2.1 字节流2.1.1 FileOutputStream 字符串输出流2.1.1 - I 字符串输出流的细节2.1.1 - II FileOutputStream写数据的3种方式2.1.1 -III FileOutputStream写数据的两个小问题 2.1.2 FileInputStream 字符串输入流…

点线面产生局部坐标系以及计算到世界坐标系的旋转矩阵

欢迎关注更多精彩 问题描述 给定点O&#xff0c;线段AB&#xff0c;平面OP&#xff0c;求以OP法向为某一轴&#xff0c;以AB在OP上的投影为另一轴&#xff0c;O为原点的局部坐标系。要求给出X,Y,Z轴的单位向量&#xff0c;以及原点O. 求出转换到世界坐标系的旋转矩阵RT。 如…

ChatGPT的简单了解

ChatGPT 是 InstructGPT 的同级模型&#xff0c;它经过训练可以按照提示中的说明进行操作并提供详细的响应。 InstructGPT论文&#xff1a;https://arxiv.org/pdf/2203.02155.pdf InstructGPT怎么准备和标记数据集&#xff1a;https://harryliu.blog.csdn.net/article/detail…