K8S之服务Service(十三)

news2024/12/23 22:41:54

1、Service概念:

     Kubernetes中的 Pod是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁pod生命就永远结束,这个pod就不存在了,通过ReplicaSets能够动态地创建和销毁Pod(例如,需要进行扩缩容,或者执行滚动升级),每个Pod都会获取它自己的 IP 地址,这些IP地址并不是一直处于稳定的状态,可能随时改变。 这会导致一个问题:在 Kubernetes 集群中,如果一组Pod(称为 backend)为其它Pod (称为 frontend)提供服务,那么那些 frontend 该如何发现这些backend?

关于Service

     Kubernetes Service定义了这样一种抽象:逻辑上的一组Pod,一种可以访问它们的策略-通常称为微服务。 这一组Pod能够被Service访问到,通常是通过Label Selector实现的。举个例子,考虑一个图片处理程序 backend,它运行了3个副本。这些副本是可互换的 —— frontend 不需要关心它们调用了哪个backend 副本。 然而组成这一组 backend 程序的 Pod 实际上可能会发生变化,frontend 客户端不应该也没必要知道,而且也不需要跟踪这一组 backend 的状态。 Service 定义的抽象能够解耦这种关联。

例如想要用nginx反向代理tomcat,那么tomcat如果是通过pod部署的,pod的ip可能会随时变化,那么我们就需要在所有这些部署tomcat的pod前面加上一个固定接入层service,我们nginx反向代理只需要写service地址,就会代理到后端的pod,那么pod就算ip怎么变化,通过service都可以找到对 Kubernetes 集群中的应用,Kubernetes 提供了简单的Endpoints API,只要Service中的一组Pod发生变更,应用程序就会被更新。 对非 Kubernetes 集群中的应用,Kubernetes 提供了基于 VIP 的网桥的方式访问Service,再由Service重定向到backend Pod。

     service是一个固定接入层,客户端可以通过访问service来访问到service关联的后端pod,这个service工作依赖于在kubernetes集群之上部署的一个附件,就是kubernetes的dns服务(不同kubernetes版本的dns默认使用的也是不一样的,1.11之前的版本使用的是kubeDNs,较新的版本使用的是coredns),service的名称解析是依赖于dns附件的,因此在部署完k8s之后需要在部署dns附件,kubernetes要想给客户端提供网络功能,需要依赖第三方的网络插件(flannel,calico等)。

在kubernetes集群中有三类ip地址:

node network(节点网络),pod network(pod 网络),这两种网络地址是我们实实在在配置的,其中节点网络地址是配置在节点接口之上,而pod网络地址是配置在pod资源之上的,因此这些地址都是配置在某些设备之上的,这些设备可能是硬件,也可能是软件模拟的,cluster network(集群地址,也成为service network),这个地址是虚拟的地址(virtual ip),没有配置在某个接口上,只是出现在service的规则当中。

     每个K8s节点上都有一个工作的组件叫做kube-proxy,kube-proxy这个组件将始终监视着apiserver中有关service资源的变动信息,需要跟master之上的apiserver交互,随时连接到apiserver上获取任何一个与service资源相关的资源变动状态,这种是通过kubernetes中固有的一种请求方法watch(监视)来实现的,一旦有service资源的内容发生变动(如创建,删除),kube-proxy都会将它转化成当前节点之上的能够实现service资源调度,把我们请求调度到后端特定的pod资源之上的规则,这个规则可能是iptables,也可能是ipvs,取决于service的实现方式

service实现方式

第一种:iptables

     客户端ip请求时直接请求service的ip,这个请求报文被本地内核空间中的service规则所截取,进而直接调度给相关的pod,这个方式是直接工作在内核空间,由iptables规则直接实现

第二种:ipvs

     客户端请求到达内核空间之后直接由ipvs规则来调度到相关的pod资源

1.11之前的版本使用的是iptables

1.11+版本使用的是ipvs,ipvs如果没有被激活就会自动降级为iptables

     如果某个服务背后的pod资源发生改变,比如service的标签选择器适用的pod又多了一个,这个pod使用的信息会立即反应在apiserver上,kube-proxy能监听到这个service的变化,将其立即转为service规则(如iptables规则)

2. 通过Service访问pod

(1)创建pod

cat pod_test.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: my-nginx

