Kubernetes 中的服务注册与发现原理分析

这篇具有很好参考价值的文章主要介绍了Kubernetes 中的服务注册与发现原理分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。

对k8s有点了解技术人员,应该都只知道k8s是有服务注册发现的,今天就分析下这个原理,看看怎么实现的。

什么是服务注册与发现

服务注册与发现是一种机制,用于在集群中动态地发现和连接不同的服务,比如我们在开发微服务时,经常使用的EurekaNacos


Service B 把自己注册到 Service Registry 叫做 服务注册

Service A 从 Service Registry 发现 Service B 的节点信息叫做 服务发现

K8s 中为什么需要服务发现

动态性

在K8s集群中,Pod和服务的数量和位置都是动态变化的,Pod有可能伸缩、重新部署或迁移,在这样的环境下,如果硬编码的服务地址是不可行的,所以服务注册与发现使得我们的系统能够自动感知到这种变化。

透明性

服务注册与发现使得我们的系统可以使用服务名称来访问其他服务,而不需要关心具体的IP地址和端口号。

负载均衡

通过服务注册与发现可以实现负载均衡,将请求均匀地分发到多个后端服务实例。

容错性

当服务实例发生故障或不可用时,服务注册与发现可以自动检测并从服务发现机制中移除不可用的实例。这样,请求将被自动路由到可用的实例上,提高应用程序的容错性和可用性。

k8s 服务注册发现原理

基于上面的介绍,我们了解到K8s中的Pod的生命周期是短暂的,他们的IP地址会不断变化,如果让服务消费方去管理这些Pod IP在做负载均衡调用Pod,那么会很复杂,为了对外提供统一的入口来提供服务,所以k8s创建了Service,不管是内部还是外部统一调用 Service,然后再由 Service 转发到后端Pod

Endpoints

Pod 的地址管理则由Endpoints管理,根据Service名称可以查询Endpoints信息,当通过API创建/修改service对象时,endpoints控制器的监听到Service对象,然后根据Service的配置的选择器创建一个endpoints对象,此对象将pod的IP、容器端口信息存储到etcd中。

他们之间关系如下:

同时Endpoints控制器会监听与Pod相关的事件,包括上下线事件,一旦Endpoints控制器接收到这些事件,它会相应地更新Endpoints资源,将不可用的Pod从Endpoints列表中移除。

域名解析

由于Service的 IP有可能会变,如果在代码里面写死Service IP后期维护起来也是比较麻烦的事情,所以通过在创建一个Service时,CoreDNS会为该Service添加一个域名解析记录,将Service的名称解析为相应的Cluster IP地址。这样其他Pod或服务可以通过使用Service名称来访问该Service。

kube-proxy

kube-proxy 是集群中每个节点上运行的网络代理,它负责将集群内部的Service暴露给其他Pod或外部网络。它通过在Node节点上设置网络规则和转发规则,将Service的请求转发到正确的目标Pod

同时kube-proxy实现负载均衡算法,将进入Service的请求均匀地分发到后端的Pod实例。这确保了在多个副本的情况下,Service能够平衡地处理请求,提高可用性和性能。

kube-proxy 通过监听知道了Service、endpoints对象的创建,然后把ServiceCLUSTER-IP 和端口信息拿出来,创建iptables NAT规则做转发或通过ipvs模块创建VS服务器,这样经过CLUSTER-IP的流量都被转发到后端pod。


当Service的目标Pod位于同一节点上时,kube-proxy会将请求直接转发到该节点上的Pod,而不会跨节点转发。这种情况下,请求不会被发送到其他节点上。

然而,如果Service的目标Pod分布在多个节点上,kube-proxy可以通过负载均衡算法将请求转发到其他节点上的Pod。

示例演示

下面我们基于两个配置文件,验证下上面的结论

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: mirrorgooglecontainers/serve_hostname
        ports:
        - containerPort: 80

serve_hostname是k8s官方提供的debug镜像,返回hostname的web server,访问pod时会返回hostname。

nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
    - name: service-port
      port: 80
      protocol: TCP
      targetPort: 9376
  selector:
    app: nginx
  type: ClusterIP

可以看到service 的selector属性指定了app: nginx,这样就能匹配 deplyment 中定义的 nginx pod

我们依次执行以上两个文件,最后获取到信息如下

Service地址查看

kubectl get svc nginx-service

Pod信息查看

 kubectl get pods -l app=nginx -o wide

Endpoints信息查看

