图解Kubernetes的服务(Service)

pod 准备:

不要直接使用和管理Pods:

  • 当使用ReplicaSet水平扩展scale时,Pods可能被terminated
  • 当使用Deployment时,去更新Docker Image Version,旧Pods会被terminated,然后创建新Pods

0 啥是服务(Service)

Kubernetes 中 Service 是 将运行在一个或一组 [Pod]上的网络应用程序公开为网络服务的方法。

Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种不熟悉的服务发现机制。 你可以在 Pod 集合中运行代码,无论该代码是为云原生环境设计的,还是被容器化的老应用。 你可以使用 Service 让一组 Pod 可在网络上访问,这样客户端就能与之交互。

如果你使用 [Deployment]运行应用, Deployment 可动态创建和销毁 Pod。 在任何时刻,你都不知道有多少个这样的 Pod 正在工作以及它们健康与否; 你可能甚至不知道如何辨别健康的 Pod。 Kubernetes Pod 的创建和销毁是为了匹配集群的预期状态。 Pod 是临时资源(你不应期待单个 Pod 可靠又耐用)。

每个 Pod 会获得属于自己的 IP 地址(Kubernetes 期待网络插件来保证这一点)。 对集群中给定的某个 Deployment,这一刻运行的 Pod 集合可能不同于下一刻运行该应用的 Pod 集合。

这就带来问题:若某组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”) 集合提供功能,前端要如何发现并跟踪要连接的 IP 地址,以便其使用负载的后端组件呢?

1 Kubernetes 中的 Service

Service API 是 Kubernetes 的组成部分,它是一种抽象,帮助你将 Pod 集合在网络上公开。 每个 Service 对象定义端点的一个逻辑集合(通常这些端点就是 Pod)以及如何访问到这些 Pod 的策略。

如考虑一个无状态的图像处理后端,其中运行 3 个副本(Replicas)。 这些副本是可互换的 —— 前端不需要关心它们调用的是哪个后端。 即便构成后端集合的实际 Pod 可能会发生变化,前端客户端不应该也没必要知道这些, 而且它们也不必亲自跟踪后端的状态变化。

Service 抽象使这种解耦成为可能。

Service 所对应的 Pod 集合通常由你定义的选择算符来确定。 若想了解定义 Service 端点的其他方式,查阅不带选择算符的 Service。

如果你的工作负载使用 HTTP 通信,你可能选用 Ingress 来控制 Web 流量如何到达该工作负载。Ingress 不是一种 Service,但它可用作集群的入口点。 Ingress 能让你将路由规则整合到同一个资源内,这样你就能将工作负载的多个组件公开出去, 这些组件使用同一个侦听器,但各自独立地运行在集群中。

用于 Kubernetes 的 Gateway API 能够提供 Ingress 和 Service 所不具备的一些额外能力。 Gateway 是使用 CustomResourceDefinitions 实现的一系列扩展 API。 你可以添加 Gateway 到你的集群中,之后就可以使用它们配置如何访问集群中运行的网络服务。

1.1 云原生服务发现

如果你想要在自己的应用中使用 Kubernetes API 进行服务发现,可以查询 APIServer, 寻找匹配的 EndpointSlice 对象。 只要 Service 中的 Pod 集合发生变化,Kubernetes 就会为其更新 EndpointSlice。

对于非本地应用,Kubernetes 提供了在应用和后端 Pod 之间放置网络端口或负载均衡器的方法。

无论采用那种方式,你的负载都可以使用这里的服务发现机制找到希望连接的目标。

对比Spring Cloud

Spring Cloud 中的微服务也通常使用服务名称进行通信,而不需要关心具体的IP地址。这是通过服务发现机制实现的,其中服务注册中心维护了服务名称与实际服务实例的映射关系。

在Spring Cloud中,服务通常会注册到服务注册中心(例如Eureka、Consul等),并且客户端通过服务名称来发现和调用服务,而不是直接使用硬编码的IP地址。这种做法使得微服务的位置可以更加灵活地变化,而不影响客户端的调用方式。

在这方面,Kubernetes 中的 Service 与 Spring Cloud 中的服务注册中心的角色有些相似。Kubernetes Service 提供了一种将一组 Pod 暴露为一个网络服务的机制,通过 Service 名称来访问这组 Pod,而不需要关心具体的 Pod IP 地址。这有助于实现微服务架构中的服务发现和解耦。

因此,无论是在Kubernetes中的Service还是Spring Cloud中的微服务,服务的抽象层级都允许更灵活、可扩展和解耦的服务通信。

2 Service类型

kubectl expoese给我们的pod创建一个Service,供外部访问。

2.1 ClusterIP

默认Service类型,它将Pods公开为k8s集群内部的服务。要创建ClusterIP Service,可用kubectl expose指定–type=ClusterIP。

如myapp Deployment暴露为ClusterIP Service:

kubectl expose deployment myapp --port=80 --target-port=8080 --type=ClusterIP

2.2 NodePort