spec:

  selector:

    matchLabels:

      run: my-nginx

  replicas: 2

  template:

    metadata:

      labels:

        run: my-nginx

    spec:

      containers:

      - name: my-nginx

        image: nginx

        ports:

        - containerPort: 80

kubectl apply -f pod_test.yaml

这使得可以从集群中任何一个节点来访问它。

检查pod运行情况,可看到该 Pod 正在运行:

kubectl get pods -l run=my-nginx -o wide

检查 Pod 的 IP 地址:

kubectl get pods -l run=my-nginx -o yaml | grep podIP

显示如下:

podIP: 10.244.3.40

cni.projectcalico.org/podIP: 10.244.3.42/32

podIP: 10.244.3.42

     应该能够通过 ssh 登录到集群中的任何一个节点上,使用 curl 也能调通所有 IP 地址。 需要注意的是,容器不会使用该节点上的 80 端口,也不会使用任何特定的NAT规则去路由流量到Pod上。 这意味着可以在同一个节点上运行多个 Pod,使用相同的容器端口,并且可以从集群中任何其他的Pod或节点上使用IP的方式访问到它们。像 Docker一样,端口能够被发布到主机节点的接口上,但是出于网络模型的原因应该从根本上减少这种用法。

(2)创建service

     我们所有Pod在一个扁平的、集群范围的地址空间中运行 Nginx 服务,可以直接连接到这些 Pod,但如果某个节点死掉了会发生什么呢? Pod 会终止,Deployment 将创建新的 Pod,且使用不同的 IP。这正是 Service 要解决的问题。Kubernetes Service 从逻辑上定义了运行在集群中的一组 Pod,这些 Pod 提供了相同的功能。 当每个 Service 创建时,会被分配一个唯一的 IP 地址(也称为 clusterIP)。 这个 IP 地址与一个 Service 的生命周期绑定在一起,当 Service 存在的时候它也不会改变。 可以配置 Pod 使它与 Service 进行通信,Pod 知道与 Service 通信将被自动地负载均衡到该 Service 中的某些 Pod 上。

创建一个service

cat service.yaml

apiVersion: v1

kind: Service

metadata:

  name: my-nginx

  labels:

    run: my-nginx

spec:

  ports:

  - port: 80

    protocol: TCP

  selector:

run: my-nginx

kubectl apply -f service.yaml

上述yaml将创建一个 Service,对应具有标签run: my-nginx的Pod,目标TCP端口 80,并且在一个抽象的Service端口(targetPort:容器接收流量的端口;port:抽象的 Service 端口,可以使任何其它 Pod访问该 Service 的端口)上暴露。 查看 Service API 对象了解 Service 定义支持的字段列表。

kubectl get svc my-nginx

NAME       CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE

my-nginx     ClusterIP   10.104.137.147   <none>        80/TCP    10m

正如前面所提到的,一个 Service 由一组 backend Pod 组成。这些 Pod 通过endpoints暴露出来。 Service Selector将持续评估,结果被 POST 到一个名称为my-nginx的 Endpoint对象上。 当 Pod 终止后,它会自动从 Endpoint 中移除,新的能够匹配上 Service Selector 的 Pod 将自动地被添加到 Endpoint 中。 检查该 Endpoint,注意到 IP 地址与在第一步创建的 Pod 是相同的。

kubectl describe svc my-nginx

Name:              my-nginx

Namespace:         default

Labels:            run=my-nginx

Annotations:       kubectl.kubernetes.io/last-applied-configuration:                 {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"run":"my-nginx"},"name":"my-nginx","namespace":"default"},"spe...

Selector:          run=my-nginx

Type:              ClusterIP

IP:                10.104.137.147

Port:              <unset>  80/TCP

TargetPort:        80/TCP

Endpoints:         10.244.3.40:80,10.244.3.42:80,10.244.3.43:80

Session Affinity:  None

Events:            <none>

kubectl get ep my-nginx

NAME       ENDPOINTS                     AGE

my-nginx   10.244.2.5:80,10.244.3.4:80   1m

现在,能够从集群中任意节点上使用 curl 命令请求 Nginx Service <CLUSTER-IP>:<PORT>

curl 10.104.137.147:80 通过访问service ip:port可以路由到后端的pod

