当前位置: 首页 > news >正文

k8s入门到实战--跨服务调用

81a91bcdbd99c17b10e903591accf1c7.png

service.png

背景

在做传统业务开发的时候,当我们的服务提供方有多个实例时,往往我们需要将对方的服务列表保存在本地,然后采用一定的算法进行调用;当服务提供方的列表变化时还得及时通知调用方。

student:  url:     - 192.168.1.1:8081     - 192.168.1.2:8081

这样自然是对双方都带来不少的负担,所以后续推出的服务调用框架都会想办法解决这个问题。

spring cloud 为例:26f228910631dccb1621220019e4f685.png

服务提供方会向一个服务注册中心注册自己的服务(名称、IP等信息),客户端每次调用的时候会向服务注册中心获取一个节点信息,然后发起调用。

但当我们切换到 k8s 后,这些基础设施都交给了 k8s 处理了,所以 k8s 自然得有一个组件来解决服务注册和调用的问题。

也就是我们今天重点介绍的 service

service

在介绍 service 之前我先调整了源码:

func main() {  http.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {  name, _ := os.Hostname()  log.Printf("%s ping", name)  fmt.Fprint(w, "pong")  })  http.HandleFunc("/service", func(w http.ResponseWriter, r *http.Request) {  resp, err := http.Get("http://k8s-combat-service:8081/ping")  if err != nil {  log.Println(err)  fmt.Fprint(w, err)  return  }  fmt.Fprint(w, resp.Status)  })  http.ListenAndServe(":8081", nil)  
}

新增了一个 /service 的接口,这个接口会通过 service 的方式调用服务提供者的服务,然后重新打包。

make docker

同时也新增了一个 deployment-service.yaml:

apiVersion: apps/v1  
kind: Deployment  
metadata:  labels:  app: k8s-combat-service # 通过标签选择关联  name: k8s-combat-service  
spec:  replicas: 1  selector:  matchLabels:  app: k8s-combat-service  template:  metadata:  labels:  app: k8s-combat-service  spec:  containers:  - name: k8s-combat-service  image: crossoverjie/k8s-combat:v1  imagePullPolicy: Always  resources:  limits:  cpu: "1"  memory: 100Mi  requests:  cpu: "0.1"  memory: 10Mi  
---  
apiVersion: v1  
kind: Service  
metadata:  name: k8s-combat-service  
spec:  selector:  app: k8s-combat-service # 通过标签选择关联  type: ClusterIP  ports:  - port: 8081        # 本 Service 的端口  targetPort: 8081  # 容器端口  name: app

使用相同的镜像部署一个新的 deployment,名称为 k8s-combat-service,重点是新增了一个kind: Service 的对象。

这个就是用于声明 service 的组件,在这个组件中也是使用 selector 标签和 deployment 进行了关联。

也就是说这个 service 用于服务于名称等于 k8s-combat-servicedeployment

下面的两个端口也很好理解,一个是代理的端口, 另一个是  service 自身提供出去的端口。

至于 type: ClusterIP 是用于声明不同类型的 service,除此之外的类型还有:

  • NodePort

  • LoadBalancer

  • ExternalName等类型,默认是 ClusterIP,现在不用纠结这几种类型的作用,后续我们在讲到 Ingress 的时候会具体介绍。

负载测试

我们先分别将这两个 deployment 部署好:

k apply -f deployment/deployment.yaml
k apply -f deployment/deployment-service.yaml❯ k get pod
NAME                                  READY   STATUS    RESTARTS   AGE
k8s-combat-7867bfb596-67p5m           1/1     Running   0          3h22m
k8s-combat-service-5b77f59bf7-zpqwt   1/1     Running   0          3h22m

由于我新增了一个 /service 的接口,用于在 k8s-combat 中通过 service 调用 k8s-combat-service 的接口。

resp, err := http.Get("http://k8s-combat-service:8081/ping")

其中 k8s-combat-service 服务的域名就是他的服务名称。

如果是跨 namespace 调用时,需要指定一个完整名称,在后续的章节会演示。

我们整个的调用流程如下:be0d1f7a297a06817b9e2db5097566ba.png

相信大家也看得出来相对于 spring cloud 这类微服务框架提供的客户端负载方式,service 是一种服务端负载,有点类似于 Nginx 的反向代理。

为了更直观的验证这个流程,此时我将 k8s-combat-service 的副本数增加到 2:

spec:  replicas: 2

只需要再次执行:

