service 2 暴露服务的 3种 方式

news2024/9/20 22:13:40

【k8s 系列】k8s 学习十九,service 2

之前我们简单的了解一下 k8s 中 service 的玩法,今天我们来分享一下 service 涉及到的相关细节,我们开始吧

为什么要有 服务 Service?

因为服务可以做到让外部的客户端不用关心服务器的数量,服务内部有多少个 pod,也可以正常连接到服务器,并可以正常进行业务处理

咱们可以举一个例子,客户端 --> 前端 --> 后台

客户端将流量打到前端的 Service 上,前端的 Service 会将流量给到任意一个 pod 上面,然后 流量进而打到后台服务的 Service 上,最终请求到后台服务的任意 pod 上面

这个时候,客户端无需知道到底是哪个 pod 提供的服务,也无需知道提供 pod 的地址,只需要知道前端服务的 地址和端口即可

新建一个 demo 服务

咱们可以简单些一个 Service 的 yaml 文件,然后部署起来,对于 Service 资源管控哪一些 pod ,我们仍然是使用 标签来进行管控的

例如我们的 minikube 环境中有这样 3 个 标签为 appxmt-kubia 的 pod

我们可以这样写 Service 清单:

kubia-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: xmt-kubia

此处的 selector 选择器,和前面我们说到的 ReplicaSet 的做法是一致的,此处是 Service 暴露一个 80 端口,映射到 pod 的 8080 端口

我们也可以暴露多个端口,但是暴露多个端口的话,必须要写 name ,例如这样

运行 kubectl create -f kubia-service.yaml ,部署一个 Service 资源

kubectl get svc 可以看到如下 svc 的资源列表

可以通过在 pod 内部访问 svc 的 ip 来查看是否可以请求成功

通过命令选中任意 pod,在 pod 中执行 curl 命令,请求 http 接口

kubectl exec kubia-rs-sxgcq -- curl -s 10.106.228.254

果然是可以请求通过的

当然,我们也是可以通过完全进入到 pod 内部,来访问 Service 的地址

kubectl exec -it kubia-rs-sxgcq -- /bin/sh

此处的 Cluster IP意思是集群内部的 IP,只用于在集群内部进行访问的,当前我们创建的服务的目的就是,集群内部的其他 pod ,能够通过访问这个 Service 的 IP 10.106.228.254 来访问 该 Service 管控的一组 pod

通过日志,我们可以看出实际上请求成功了的,我们使用任意一个 pod,来请求 Service,然后 Service 来将流量打到自己管控的一组 pod 中,最终得到响应,可以画个图理解一波

Endpoint

看了上面 Service 和 pod 的关系,给人的感觉是不是 Service 和 pod 好像是直连的,其实并不是这样的,其实 他俩之间还有一个关键的资源,那就是 Endpoint

Endpoints 这个资源就是暴露一个服务的 IP 地址和端口的列表

kubectl get endpoints kubia-service

Endpoints: 172.17.0.6:8080,172.17.0.7:8080,172.17.0.8:8080

如上我们可以看到 Endpoints 暴露了服务的 IP 地址和端口列表

当有客户端连接到服务的时候,服务代理就会选择这些 IP 和 端口 对中的一个发送请求

暴露服务

上面的做法都是在 k8s 集群内部暴露服务的 IP ,**这个 IP 是虚拟 IP ,只能在集群内部访问,**且需要访问对应的端口才行

那么,我们如何暴露服务的端口,供外部的客户端,或者是外部的服务进行调用呢?

类似于这样的请求

关于 Service 资源暴露的方式有如下 3 种:

  • NodePort
  • LoadBalance
  • Ingress

三种方式各有优劣,下面我们来详细的看看

service 之 NodePort

NodePort ,看到命名我们就可以知道是在每个集群节点都会打开一个端口,外部客户端可以访问集群节点的 IP + PORT 就可以访问到我们暴露的服务,进而可以将流量请求到 服务管控的一组任意 pod 上

我们可以看看当前我的实验环境的 service 类型