service的type类型如果是ClusterIP,那么就只能被k8s集群中的节点或者pod所访问,不能再k8s集群之外的机器或者浏览器请求service地址,如果想要在k8s之外的主机或者浏览器访问到service,需要把ClusterIP类型变成nodePort,可按如下方法修改:

把上面的ClusterIP类型变成NodePort类型,供集群外部访问

在原有的基础上,增加一个字段type,如下所示

cat service.yaml

apiVersion: v1

kind: Service

metadata:

  name: my-nginx

  labels:

    run: my-nginx

spec:

  ports:

  - port: 80

    protocol: TCP

  type:

    NodePort

  selector:

run: my-nginx

kubectl apply -f service.yaml

kubectl get svc

上面截图可以发现my-nginx这个service 的TYPE类型变成了NodePort

流量走向:

访问物理节点(master节点或者node节点)ip:宿主机映射的端口--->service ip:service的端口----->pod ip:container port

3.没有selector的Service

Servcie 抽象了该如何访问 Kubernetes Pod,但也能够抽象其它类型的backend,例如:

1)希望在生产环境中使用外部的数据库集群,但测试环境使用自己的数据库。

2)希望服务指向另一个Namespace中或其它集群中的服务。

3)正在将工作负载转移到 Kubernetes 集群

在任何这些场景中,都能够定义没有selector 的Service 

kind: Service

apiVersion: v1

metadata:

  name: my-service

spec:

  ports:

  - protocol: TCP

    port: 80

    targetPort: 3306

由于这个Service没有selector,就不会创建相关的Endpoints对象。可以手动将Service映射到指定的Endpoints

kind: Endpoints

apiVersion: v1

metadata:

  name: my-service

subsets:

  - addresses:

      - ip: 1.2.3.4  #这个地址可以是集群外部的地址,如mysql等

    ports:

      - port: 3306

注意:

Endpoint IP 地址不能是 loopback(127.0.0.0/8)、 link-local(169.254.0.0/16)、或者 link-local 多播(224.0.0.0/24)。

访问没有 selector的Service,与有selector的Service的原理相同。请求将被路由到用户定义的Endpoint(该示例中为1.2.3.4:3306)。

type类型是ExternalName,k8s集群内到外的访问

ExternalName ServiceService的特例,它没有selector,也没有定义任何的端口和 Endpoint。 相反地,对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务。

kind: Service

apiVersion: v1

metadata:

  name: my-service

  namespace: prod

spec:

  type: ExternalName

  externalName: my.database.example.com

当查询主机my-service.prod.svc.CLUSTER时,集群的DNS服务将返回一个值为my.database.example.com的CNAME记录。 访问这个服务的工作方式与其它的相同,唯一不同的是重定向发生在DNS层,而且不会进行代理或转发。 如果后续决定要将数据库迁移到Kubernetes集群中,可以启动对应的 Pod,增加合适的Selector 或 Endpoint,修改Service的type即可。

Headless Service

有时不需要或不想要负载均衡,以及单独的 Service IP。 遇到这种情况,可以通过指定 Cluster IP(spec.clusterIP)的值为 "None" 来创建 Headless Service。

这个选项允许开发人员自由寻找他们自己的方式,从而降低与 Kubernetes 系统的耦合性。 应用仍然可以使用一种自注册的模式和适配器,对其它需要发现机制的系统能够很容易地基于这个 API 来构建。对这类 Service 并不会分配 Cluster IP,kube-proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由。 DNS如何实现自动配置,依赖于Service是否定义了 selector

配置 Selector

对定义selector的Headless Service,Endpoint 控制器在 API 中创建了 Endpoints 记录,并且修改 DNS 配置返回 A 记录(地址),通过这个地址直接到达Service的后端Pod上

不配置 Selector

对没有定义 selector 的 Headless Service,Endpoint 控制器不会创建Endpoints记录。

发布服务-服务类型

对一些应用(如 Frontend)的某些部分,可能希望通过外部(Kubernetes 集群外部)IP 地址暴露 Service。Kubernetes Service Types允许指定一个需要的类型的Service,默认是ClusterIP类型。

Type的类型如下:

1.ClusterIP

通过集群的内部IP暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的ServiceType。

2.NodePort