将Pods公开为k8s集群外部的服务。它会在每个节点上打开一个端口,并将请求转发到后端Pods。

创建NodePort Service,使用kubectl expose命令,并指定–type=NodePort选项。

如将myapp Deployment暴露为NodePort Service:

[root@javaedge-k8s-node-1 ~]#  kubectl expose deployment javaedge-nginx  --port=90 --target-port=80 --type=NodePortservice/javaedge-nginx exposed

这个命令的作用是在 k8s 集群中将名为 javaedge-nginx 的 Deployment 暴露为一个 Service,该 Service 使用 NodePort 类型,并将容器端口 80 映射到 Service 的端口 90。这个命令的完整语法为:

kubectl expose deployment <deployment-name> --port=<service-port> --target-port=<container-port> --type=NodePort

其中,<deployment-name> 是要暴露的 Deployment 的名称,<service-port> 是要创建的 Service 的端口,<container-port> 是要映射到 Service 端口的容器端口,--type=NodePort 表示创建的 Service 类型为 NodePort。

2.3 外部的LoadBalancer

LoadBalancer Service将Pods公开为k8s集群外部的服务,并使用云提供商的公网的负载均衡器(固定的公网ip)来将请求路由到后端Pods。要创建Load Balancer Service,可用kubectl expose命令,并指定–type=LoadBalancer。

如将myapp Deployment暴露为LoadBalancer Service:

kubectl expose deployment myapp --port=80 --target-port=8080 --type=LoadBalancer

这些命令将创建一个名为myapp的Deployment,并将其公开为LoadBalancer Service。

使用LoadBalancer Service,需在云提供商的环境中运行Kubernetes集群,并且需要正确配置云提供商的负载均衡器。也可使用DNS,但需要DNS的add-on。

3 实战

kubectl create -f pod_nginx.yml
kubectl create -f pod_busybox.yml
[root@javaedge-monitor-platform-dev k8s]# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
busybox-pod                         1/1     Running   0          49s     10.244.0.24   minikube   <none>           <none>
nginx-pod                           1/1     Running   0          6s      10.244.0.25   minikube   <none>           <none>
[root@javaedge-monitor-platform-dev k8s]# kubectl expose pods nginx-pod
service/nginx-pod exposed

4 外部的LoadBalancer 模式的缺点

  • LoadBalancer+一个 ip 只能暴露一个服务。若需暴露多个服务,就需要申请多个LoadBalancer加上IP,成本剧增
  • 如果将K8s内部服务直接暴露给外网的客户,就会导致前端和后端耦合

于是,k8s 引入 Ingress。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都国企技术专家兼架构,多家大厂后台研发和架构经验,负责复杂度极高业务系统的模块化、服务化、平台化研发工作。具有丰富带团队经验,深厚人才识别和培养的积累。

参考:

  • 编程严选网

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode:200. 岛屿数量 | DFS 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Low Poly Cartoon House Interiors

400个独特的低多边形预制件的集合,可以轻松创建高质量的室内场景。所有模型都已准备好放入场景中,并使用一个纹理创建,以提高性能!包含演示场景! 模型分类: - 墙壁(79件) - 地板(28块) - 浴室(33个) - 厨房(36件) - 厨房道具(68件) - 房间道具(85件) - 灯具(…

Git LFS 大文件存储

Git 碰到大文件的困境 Git 是业界流行的分布式版本控制工具&#xff0c;本地仓库与远端仓库同样保存了全量的文件和变更历史&#xff0c;这样让代码协作变得简单和高效。但也正因为如此&#xff0c;Git针对大型文件&#xff08;例如图片、视频或其他二进制文件&#xff09;的版…

浅谈智慧路灯安全智能供电方案设计——安科瑞赵嘉敏

摘要: 智慧路灯&#xff0c;作为智慧城市、新基建、城市更新的主要组成部分&#xff0c;近些年在各大城市已得到很好的落地和 应用&#xff0c;但其与传统路灯相比集成大量异元异构电子设备&#xff0c;这些设备的供电电压、接口形式、权属单位各不相同&#xff0c; 如何设计一…

网络高清视频监控平台的告警联动(或报警联动)功能介绍

一、告警联动的定义和概念 视频监控领域的告警联动功能是指通过视频监控平台&#xff0c;将多个相关系统或设备进行集成&#xff0c;实现统一管理和自动化控制。当监控场景中出现异常情况时&#xff0c;系统能够自动触发相应的报警和响应&#xff0c;以保障安全和及时处理异常事…

[算法与数据结构][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

C与Python中的赋值、浅拷贝与深拷贝 写在前面&#xff1a;Python和C中的赋值与深浅拷贝&#xff0c;由于其各自语言特性的问题&#xff0c;在概念和实现上稍微有点差异&#xff0c;本文将这C和Python中的拷贝与赋值放到一起&#xff0c;希望通过对比学习两语言实现上的异同点&a…

test fuzz-04-模糊测试 jazzer Coverage-guided, in-process fuzzing for the JVM

拓展阅读 开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) 开源 Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) test fuzz-01-模糊测试&#xff08;Fuzz Testing&#xff09; test fuzz-…