根据service名称查询

kubectl get ep nginx-service

CoreDNS信息验证

登录任意Pod,执行ping命令,可以看到根据Service 名称解析到了Service cluster ip

负载均衡验证

登录任意 pod,执行curl nginx-service,请求 service的 80 端口,会返回目标 pod名称

以上我们讲了什么是服务发现,以及 k8s 的服务发现是怎么实现的,希望对你有所帮助。文章来源地址https://www.toymoban.com/news/detail-747594.html

到了这里,关于Kubernetes 中的服务注册与发现原理分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Cloud服务发现与注册的原理与实现

    服务发现是指在一个分布式系统中,服务提供者将自己注册到系统中心,并且服务消费者可以从系统中心查询所有可用的服务的过程。 通过服务发现,服务消费者可以方便地获取可用的服务实例,而无需了解服务实例的具体位置和部署情况。同时,服务提供者也可以方便地将

    2024年02月10日
    浏览(53)
  • 【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现

    在微服务架构中,服务的注册与发现是至关重要的一环。为了实现这一目标,Eureka 注册中心应运而生。在本篇文章中,我们将深入理解 Eureka 注册中心的原理,以及探讨服务的注册与发现机制。 在微服务的协作中,服务之间的远程调用是常见的需求。然而,使用传统的 Rest

    2024年02月08日
    浏览(59)
  • 【Spring Cloud】深入探索 Nacos 注册中心的原理,服务的注册与发现,服务分层模型,负载均衡策略,微服务的权重设置,环境隔离

    在微服务架构中,服务注册中心是整个体系中的关键组件之一。它负责服务的注册、发现和管理,为微服务之间的通信提供了基础设施。在这方面,Nacos(Namespace Aware Clustered Object Storage)作为一种服务发现和配置管理系统,提供了丰富的功能,旨在简化微服务架构中的服务注

    2024年02月06日
    浏览(210)
  • Spring Boot如何实现分布式系统中的服务发现和注册?

    随着互联网的快速发展,越来越多的企业开始将自己的业务迁移到分布式系统中。在这种情况下,服务发现和注册变得尤为重要。对于分布式系统中的每个服务来说,它需要知道其他服务的位置和状态,这样才能进行通信和协作。Spring Boot提供了一些工具和框架,可以帮助我

    2024年02月07日
    浏览(39)
  • Spring Boot 中的服务注册是什么,原理,如何使用

    Spring Boot 是一个非常流行的 Java 后端框架,它提供了许多便捷的功能和工具,使得开发者可以更加高效地开发微服务应用。其中,服务注册是 Spring Boot 微服务架构中非常重要的一环。在本文中,我们将深入探讨 Spring Boot 中的服务注册是什么,原理以及如何使用。 服务注册是

    2024年02月12日
    浏览(48)
  • Nacos 注册中心的设计原理:让你的应用轻松实现高效注册与发现!

    当应用开始脱离单机运行和访问时,服务发现就诞生了。目前的网络架构是每个主机都有⼀个独立的 IP 地址,服务发现基本都是通过某种方式获取到服务所部署的 IP 地址。 DNS 协议是最早将⼀个网络名称翻译为网络 IP 的协议,在最初的架构选型中,DNS+LVS+Nginx 基本满足所有

    2024年02月10日
    浏览(58)
  • 服务注册与服务发现

    Eureka客户端:使用了@EnableEurekaClient注解的应用服务,如订单服务等,甚至Eureka本身也是一个客户端 Eureka服务端:使用了@EnableEurekaServer注解的应用服务,该服务提供了注册表以及对服务节点的操作 服务提供者:服务启动后,可以向注册中心发起register请求,将服务信息注册进

    2024年02月09日
    浏览(39)
  • eureka服务注册和服务发现

    我们要在orderservice中根据查询到的userId来查询user,将user信息封装到查询到的order中。 一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端

    2024年02月10日
    浏览(37)
  • 服务注册发现_搭建单机Eureka注册中心

    创建cloud-eureka-server7001模块 pom添加依赖 写yml文件 主启动类 测试 访问浏览器localhostL:7001 参数: Environment: 环境,默认为test,该参数在实际使用过程中,可以不用更改 Data center: 数据中心,使用的是默认的是 “MyOwn” Current time:当前的系统时间 Uptime:已经运行了多少时间

    2024年02月07日
    浏览(44)
  • Nacos:服务的注册、发现和配置中心(注册篇)

    Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 N

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包