通过每个Node上的IP和静态端口(NodePort)暴露服务。NodePort服务会路由到ClusterIP服务,这个ClusterIP服务会自动创建。通过请求<NodeIP>:<NodePort>,可以从集群的外部访问一个NodePort服务。

3.LoadBalancer

使用云提供商的负载局衡器,可以向外部暴露服务。外部的负载均衡器可以路由到NodePort服务和ClusterIP 服务。

4.ExternalName

通过返回CNAME和它的值,可以将服务映射到externalName字段的内容(例如, foo.bar.example.com)。 没有任何类型代理被创建,这只有 Kubernetes 1.7 或更高版本的kube-dns才支持。

NodePort 类型

如果设置type的值为 "NodePort",Kubernetes master 将从给定的配置范围内(默认:30000-32767)分配端口,每个Node将从该端口(每个 Node 上的同一端口)代理到Service。该端口将通过Service的spec.ports[*].nodePort字段被指定。如果需要指定的端口号,可以配置nodePort的值,系统将分配这个端口,否则调用 API 将会失败(比如,需要关心端口冲突的可能性)。这可以让开发人员自由地安装他们自己的负载均衡器,并配置 Kubernetes 不能完全支持的环境参数,或者直接暴露一个或多个 Node 的IP 地址。需要注意的是,Service 将能通过<NodeIP>:spec.ports[*].nodePort和 spec.clusterIp:spec.ports[*].port 而对外可见。

LoadBalancer 类型

使用支持外部负载均衡器的云提供商的服务,设置type的值为 "LoadBalancer",将为Service提供负载均衡器。 负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过Service的status.loadBalancer字段被发布出去。

kind: Service

apiVersion: v1

metadata:

  name: my-service

spec:

  selector:

    app: MyApp

  ports:

    - protocol: TCP

      port: 80

      targetPort: 9376

      nodePort: 30061

  clusterIP: 10.0.171.239

  loadBalancerIP: 78.11.24.19

  type: LoadBalancer

status:

  loadBalancer:

    ingress:

      - ip: 146.148.47.155

来自外部负载均衡器的流量将直接打到 backend Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。 在这些情况下,将根据用户设置的 loadBalancerIP 来创建负载均衡器。 某些云提供商允许设置 loadBalancerIP。如果没有设置 loadBalancerIP,将会给负载均衡器指派一个临时 IP。 如果设置了 loadBalancerIP,但云提供商并不支持这种特性,那么设置的 loadBalancerIP值将会被忽略掉。

AWS 内部负载均衡器

在混合云环境中,有时从虚拟私有云(VPC)环境中的服务路由流量是非常有必要的。 可以通过在 Service 中增加 annotation 来实现,如下所示:

[...]

metadata:

    name: my-service

    annotations:

        service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0

[...]

在水平分割的 DNS 环境中,需要两个 Service 来将外部和内部的流量路由到 Endpoint 上。

AWS SSL 支持

对运行在 AWS 上部分支持 SSL 的集群,从 1.3 版本开始,可以为 LoadBalancer 类型的 Service 增加两个 annotation:

metadata:

      name: my-service

      annotations:

        service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012

第一个 annotation 指定了使用的证书。它可以是第三方发行商发行的证书,这个证书或者被上传到 IAM,或者由 AWS 的证书管理器创建。

metadata:

      name: my-service

      annotations:

         service.beta.kubernetes.io/aws-load-balancer-backend-protocol: (https|http|ssl|tcp)

第二个 annotation 指定了 Pod 使用的协议。 对于 HTTPS 和 SSL,ELB 将期望该 Pod 基于加密的连接来认证自身。HTTP 和 HTTPS 将选择7层代理:ELB 将中断与用户的连接,当转发请求时,会解析 Header 信息并添加上用户的 IP 地址(Pod 将只能在连接的另一端看到该 IP 地址)。

TCP 和 SSL 将选择4层代理:ELB 将转发流量,并不修改 Header 信息。

外部 IP

如果外部的 IP 路由到集群中一个或多个 Node 上,Kubernetes Service 会被暴露给这些 externalIPs。 通过外部 IP(作为目的 IP 地址)进入到集群,打到 Service的端口上的流量,将会被路由到 Service 的 Endpoint 上。 externalIPs 不会被 Kubernetes 管理,它属于集群管理员的职责范畴。