【Helm 及 Chart 快速入门】02、Helm 基本使用

目录 一、Helm 基本使⽤ 1.1 搜索 chart 应⽤ 1.2 部署 chart 应⽤ 1.3 删除 chart 应⽤ 1.4 定制参数部署应⽤ 1.5 chart 应⽤升级 1.6 chart 应⽤回滚 一、Helm 基本使⽤ 1.1 搜索 chart 应⽤ 使⽤ helm search repo 关键字可以查看相关 charts&#xff1a; […

数据结构之二叉搜索树(Binary Search Tree)

数据结构可视化演示链接&#xff0c;也就是图片演示的网址 系列文章目录 数据结构之AVL Tree 数据结构之B树和B树 数据结构之Radix和Trie 文章目录 系列文章目录示例图定义二叉搜索树满足的条件应用场景 示例图 二叉 线形(顺序插入就变成了线性树&#xff0c;例如插入顺序为&…

安卓逆向某脚本-autojs逆向

引言 上次讲到,为了静态分析,逆向了所有加密字符串。来看下今天我们看下他的流程。 分析app 启动之后会出现一个更新按钮,如图:我们先看下一般autojs 项目是怎么打包的,打包的时候可以选择加密类型,选择dex 类型,然后就是把js 文件变成dex 。 我们先看下一般autojs 项目是…

用html和css实现一个加载页面【究极简单】

要创建一个简单的加载页面&#xff0c;你可以使用 HTML 和 CSS 来设计。以下是一个基本的加载页面示例&#xff1a; HTML 文件 (index.html): <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"…

scVI与MultiVI

scVI&#xff1a;https://docs.scvi-tools.org/en/stable/user_guide/models/scvi.html MultiVI&#xff1a;https://docs.scvi-tools.org/en/stable/user_guide/models/multivi.html 目录 scVI生成推理任务 MultiVI生成推理 scVI single cell variational inference提出了一个…

JVM工作原理与实战(十一):双亲委派机制

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、双亲委派机制 1.双亲委派机制详解 2.父类加载器 3.双亲委派机制的主要作用 二、双亲委派机制常见问题 总结 前言 ​JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字…

【漏洞复现】ActiveMQ文件上传漏洞(CVE-2016-3088)

Nx01 产品简介 Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件。ActiveMQ是消息队列服务&#xff0c;是面向消息中间件&#xff08;MOM&#xff09;的最终实现&#xff0c;它为企业消息传递提供高可用、出色性能、可扩展、稳定和安全保障。 Nx02 漏洞描述 Ap…

Mars3D与mars3d-cesium版本间兼容造成3dtiles和gltf数据处理相关记录

说明&#xff1a; 1.在引入Mars3D SDK后正常可以在F12打印的信息中可以看到Mars3D和Cesium版本信息。 2.在项目的package.json文件中同样可以看到安装后的版本号。 Mars3D对Cesium版本对应关系&#xff1a; 1.正常情况下mars3d依赖的cesium均是最新版本&#xff0c;并且对cesi…

如何将Redis、Zookeeper、Nacos配置为Windows系统的一个服务

说明&#xff1a;当我们在Windows上开发时&#xff0c;不可避免的会用到一些中间件&#xff0c;如Redis、Zookeeper、Nacos等等&#xff0c;当在项目中使用到本地的这些服务器时&#xff0c;我们需要把本地的服务器启动&#xff0c;会开启下面这样的一个窗口。 Redis服务器&am…

npm i sass -D的含义

命令 npm i sass -D 是一个在Node.js项目中使用npm&#xff08;Node Package Manager&#xff09;安装Sass预处理器的命令。这个命令的各个部分含义如下&#xff1a; npm: 这是Node Package Manager的缩写&#xff0c;一个用于Node.js的包管理和分发工具&#xff0c;允许开发者…

78.乐理基础-非常见拍号如何打拍子

内容来源于&#xff1a;三分钟音乐社 上一个内容&#xff1a;76.乐理基础-打拍子-二连音、四连音-CSDN博客 非常见的拍子就是下图中除了红圈里的五个拍号的拍号 最大优先级的规则&#xff1a; 规则一&#xff1a;所有的拍号绝对&#xff0c;永远都可以以一拍为单位&#xff0…

[论文精读]Brain Network Transformer

论文网址&#xff1a;[2210.06681] Brain Network Transformer (arxiv.org) 论文代码&#xff1a;GitHub - Wayfear/BrainNetworkTransformer: The open-source implementation of the NeurIPS 2022 paper Brain Network Transformer. 英文是纯手打的&#xff01;论文原文的s…

001 Golang-channel-practice

最近在练习并发编程。加上最近也在用Golang写代码&#xff0c;所以记录一下练习的题目。 第一道题目是用10个协程打印100条信息&#xff0c;创建10个协程。每个协程都会有自己的编号。每个协程都会被打印10次。 package mainimport ("fmt""strconv" )func …