上述 service 类型都是 Cluster IP 的,因此,我们需要将现有 svc 修改成 NodePort 或者重新创建一个新的 service ,就可以把这里的 TYPE 设置为 NodePort

编写 NodePort 类型的 Service

kubia-service-nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: kubia-svc
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 31200
  selector:
    app: xmt-kubia
  • 编写基本的 NodePort 类型的 Service 资源清单
    • 指定服务类型为 NodePort
    • 注意此处是 ports , 也就是说可以配置多个端口映射,我们也可以暴露多个端口,之前的文章有说到,暴露多个端口的时候,是需要写 name 的,name 记得需要符合 k8s 的命名规范
    • 指定暴露的端口为 31200 (外部客户端通过 IP + 31200 就能够访问到服务管理的一组 pod 的,pod 的端口是 8080)
    • 注意,如果这里不指定 nodePort端口,那么 k8s 会随机分配一个端口,默认端口范围是 30000 - 32767, 我们也可以修改 k8s 默认端口范围,修改位置为:/etc/kubernetes/manifests/kube-apiserver.yaml

运行后查看效果

这个时候,该服务已经暴露了 31200 端口了,我们可以在我们的 window 上通过 telnet ip port 的方式来访问我们这台云服务实验环境,但是请记得在云服务器的防火墙处打开 31200 端口

我们通过外部客户端请求工作节点的 IP + 暴露的 port,是这样的流程:

外部客户端流量从节点的 31200 端口打入,会被重定向到 service 管控的一组任意 pod 上

service 之 LoadBalance

我们可以想一下上面的 NodePort 的方式有什么缺点?

上面暴露了服务的端口,但是我们访问的时候需要指定工作节点的 ip + port,**如果我们指定的工作节点出现了故障,那么外部客户端请求服务就会出现无响应,**除非客户端知道其他正常工作节点的 IP

因此,这个时候,负载均衡器就上场了

创建 LoadBalance 类型的 服务,只需要将上述 NodePort 的资源清单中 type: NodePort 修改成 type: LoadBalance 即可

LoadBalance

LoadBalance 负载均衡器,我们可以放在节点的前面,确保外部客户端发送的请求能够发送到健康的节点上,并且绝对不会将外部的请求发送到状态异常的工作节点上

使用 LoadBalance 之后,上述的流程就变成了这个样子的:

这个时候,对于客户端,只需要访问固定的 IP + port 就可以轻松的访问到健康的工作节点上的 pod 了

service 之 Ingress

现在我们一起来看看暴露服务的第三种方法,使用 ingress 控制器

为什么要有 ingress ?

往上面看,使用 LoadBalance 的时候,LoadBalance 需要一个公网的 IP,且只能提供给一个 Service

那么如果是有多个 Service 的时候,我们就要部署多个 LoadBalance 负载均衡器 了,因此 ingress 就出马了

ingress 可以做什么呢?

ingress 可以做到只需要一个公网 IP,就可以为多个 Service 提供准入和访问,我们可以理解为 ingress 像 nginx 一样通过路由来识别给多个服务的请求

简单流程可以是这个样子的:

这样,使用 ingress 就比使用 LoadBalance 要方便多了,但是具体使用的时候,还是看自己的需求是什么,来选择合适的方式

写一个 ingress 的demo

写 ingress demo 之前,我们先确认我们实验环境中是否开启了 ingress 控制器

minikube addons list

我的环境是开启的,如果没有开启的话,可以执行命令开启 ingress 控制

minikube addons enable ingress

开启时候,我们可以查看到有关于 ingress 的 pod

kubectl get po --all-namespaces

开始创建 ingress 资源

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubia-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: hello.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubia-nodeport-svc
            port:
              number: 80

  • ingress 资源,填写的 apiVersion 为 networking.k8s.io/v1,如果 k8s 是 1.17 之前的,那么 apiVersion 需要填写 extensions/v1beta1
  • ingressClassName: nginx 指定规则会加入到 nginx 中
  • rules ,我们可以看出这个规则是可以添加多条的,这也证明了 ingress 是可以通过多个路由来给多个服务提供访问的

创建 ingress 资源,查看效果