根据 Service 的规定,externalIPs 可以同任意的的一个 ServiceType 来一起指定。 在上面的例子中,my-service 可以在 80.11.12.10:80(外部 IP:端口)上被客户端访问。

kind: Service

apiVersion: v1

metadata:

  name: my-service

spec:

  selector:

    app: MyApp

  ports:

    - name: http

      protocol: TCP

      port: 80

      targetPort: 3306

  externalIPs:

- 80.11.12.10

总结:在kubernetes中,Pod是有生命周期的,如果Pod重启IP很有可能会发生变化。如果我们的服务都是将Pod的IP地址写死,Pod的挂掉或者重启,和刚才重启的pod相关联的其他服务将会找不到它所关联的Pod,为了解决这个问题,在kubernetes中定义了service资源对象,Service定义了一个服务访问的入口,客户端通过这个入口即可访问服务背后的应用集群实例,service是一组Pod的逻辑集合,这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector实现的。

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

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

相关文章

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第8套

少儿编程 蓝桥杯青少组计算思维题真题及解析第8套 1、下列哪个选项填到填到下图空缺处最合适 A、 B、 C、 D、 答案:D 考点分析:主要考查小朋友们的观察能力,从给定的图中可以看到,图中的线条都是有实现和虚

【C++ 学习 ⑨】- 万字详解 string 类(上)

目录 一、为什么学习 string 类&#xff1f; 二、标准库中的 string 类 三、C STL容器是什么&#xff1f; 四、string 类的成员函数 4.1 - 构造函数 4.2 - 赋值运算符重载 4.3 - 容量操作 4.4 - 遍历及访问操作 4.4.1 - operator[] 和 at 4.4.2 - 迭代器 4.5 - 修改…

Node.js 使用踩坑

重装电脑后&#xff0c;重装node.js 出现一个问题&#xff1a; npm install 会报错 按提示操作后 而npm run serve 会报xlsx和echart的错误&#xff0c;提示引用不对之类的&#xff0c;但是公司项目固定的&#xff0c;不可以随便改&#xff0c;而且之前是没问题的。 此时需要找…

华为OD机试真题B卷 Java 实现【数组拼接】,附详细解题思路

一、题目描述 现在有多组整数数组&#xff0c;需要将它们合并成一个新的数组。 合并规则&#xff0c;从每个数组里按顺序取出固定长度的内容合并到新的数组中&#xff0c;取完的内容会删除掉&#xff0c;如果该行不足固定长度或者已经为空&#xff0c;则直接取出剩余部分的内…

Anaconda教程,Python版本控制

Anaconda教程,Python版本控制 文章目录 Anaconda教程,Python版本控制1&#xff1a;Anaconda安装1.1&#xff1a;Windows1.2&#xff1a;Linux1.3&#xff1a;MacOS 2&#xff1a;Anaconda使用2.1&#xff1a;创建一个新的环境2.2&#xff1a;安装 Python 包2.3&#xff1a;激活…

hash模式下路由跳转页面不刷新

mode为hash时&#xff0c;纯粹页面&#xff0c;路由跳转过之后跳转上一级重复路由页面不会重新渲染 举个例子&#xff1a;当我在注册页面->注册状态页面->注册页面&#xff0c;在这个期间我从注册状态页面进行缓存的数据想要在注册页面使用&#xff0c;然而注册页面不会…

【YOLO系列】YOLO v5(网络结构图+代码)

文章目录 推理转换onnx网络架构SPP VS SPPFAutoAnchorLoss 参考 【YOLO系列】YOLO v3&#xff08;网络结构图代码&#xff09; 【YOLO 系列】YOLO v4-v5先验知识 【YOLO系列】YOLO v4&#xff08;网络结构图代码&#xff09; 我是在自己笔记本上配置的YOLO v5环境。首先&#x…

饼状图使用属性时,使用驼峰命名法

饼状图是使用D3.js等JavaScript库来绘制的&#xff0c;而JavaScript中的属性名通常采用驼峰式命名法&#xff0c;即第一个单词的首字母小写&#xff0c;后面单词的首字母大写&#xff0c;例如fontSize、fontWeight等。而CSS中的属性名采用连字符命名法&#xff0c;即单词之间用…

Top 5 Best Open Source Projects on GitHub 2023

