在 Kubernetes 中 Service 主要有4种不同的类型,其中的 ClusterIP 是最基础的,如下图所示:

当我们创建一个 NodePort 的 Service 时,它也会创建一个 ClusterIP,而如果你创建一个 LoadBalancer,它就会创建一个 NodePort,然后创建一个 ClusterIP

此外我们还需要明白 Service 是指向 pods 的,Service 不是直接指向 Deployments 或 ReplicaSets,而是直接使用 labels 标签指向 Pod,这种方式就提供了极大的灵活性,因为通过什么方式创建的 Pod 其实并不重要。接下来我们通过一个简单的例子开始,我们用不同的 Service 类型来逐步扩展,看看这些 Service 是如何建立的。

No Services

最开始我们没有任何的 Services。

我们有两个节点,一个 Pod,节点有外网(4.4.4.1、4.4.4.2)和内网(1.1.1.1、1.1.1.2)的 IP 地址,pod-python 这个 Pod 只有一个内部的 IP 地址。

现在我们添加第二个名为 pod-nginx 的 Pod,它被调度在 node-1 节点上。在 Kubernetes 中,所有的 Pod 之间都可以通过 Pod 的 IP 进行通信,不管它们运行在哪个节点上。这意味着 pod-nginx 可以使用其内部IP 1.1.1.3 来 ping 和连接 pod-python 这个 Pod。

现在如果 pod-python 挂掉了重新创建了一个新的 pod-python 出来(本文不涉及如何管理和控制 pods),重新分配了一个新的 1.1.1.5 的 Pod IP 地址,这个时候 pod-nginx 就无法再达到 1.1.1.3 这个之前的地址了,为了防止这种情况发生,我们就需要创建一个 Service 服务了!

ClusterIP

和上面同样的场景,但是我们创建了一个名为 service-python 类型为 ClusterIP 的 Service 服务,一个 Service 并不像 Pod 那样运行在一个特定的节点上,这里我们可以假设一个 Service 只是在整个集群内部的内存中可用就可以了。

pod-nginx 可以安全地连接到 1.1.10.1 这个 ClusterIP 或直接通过 dns 名service-python 进行通信,并被重定向到后面一个可用的 Pod 上去。

现在我们来稍微扩展下这个示例,启动3个 python 实例,现在我们来显示所有 Pod 和 Service 内部 IP 地址的端口。

集群内部的所有 Pods 都可以通过 http://1.1.10.1:3000 或者 http://service-python:3000 来访问到后面的 python pods 的443端口。

service-python 这个 Service  是随机或轮询的方式来转发请求的,这个就是 ClusterIP Service 的作用,它通过一个名称和一个 IP 让集群内部的 Pods 可用。

上图中的 service-python 这个 Service 可以用下面的 yaml 文件来创建:

apiVersion: v1
kind: Service
metadata:name: service-python
spec:ports:- port: 3000protocol: TCPtargetPort: 443selector:run: pod-pythontype: ClusterIP

创建后,可以用 kubectl get svc 命令来查看:

NodePort

现在我们想让 ClusterIP Service 可以从集群外部进行访问,为此我们需要把它转换成 NodePort 类型的 Service,在我们的例子中,我们只需要简单修改上面的 service-python 这个 Service 服务即可:

apiVersion: v1
kind: Service
metadata:name: service-python
spec:ports:- port: 3000protocol: TCPtargetPort: 443nodePort: 30080selector:run: pod-pythontype: NodePort

更新完成后,如下图所示:

这意味着我们的内部的 service-python 这个 Service 现在也可以通过30080 端口从每个节点的内部和外部 IP 地址进行访问了。

集群内部的 Pod 也可以通过内网节点 IP 连接到 30080 端口。

运行 kubectl get svc 命令来查看这个 NodePort 的 Service,可以看到同样有一个 ClusterIP,只是类型和额外的节点端口不同。在内部,NodePort 服务仍然像之前的 ClusterIP 服务一样。

