云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

08|K8s 极简实战(三):如何解决服务发现问题?

你好,我是王炜。
上一节课,我带你认识了 K8s 的几种工作负载,它们包括 Deployment、StatefulSet、DaemonSet、Job 和 CronJob。其中,Deployment 是我们在实际工作中最常用的一种工作负载类型。
现代业务应用发展至今,大部分系统都逐渐发展成为了大型的分布式微服务应用。每一个微服务各司其职,用户的一个请求往往需要由多个微服务之间相互调用才能够完成。当应用迁移到 K8s 时,我们一般会将业务系统中的每一个微服务以某种 K8s 工作负载的形式进行部署,比如最常见的 Deployment。也就是说,在 K8s 环境下,微服务之间的调用可以理解为是工作负载之间的调用。
换句话说,在 K8s 环境下,微服务之间的调用实际上是 Pod 之间的调用。
要让 Pod 之间能够顺利相互调用,我们面临两个重要的挑战:
Pod 之间如何找到对方?
Pod 在重启、更新、销毁的过程中,如何确保 Pod 之间的调用不受影响?
这两个挑战实际上都可以归结为同一个问题,那就是服务发现。这节课,我们就来看看 K8s 原生的服务发现机制:Service
我还是从示例应用出发,重点向你介绍 Service 到底是如何帮助我们解决这两个问题的。Service 在实际的业务场景中出现的频率非常高,在将应用迁移到 K8s 的过程中,你也一定会用到这个对象。所以,我希望你能多花点时间来学习这节课。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在 Kubernetes(K8s)环境下,微服务之间的调用实际上是 Pod 之间的调用,并解决了 Pod 之间的服务发现问题。通过引入 K8s 原生的服务发现机制:Service,实现了一组来自同一个 ReplicaSet 创建的 Pod 组合在一起,并提供 DNS 的访问能力。文章详细介绍了 Service 的工作原理和借助 Endpoints 实现服务发现的方式。通过稳定的 IP 地址能力,访问 Service IP 就相当于访问 Service 所关联的 Pod。此外,还介绍了 Service 域名的使用方式和 Service 的类型。总结来说,本文为读者提供了解决微服务间通信问题的实用方法,为在 K8s 中进行服务发现提供了深入浅出的指导。 在 K8s 环境下,服务之间的调用通过 Pod 之间的调用实现,解决了服务发现问题。通过引入 K8s 原生的服务发现机制:Service,实现了一组来自同一个 ReplicaSet 创建的 Pod 组合在一起,并提供 DNS 的访问能力。文章详细介绍了 Service 的工作原理和借助 Endpoints 实现服务发现的方式。通过稳定的 IP 地址能力,访问 Service IP 就相当于访问 Service 所关联的 Pod。此外,还介绍了 Service 域名的使用方式和 Service 的类型。这为读者提供了解决微服务间通信问题的实用方法,为在 K8s 中进行服务发现提供了深入浅出的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 橙汁
    总会有不知道的东西,用了这么久k8s才知道ExternalName 这样搞数据库或其他服务就可以标准化了 牛逼牛逼

    作者回复: 是的,外部服务调用也可以通过 Service 访问。

    2022-12-26归属地:广东
    2
    6
  • includestdio.h
    通过定义一个无选择符的 headless service ,并自行创建 ep ,通过 ep 将集群外部的数据库与内部的 svc 相关联 apiVersion: v1 kind: Service metadata: name: db namespace: example spec: ports: - port: 3306 targetPort: 3306 --- apiVersion: v1 kind: Endpoints metadata: name: db namespace: example subsets: - addresses: - ip: 10.244.0.1 - ip: 10.244.0.2 - ip: 10.244.0.3 ports: - port: 3306 protocol: TCP

    作者回复: 非常详细,还提到了 headless service 的知识点!

    2022-12-27归属地:广东
    5
  • Service 和 Endpoints 是2种资源,创建之后是怎么进行关联的? 根据2个 声明文件里面的 metadata.name 是否一致?

    作者回复: 是的。

    2022-12-26归属地:广东
    5
  • dva
    apiVersion: v1 kind: Service metadata: name: mysql-svc namespace: example spec: ports: - port: 3306 targetPort: 3306 protocol: TCP name: tcp --- apiVersion: v1 kind: Endpoints metadata: name: mysql-svc namespace: example subsets: - addresses: - ip: 192.168.0.200 ports: - port: 3306 name: tcp # 在 K8S 中的容器使用 mysql-svc.example.svc.cluster.local:3306 就可以访问到 mysql 了。

    作者回复: 正确。

    2022-12-26归属地:广东
    1
  • 潜龙勿用
    请问下dubbo的服务注册与发现如何兼容k8s

    作者回复: 一般做法事在 k8s 上部署 dubbo,然后用它的服务发现,他们功能有重合,所以就不用 K8s 的服务发现了。

    2023-09-19归属地:广东
  • 李多
    我也是,之前没注意过ExternalName。这样一来在一些微服务的配置中,就可以进一步把服务和使用的中间件解耦(将一些中间件服务地址直接用集群访问地址表示),在实际部署的时候通过ExternalName方式让微服务访问其他中间件。

    作者回复: 是的,很好的思路👍🏻

    2023-01-08归属地:广东
  • 烟火不坠
    不知道我理解对了没,应该是这个意思吧。 --- apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 protocol: TCP targetPort: 3306 type: ClusterIP --- apiVersion: v1 kind: Endpoints metadata: name: mysql subsets: - addresses: - ip: 192.168.0.xxx ports: - port: 3306 protocol: TCP

    作者回复: 正确!

    2022-12-26归属地:广东
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部