❯ k apply -f deployment/deployment-service.yaml
deployment.apps/k8s-combat-service configured
service/k8s-combat-service unchanged
7811344347407049cfbb190233d03163.png
image.png

不管我们对 deployment 的做了什么变更,都只需要 apply 这个 yaml  文件即可, k8s 会自动将当前的 deployment 调整为我们预期的状态(比如这里的副本数量增加为 2);这也就是 k8s 中常说的声明式 API

可以看到此时 k8s-combat-service 的副本数已经变为两个了。如果我们此时查看这个 service 的描述时:

❯ k describe svc k8s-combat-service |grep Endpoints
Endpoints:         192.168.130.133:8081,192.168.130.29:8081

会发现它已经代理了这两个 Pod 的 IP。

b78eba6a65f24e5a1fb6e5e7dd17e499.png此时我进入了 k8s-combat-7867bfb596-67p5m 的容器:

k exec -it k8s-combat-7867bfb596-67p5m bash
curl http://127.0.0.1:8081/service

并执行两次 /service 接口,发现请求会轮训进入 k8s-combat-service 的代理的 IP 中。

由于 k8s service 是基于 TCP/UDP 的四层负载,所以在 http1.1  中是可以做到请求级的负载均衡,但如果是类似于 gRPC 这类长链接就无法做到请求级的负载均衡。

换句话说 service 只支持连接级别的负载。

如果要支持 gRPC,就得使用 Istio 这类服务网格,相关内容会在后续章节详解。

总结

总的来说 k8s service 提供了简易的服务注册发现和负载均衡功能,当我们只提供 http 服务时是完全够用的。

相关的源码和 yaml 资源文件都存在这里: https://github.com/crossoverJie/k8s-combat

往期视频:

往期推荐

k8s 入门到实战--部署应用到 k8s

使用 SQL 的方式查询消息队列数据以及踩坑指南

VictoriaLogs:一款超低占用的 ElasticSearch 替代方案

k8s 常见面试题

新手如何快速参与开源项目

鼓励一下

c3195d45c9e0cbb653dae4483674b71c.gif

赞完再走

相关文章:

k8s入门到实战--跨服务调用

service.png 背景 在做传统业务开发的时候,当我们的服务提供方有多个实例时,往往我们需要将对方的服务列表保存在本地,然后采用一定的算法进行调用;当服务提供方的列表变化时还得及时通知调用方。 student: url: - 192.168.1…...

小程序中使用分包

前言 小程序在未使用的分包的情况下仅支持大小为2M,如果图片等资源过多的情况下可以使用分包功能,使用分包的情况下单个分包大小不能超过2M,总大小不能超过20M,分包有两种情况:普通分包和独立分包,下面介绍的是普通分包。官方文档…...

python官方标准库

文章目录 1. 标准库2. Python标准库介绍3. 示例 1. 标准库 https://docs.python.org/zh-cn/3/library/ https://pypi.org/ 2. Python标准库介绍 Python 语言参考手册 描述了 Python 语言的具体语法和语义,这份库参考则介绍了与 Python 一同发行的标准库。它还描…...

Python Opencv实践 - 霍夫圆检测(Hough Circles)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/steelpipes.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#转为二值图 gray cv.cvtColor(img, cv.COLOR_BGR2GRAY) plt.imshow(gray, cmap plt.cm.gray…...

异步请求库的实际应用案例:爬取豆瓣经典电影

在日常爬虫过程中,你有没有遇到过需要爬取大量数据的情况,但是传统的同步请求方式让您等得焦头烂额? 这个问题的根源在于传统的同步请求方式。当我们使用同步请求时,程序会一直等待服务器的响应,直到数据返回后才能继续…...

数据结构学习系列之两个单向链表的合并