LoadBalancer

如果我们希望有一个单独的 IP 地址,将请求分配给所有的外部节点IP(比如使用 round robin),我们就可以使用 LoadBalancer 服务,所以它是建立在 NodePort 服务之上的。

一个 LoadBalancer 服务创建了一个 NodePort 服务,NodePort 服务创建了一个 ClusterIP 服务。我们也只需要将服务类型更改为 LoadBalancer 即可。

apiVersion: v1
kind: Service
metadata:name: service-python
spec:ports:- port: 3000protocol: TCPtargetPort: 443nodePort: 30080selector:run: pod-pythontype: LoadBalancer

LoadBalancer 服务所做的就是创建一个 NodePort 服务,此外,它还会向托管 Kubernetes 集群的提供商发送一条消息,要求设置一个指向所有外部节点 IP 和特定 nodePort 端口的负载均衡器,当然前提条件是要提供商支持。

现在运行 kubectl get svc 可以看到新增了 external-IP 和 LoadBalancer 的类型。

LoadBalancer 服务仍然像和以前一样在节点内部和外部 IP 上打开 30080 端口。

ExternalName

最后是 ExternalName 服务,这个服务和前面的几种类型的服务有点分离。它创建一个内部服务,其端点指向一个 DNS 名。

我们假设 pod-nginx 运行在 Kubernetes 集群中,但是 python api 服务在集群外部。

这里 pod-nginx 这个 Pod 可以直接通过 http://remote.server.url.com 连接到外部的 python api 服务上去,但是如果我们考虑到以后某个时间节点希望把这个 python api 服务集成到 Kubernetes 集群中去,还不希望去更改连接的地址,这个时候我们就可以创建一个 ExternalName 类型的 Service 服务了。

对应的 YAML 资源清单文件如下所示:

kind: Service
apiVersion: v1
metadata:name: service-python
spec:ports:- port: 3000protocol: TCPtargetPort: 443type: ExternalNameexternalName: remote.server.url.com

现在 pod-nginx 就可以很方便地通过 http://service-python:3000 进行通信了,就像使用 ClusterIP 服务一样,当我们决定将 python api 这个服务也迁移到我们 Kubernetes 集群中时,我们只需要将服务改为 ClusterIP 服务,并设置正确的标签即可,其他都不需要更改了。

到这里我们就用 13 张图将 Kubernetes 中的 Service 解释得明明白白清清楚楚真真切切了。
原文链接:https://medium.com/swlh/kubernetes-services-simply-visually-explained-2d84e58d70e5

本文转载自:「K8s 技术圈」,原文:https://tinyurl.com/y5v5hcuk,版权归原作者所有