现在,我们就可以在任意客户端(前提是能够访问的通 k8s 这台机器或集群),配置一下本地 host,hello.example.com 指向 ingress 的 ip 即可

配置完成后,客户端可以向 hello.example.com 发起请求了,可以愉快地玩耍

咱最后来看看外部客户端访问 ingress 地址后原理是怎样的?

如上图,我们可以看出,外部客户端访问域名:hello.example.com

  • 外部客户端先去找 DNS 拿到 hello.example.com 对应的 IP(ingress 控制器的 ip)
  • 客户端向 ingress 控制器 发送 http 请求,host 中会带上 域名,ingress 会去查询 该域名对应的服务(找 ingress 资源查),进而找到 endpoint ip 和 port 映射列表
  • 最终 ingress 控制器,直接把流量打到 service 管控的一组任意 pod 上面

这里的流量是 ingress 控制器直接打到 pod 上,而不是通过 service 转发

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【二叉树part09】| 669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 🎈LeetCode669. 修剪二叉搜索树 🎈LeetCode108.将有序数组转换为二叉搜索树 🎈LeetCode538.把二叉搜索树转换为累加树 🎈LeetCode669. 修剪二叉搜索树 链接:669.修剪二叉搜索树 给你二叉搜索树的根节点 root…

使用Go 语言的三个原因

几个星期前,我一个朋友问我:“为什么要关心 Go 语言”? 因为他们知道我热衷于 Go 语言,但他们想知道为什么我认为其他人也应该关心。有三个原因:安全性、生产力和并发性。有些语言可以涵盖一个也有可能是两个方面&…

代码逐行解析!冠军选手解读锂电池生产温度预测赛事方案

Datawhale干货 作者:鱼佬、骆秀韬,Datawhale成员 本实践是数据挖掘类型的比赛,聚焦于工业场景。实践任务本质上为回归任务,其中会涉及到时序预测相关的知识。 本实践可帮助大家: 快速掌握数据挖掘任务基本流程&#x…

【开源-文章迁移利器】MarkDown本地图片转云端存储脚本-支持目录递归查找转换

从一些笔记软件导出markdown文档后,图片都是本地图片,文档数量过多,用typora一一打开上传图片过于繁琐,特开发一个一键迁移文章图片的脚本,方便markdown文档的迁移。 文章目录 大致需求开源地址设计思路脚本介绍快速使…

蓝桥杯专题-真题版含答案-【大衍数列】【圆周率】【分糖果】【等额本金】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

Java csv文件上传下载中的相关转换

目录 一. 需求二. List<Entity>转List<List<String>>2.1 实体类2.2 转换 三. 上传csv文件转List<Map>3.1 csv文件3.2 前台3.3 实体类3.4 转换3.5 效果 一. 需求 &#x1f914;项目中遇到了两个需求 1.查询数据库&#xff0c;得到List<Entity>这…

快速搭建一个美观且易用的 Django 管理后台 —— django-xadmin

Django-xadmin&#xff08;也称为Xadmin&#xff09;是一个第三方的 Django 应用程序&#xff0c;它提供了一系列工具和模板来快速开发基于 Django 的后台管理界面。使用 Django-xadmin 可以用很少的代码就创建出一个强大的、具备实时查看数据、增、删、改等基本操作的 Django …

leetcode-704.二分查找