两个单向链表的合并:创建两个单向链表p1和p2,合并p1和p2即可,代码如下:示例代码: int merge_2_link_list(node_t *p1,node_t **p2){if(NULL p1 || NULL p2 || NULL *p2){printf("入参合理性检查\n");ret…...

java网络编程,套接字socket

目录 一 网络概述 二 网络的类型分类 三 网络体系结构 四 网络通信协议概述 五 网络通信协议种类 六 Socket简介 七 Socket路径 八 java网络编程三要素 九 基于UDP协议的Socket编程 十 基于TCP协议的Socket编程 十一 基于TCP协议和UDP的区别 一 网络概述 多台相互连…...

一日一技:Python如何同时调用多个GPT的API?

相信很多同学或多或少都在Python中使用过GPT API,通过Python安装openai库,来调用GPT模型。 OpenAI官方文档中给出了一个示例,如下图所示: OpenAI API 测试 如果你只有一个API账号,那么你可能不觉得这样写有什么问题。…...

【云原生】Docker环境安装

文章目录 一、安装准备1、前提条件2、查看系统内核3、查看已安装的CentOS版本信息 二、CentOS7安装docker1、安装需要的软件包2、设置docker下载镜像3、更新yum软件包索引4、安装docker ce5、启动docker6、版本验证7、设置开机启动 三、卸载 Docker 是一个开源的应用容器引擎&a…...

56、springboot ------ RESTful服务及RESTful接口设计

★ RESTful服务 RESTful服务是“前后端分离”架构中的主要功能&#xff1a; 后端应用对外暴露RESTful服务&#xff0c;前端应用则通过RESTful服务与后端应用交互。后端应用 RESTful接口 <------------------> 前端★ 基于JSON的RESTful服务 使用RestController注解…...

sysmonitor如何使用

Sysmonitor是一个系统监控工具&#xff0c;可以监视系统资源的使用情况&#xff0c;如CPU、内存、磁盘、网络等。以下是使用Sysmonitor的步骤&#xff1a; 打开终端或命令行界面&#xff0c;输入以下命令安装Sysmonitor&#xff1a; sudo apt-get install sysmonitor安装完成…...

视频监控/视频汇聚/安防视频监控平台EasyCVR如何将默认快照的raw格式改为jpg/base64格式?

视频监控/视频汇聚/安防视频监控平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频云存储EasyCVR平台能在复…...

QRCode.js生成的二维码水平居中的解决方案

在使用qrcode.js库生成二维码&#xff0c;并希望生成的二维码能够在其容器中居中。 以下是一个简单的例子&#xff0c;它展示了如何使用qrcode.js生成二维码&#xff0c;并通过CSS将其居中&#xff1a; HTML代码 <div id"qrcode-container"><div id"…...

在Cisco设备上配置接口速度和双工

默认情况下&#xff0c;思科交换机将自动协商速度和双工设置。将设备&#xff08;交换机、路由器或工作站&#xff09;连接到 Cisco 交换机上的端口时&#xff0c;将发生协商过程&#xff0c;设备将就传输参数达成一致&#xff0c;当今的大多数网络适配器都支持此功能。 在本文…...

增益带宽积GBW

增益带宽积GBW 增益带宽积是指放大电路在单位增益下的工作频率范围&#xff0c;通常用于描述放大器的高低频特性。增益带宽积越大表示放大器能够传输更高的频率信号而不降低增益。 1.增益带宽积的概念 增益带宽积是指在放大器的这样一个频带内&#xff0c;其实际的电压增益值等…...

二分搜索树节点的查找(Java 实例代码)

目录 二分搜索树节点的查找 Java 实例代码 src/runoob/binary/BinarySearchTreeSearch.java 文件代码&#xff1a; 二分搜索树节点的查找 二分搜索树没有下标, 所以针对二分搜索树的查找操作, 这里定义一个 contain 方法, 判断二分搜索树是否包含某个元素, 返回一个布尔型变…...

2.9 PE结构:重建导入表结构

脱壳修复是指在进行加壳保护后的二进制程序脱壳操作后&#xff0c;由于加壳操作的不同&#xff0c;有些程序的导入表可能会受到影响&#xff0c;导致脱壳后程序无法正常运行。因此&#xff0c;需要进行修复操作&#xff0c;将脱壳前的导入表覆盖到脱壳后的程序中&#xff0c;以…...

MybatisPlus插件功能详细介绍 自动分页 通用分页实体

本课程全面讲解了Mybatis框架的使用&#xff0c;从快速入门到原理分析再到实战应用。每一个知识点都有案例进行演示学习&#xff0c;最终通过学习你将全面掌握&#xff0c;从而使Mybatis的开发更加的高效&#xff0c;系统学习 通过项目的开发大家应该能发现&#xff0c;单表的C…...

ES kibana 创建索引快速脚本

删除 DELETE my_test创建索引 创建自定义ngram分词器 PUT my_test {"settings": {"index.max_ngram_diff": "32","analysis": {"analyzer": {"code_analyzer": {"tokenizer": "code_tokenizer&q…...

2023年09月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2023年09月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...