13 张图带你学懂 Kubernetes Service(转载)相关推荐

  1. 6 张图带你搞懂 Kubernetes 集群中几种常见的流量暴露方案

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! ❝ 作者:KaliArch(薛磊),某 Cloud MSP 服务商产品负责人,熟悉企业级高可用 / 高并发架构,包 ...

  2. 【图解】九张图带你读懂大数据医疗

    文章讲的是[图解]九张图带你读懂大数据医疗,互联网大框架的结构下,互联网+医疗的个性化服务,能给医疗保健工作者和消费者带来哪些真正的福利呢,首先可以提高效益减少废物.增强了预防传染病的能力.对于个人公 ...

  3. 常州和南京计算机工资水平,南京和苏州哪一个城市工资高?六张图带你看懂江苏各市平均工资情况...

    原标题:南京和苏州哪一个城市工资高?六张图带你看懂江苏各市平均工资情况 中商情报网讯:2017年,江苏省城镇非私营单位就业人员年平均工资为78267元,与2016年相比名义增长9.4%.城镇私营单位就 ...

  4. 转载 硬核图解!30张图带你搞懂!路由器,集线器,交换机,网桥,光猫有啥区别?

    硬核图解!30张图带你搞懂!路由器,集线器,交换机,网桥,光猫有啥区别?... 煎鱼(EDDYCJY) 于 2022-01-17 08:51:00 发布 1219 已收藏 22 文章标签: 交换机 网 ...

  5. 推荐一篇微服务硬核文章 6 张图带你搞懂微服务

    我是非典型理科男号主.点击上方蓝字关注. 关注后你可以收获最硬核的知识分享, 最有趣的互联网故事 推荐老王的一篇关于微服务的文章. 通过文章你可以了解到 单体架构到微服务架构的变化,ServiceMe ...

  6. 一张图带你搞懂Javascript原型链关系

    在某天,我听了一个老师的公开课,一张图搞懂了原型链. 老师花两天时间理解.整理的,他讲了两个小时我们当时就听懂了. 今天我把他整理出来,分享给大家.也让我自己巩固加深一下. 就是这张图: 为了更好的图 ...

  7. 40 张图带你搞懂 TCP 和 UDP

    前言 拿下计网协议后,我就是公园里最靓的仔 TCP/IP 基础知识总结 计算机网络基础知识总结 那么下面就开始我们本篇文章,文章组织脉络如下 运输层位于应用层和网络层之间,是 OSI 分层体系中的第四 ...

  8. 「八大排序算法」16张图带你搞懂基数排序

    前言 在排序算法中,大家可能对桶排序.计数排序.基数排序不太了解,不太清楚其算法的思想和流程,也可能看过会过但是很快就忘记了,但是不要紧,幸运的是你看到了本篇文章.本文将通俗易懂的给你讲解基数排序. ...

  9. 一张图带你看懂 ,web前端开发应该知道的HTML5六大趋势

    目前最具人气的前端开发技术框架是什么?移动至上时代的来临促使越来越多的开发者利用HTML5开发移动友好型网站.HTML5的主要优势一直在不断演进,旨在提供足以与原生技术相匹配的功能. 从雷军这样的互联 ...

最新文章

  1. 32拟合分析_SigmaPlot14.5:指导用户逐步完成图形创建和数据分析过程
  2. 如何跨过自学SAP的三道坎
  3. LTP 4.0!单模型完成6项自然语言处理任务
  4. 【机器学习实战】Machine Learning in Action 代码 视频 项目案例
  5. html展示pdf文件流,使用pdfjs提供的viewer.html展示pdf文件流
  6. MySQL 优化 —— EXPLAIN 执行计划详解
  7. 分布式事物一致性设计思路
  8. mysql 1143_ERROR 1143 (42000): SELECT command denied to user
  9. 9-9 原生安装-1
  10. SqlServer常用对象查询
  11. Adobe Flash runtimes路线图
  12. Windows anaconda下载安装
  13. requests.get为什么得到的内容和查看源文件不一样?
  14. python接受键盘输入_Python读取键盘输入的2种方法
  15. AutoGPT保姆级使用教程
  16. 运行时异常和受检查异常的区别
  17. 计算机操作测试题及答案,计算机操作系统期末考试题及答案-
  18. 操作系统_第五章文件管理_磁盘存储空间的管理
  19. 虚拟主机的服务器配置在哪,配置Apache服务器下的虚拟主机设置有什么要求?景安...
  20. AMD R7 5800H安装mac os big sur 11.6

热门文章

  1. python数字字符串乘以2_Python基础(2)_数字和字符串类型
  2. php7.0康乐安装_Ubuntu安装php7.0环境
  3. python目前有多少库文件_必学Python库 你知道多少?
  4. C语言 __STDC__ - C语言零基础入门教程
  5. BugkuCTF-WEB题前女友
  6. 关于c语言的符号常量以下叙述中正确的是,关于C语言的符号常量,以下叙述中正确的是( )...
  7. android paint 线宽_android Paint 设置线宽setStrokeWidth()的单位
  8. 线性表之顺序表与单链表的区别及优缺点
  9. scanf()函数错误把输入缓存里的回车作为一次字符输入
  10. python query方法_Pandas dataframe.query方法语法