这里介绍Github上 5 个增长最快的开源项目&#xff0c;它们为原有的解决方案提供了更加具有成本效益的替代方案&#xff0c;并为开发者、数据分析师和企业提供了高可用的工具产品。利用开源的优势&#xff0c;这5个项目拓展了强大而有效的解决方案&#xff0c;是值得收藏、分享…

比ureport好用的报表系统-VeryReport报表系统

随着数据时代的到来&#xff0c;数据成为企业管理和决策的重要依据。然而&#xff0c;在处理海量数据的同时&#xff0c;如何快速准确地生成各种形式的报表却成为了一个痛点。手工制作报表费时费力、容易出错&#xff1b;而传统的报表工具又复杂难用&#xff0c;无法满足不同用…

基于jsp+mysql+Spring+mybatis+Springboot的SpringBoot婚纱影楼摄影预约网站

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…

Linux下快速创建大文件的4种方法总结

1、使用 dd 命令创建大文件 dd 命令用于复制和转换文件&#xff0c;它最常见的用途是创建实时 Linux USB。dd 命令是实际写入硬盘&#xff0c;文件产生的速度取决于硬盘的读写速度&#xff0c;根据文件的大小&#xff0c;该命令将需要一些时间才能完成。 假设我们要创建一个名…

SAP从入门到放弃系列之CRP-part2

标准的生产处理流程如下&#xff1a; 在标准的流程里&#xff0c;MRP为无限产能方式&#xff0c;所以在MRP或者MPS之后&#xff0c;需要进行CRP计算&#xff0c;然后调整。 测试数据准备&#xff1a; 1、参考复制part1文章中的ZW01CRP工作中心复制到新的ZW01CRP2。 2、为物…

springboot 连接 kafka集群(kafka版本 2.13-3.4.0)

springboot 连接 kafka集群 一、环境搭建1.1 springboot 环境1.2 kafka 依赖 二、 kafka 配置类2.1 发布者2.1.1 配置2.1.2 构建发布者类2.1.3 发布消息 2.2 消费者2.2.1 配置2.2.2 构建消费者类2.2.3 进行消息消费 一、环境搭建 1.1 springboot 环境 JDK 11 Maven 3.8.x spr…

SpringCloud Alibaba Nacos--下

SpringCloud Alibaba Nacos-下 Nacos 配置中心实例 示意图 在Nacos Server 加入配置 进入到Nacos Server加入配置&#xff0c; 特别提醒: 文件后缀.yaml 别忘了. Data ID: e-commerce-nacos-config-client-dev.yaml 创建Nacos 配置客户端模块e-commerce-nacos-config-client…

kafka集群报错找不到broker

一、问题描述 某次用户反馈&#xff0c;kafka消费这边消息失败&#xff0c;报错消费者被踢出消费组或broker状态异常无法连接&#xff0c;后实际验证端口确实不通 现场测试验证&#xff0c;报错&#xff1a;报错&#xff1a;Failed to find brokers to send ListGroups……fi…

实战干货,pytest自动化测试-Git中的测试用例运行(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 我们每天写完自动…

httprunner 2.x的基本使用(二)

上一章&#xff1a; httprunner 2.x介绍与使用_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 一、 api 文件夹&#xff08;没有任何数据依赖的场景&#xff09; api 文件夹&#xff1a;执行接口case的最小单元。如果一个接口case&#xff0c;没有任何数据依赖&#xff0…

虚拟ECU实践:汽车发动机控制器仿真

虚拟化技术使得在Windows PC上对汽车ECU&#xff08;Electronic Control Unit&#xff0c;电子控制器单元&#xff09;进行闭环仿真成为可能&#xff0c;能有效改善ECU开发过程。一些开发任务得以从道路、测试平台和HIL&#xff08;Hardware in the Loop&#xff0c;硬件在环&a…

Python入门教程+项目实战-13.3节-集合的快速查找

目录 13.3.1 键的输出顺序 13.4.2 键的数据类型 13.4.3 集合的快速查找 13.4.4 知识要点 13.4.5 系统学习python 13.3.1 键的输出顺序 集合类型的底层实现基于哈希表&#xff0c;键的输出顺序取决于键在哈希表中的存储顺序。 对哈希表结构不是很熟悉的同学&#xff0c;可…