leetcode-704.二分查找 文章目录 leetcode-704.二分查找一.题目描述二.第1次代码提交(非二分查找)三.第2次代码提交(非二分查找&#xff0c;std::find和std::distance)四.第3次代码提交(二分查找)五.关于C中int型的奇数除以2 一.题目描述 二.第1次代码提交(非二分查找) class …

Linux 学习记录47(QT篇待完成)

Linux 学习记录47(QT篇) 本文目录 Linux 学习记录47(QT篇)一、将资源文件加载到项目1. 将资源文件放到项目下2. 添加到项目 二、信号与槽机制1. 信号与槽机制概念2. 信号与槽概念 三、四、思维导图练习1. main_page.cpp2. main.cpp3. main_page.h4. login.cpp5. login.h 一、将…

Delphi 11必备指南:使用Git集成Python4Delphi的完整步骤

在Delphi中使用Python有很多好处&#xff0c;可以扩展Delphi的功能并利用Python强大的科学计算和数据分析库。但是&#xff0c;为了将Python集成到Delphi中&#xff0c;我们需要安装Python for Delphi (P4D)组件套件。在这篇博客中&#xff0c;我将介绍如何使用Git安装P4D组件套…

N-122基于springboot,vue网上订餐系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术 &#xff1a;VueElementUI 服务端技术&#xff1a;springbootmybatisredis 本系统分用户前台和管理后台两部分&#xff0c;…

python_day3_list

数据容器 &#xff1a; list&#xff08;列表&#xff09; tuple&#xff08;元组&#xff09; str&#xff08;字符串&#xff09; set&#xff08;集合&#xff09; dict&#xff08;字典&#xff09; 列表 list name_list [java, c, python] print(name_list) print(type…

【LeetCode每日一题合集】2023.7.3-2023.7.9

文章目录 2023.7.3——445. 两数相加 II&#xff08;大数相加/高精度加法&#xff09;2023.7.4——2679. 矩阵中的和2023.7.5——2600. K 件物品的最大和&#xff08;贪心&#xff09;代码1——贪心模拟代码2——Java一行 2023.7.6——2178. 拆分成最多数目的正偶数之和&#x…

C. Vampiric Powers, anyone? - 思维+前缀和

分析&#xff1a; 添加新元素的操作可以理解为添加任意一段以n结尾的异或和&#xff0c;当原数组总异或和与新加的元素进行异或又可以得到剩余的前缀的异或和&#xff0c;假设新加的元素的值是i到n的异或和x&#xff0c;那么总异或和sumpre^x&#xff0c;所以sum^xpre&#xff…

Git gui教程---第四篇 Git gui的使用 添加文件,并提交

添加文件&#xff0c;并提交 新建一个txt文件点击扫描重新扫描&#xff0c;未缓存改动多了我们刚刚新建的文件。 点击缓存改动&#xff0c;文件位置变换。 如果缓存选错&#xff0c;想撤销&#xff0c;在菜单栏选择“提交”&#xff0c;“从本次提交撤销”&#xff0c;文件变更…

RocketMQ重置消费位点源码分析

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 最近在使用RocketMQ的重置消费位点的时候经常出现报错&#xff0c;所以就打算研究下RocketMQ是如何重置消费者的消费位点的 RocketMQ版本 5.1.0Dashboard…

基于matlab使用虚幻引擎模拟环境设计激光雷达SLAM算法(附源码)

一、前言 此示例演示如何记录来自 3D 仿真环境的合成激光雷达传感器数据&#xff0c;以及如何使用记录的数据开发同步定位和映射 &#xff08;SLAM&#xff09; 算法。 自动驾驶工具箱在Simulink中集成了虚幻引擎模拟环境。与此仿真环境相关的 Simulink 模块可以在库中找到。…

C++常用库函数——表

文章目录 1、常用数学函数2、常用字符串处理函数3、其他常用函数4、实现键盘和文件输入/输出的成员函数 1、常用数学函数 头文件 #include 或者 #include <math.h> 2、常用字符串处理函数 头文件 #include 或者 #include <string.h> 3、其他常用函数 头文件#i…

电动汽车充电站监控系统设计_kaic

1 绪论 1.1 引言 汽车工业的告诉发展&#xff0c;汽车带来的环境污染、能源短缺、资源枯竭和安全等方面的问题越来越突出。为了保持国民经济的可持续发展&#xff0c;保护人类居住环境和能源供给&#xff0c;各国政府不惜巨资&#xff0c;投入大量人力、物力&#xff0c;寻…

Docker更新后无法启动容器

前提&#xff1a; 由于使用的操作系统版本比较低&#xff0c;centos7.3&#xff0c;准备更新操作系统&#xff0c;随后执行了yum update 操作&#xff0c;结果&#xff0c;docker也从忘记了的某个版本更新到了最新的 24版本&#xff0c;导致使用的容器也没有了&#xff0c;这下…