【云原生kubernetes】k8s service使用详解
一、什么是服务service?
在k8s里面,每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,重启pod的ip地址会发生变化,此时客户如果访问原先的ip地址则会报错 ;
Service (服务)就是用来解决这个问题的, 对外服务的统一入口,防止pod失联,定义一组pod的访问策略(服务发现、负载均衡) ;
一个Service可以看作一组提供相同服务的Pod的对外访问接口,作用于哪些Pod是通过标签选择器来定义的 ,Service是一个概念,主要作用的是节点上的kube-proxy服务进程 ;
举例来说,定义了3个商品微服务,由网关作为统一访问入口, 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。
简而言之,Service 定义的这种抽象能够解耦这种关联;
二、service分类
根据使用场景的不同,service可以分成下面几类
2.1 ClusterIP
默认类型,自动分配一个【仅集群内部】可以访问的虚拟IP
2.2 NodePort
对外访问应用使用,在ClusterIP基础上为Service在每台机器上绑定一个端口,就可以通过: ip+NodePort来访问该服务 ,在之前搭建k8s集群部署nginx的时候我们使用过;
2.3 LoadBalancer(付费方案)
- 使在NodePort的基础上,借助公有云创建一个外部负载均衡器,并将请求转发到NodePort ;
- 可以实现集群外部访问服务的另外一种解决方案,不过并不是所有的k8s集群都会支持,大多是在公有云托管集群中会支持该类型 ;
2.4 ExternalName (使用较少)
把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 Kubernetes 1.7或更高版本的kube-dns才支持。
三、service和pod的关系
service和pod之间是通过 selector.app进行关联的 ,对应到yaml中的核心配置如下:
spec: # 描述selector: # 标签选择器,确定当前service代理控制哪些podapp: test-nginx
yaml 配置模板文件
apiVersion: v1
kind: Service
metadata:creationTimestamp: nullname: test-svc
spec:ports:- port: 80 # service服务端口protocol: TCPtargetPort: 80 # pod端口,常规和容器内部端口一致selector:app: test-nginx-pod
status:loadBalancer: {}
四、Service 之 ClusterIP 使用
ClusterIP 属于service的一种,一般作为集群内部应用互相访问时使用,接下来通过实际演示进行详细的说明;
4.1 在当前目录下,创建一个deploy-nginx-pod.yaml,配置如下
apiVersion: apps/v1
kind: Deployment
metadata:name: congge-deploynamespace: dev
spec:replicas: 3selector: matchLabels:app: congge-nginx-podtemplate:metadata:labels:app: congge-nginx-podspec:containers:- name: congge-nginximage: nginx:1.23.0
使用apply命令创建pod,
kubectl apply -f deploy-nginx-pod.yaml
可以看到,成功创建了一个3副本的pod集群;

4.2 暴露服务为 clusterIP 类型
kubectl expose deploy congge-deploy --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n default
执行成功之后,可以看到创建了一个clusterIP类型的service;

有了这个clusterIp服务之后,后续不管nginx服务扩缩容,还是nginx的pod的IP地址如何变化,外部只需要统一访问这个clusterIP分配的这个IP+端口即可;
4.3 查看服务
多了个类型是ClusterIP的,通过curl clusterIp+port可以访问
kubectl get deployment,pod,svc -n dev -o wide

五、Service 之 NodePort 使用
上面了解到clusterIp这种方式一般作为集群内部各应用访问时使用,但实际业务场景中,有些应用服务需要暴露出去,通过外网去访问,这时候就需要创建NodePort,这个在k8s搭建篇中最后部署nginx的时候有提到;
5.1 关于NodePort
- 常规业务的场景不全是集群内访问,也需要集群外业务访问 ;
- 那么ClusterIP就满足不了了,NodePort是其中的一种实现集群外部访问的方案 ;
- 对外访问应用使用,在ClusterIP基础上为Service在每台机器上绑定一个端口,就可以通过: ip+NodePort来访问该服务 ;
5.2 创建NodePort类型的服务
在上面我们创建了一个基于clusterIp类型的service

使用下面的命令创建一个基于 NodePort 的service
kubectl expose deploy congge-deploy --name=svc-nodeport-nginx1 --type=NodePort --port=80 --target-port=80 -n default
执行完成之后,就多了一个NodePort的service

使用浏览器访问下当前主机的公网IP就可以访问了(master或者node节点都可以访问);

查看服务详情
通过这个命令,可以查看上述创建的NodePort详细信息;
kubectl describe svc svc-nodeport-nginx1 -n default

关于NodePort暴露对外端口说明
Kubeadm部署,暴露端口对外服务,会随机选端口,默认范围是30000~32767,也可以手动修改和指定端口范围
关于Endpoint参数说明
- 是k8s中的一个资源对象,存储在etcd中,记录service对应的所有pod的访问地址 ;
- 里面有个Endpoints列表,就是当前service可以负载到的pod服务入口 ;
- service和pod之间的通信是通过endpoint实现的 ;
可以使用下面的命令查看endpoint列表
kubectl get ep svc-nodeport-nginx1 -n default -o wide

关于Service如何分发请求到后端的多个Pod
Service所处的位置就如同图中展示的,处在客户端和pod之间,这就很像nginx或者其他具备网关的组件的能力了,事实上,也差不多就是我们理解的那样,一个Service的服务背后可能挂载着N多个Pod,那么具体来说,Service如何分发请求到后端的多个Pod的呢?

kubernetes提供了两种负载均衡策略 :
- 默认,kube-proxy的策略,如随机、轮询 ;
- 使用会话保持模式,即同个客户端的请求固定到某个pod,在spec中添加sessionAffinity:ClientIP即可 ;
NodePort 负载均衡机制验证
查看pod信息,显示了上面创建的以congge-deploy开头的3个nginx

其实来说,这也就是对应了3个pod中的3个nginx容器,如果使用curl的方式查看其中某个nginx,可以正常输出nginx欢迎页面的内容;

接下来,我们只需要进入到nginx容器内部,修改下nginx欢迎页的html内容,就可以看出Service的负载均衡效果了;
进入docker容器进行html内容的修改
#进入容器
kubectl exec -it congge-deploy-768455649c-2kv5r -n default /bin/sh
kubectl exec -it congge-deploy-768455649c-mfkbf -n default /bin/sh
kubectl exec -it congge-deploy-768455649c-xlh7s -n default /bin/sh#执行修改
echo "hello this is node1 " > /usr/share/nginx/html/index.html
echo "hello this is node2 " > /usr/share/nginx/html/index.html
echo "hello this is node3 " > /usr/share/nginx/html/index.html
执行过程

接下来使用当前主机节点IP+图中的端口在浏览器访问下

我们连续访问多次,看下返回的内容如何
第一次:

第二次:

当然,可以通过在当前节点上通过curl cluserIP的方式,效果类似

其实也可以查看下当前创建这个SVC的时候默认的配置,使用yaml格式输出一下
kubectl get svc svc-nodeport-nginx1 -n default -o yaml

总结:通过上面的实际操作,在默认情况下,负载均衡为基于随机的这种策略;
相关文章:
【云原生kubernetes】k8s service使用详解
一、什么是服务service? 在k8s里面,每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,重启pod的ip地址会发生变化,此时客户如果访问原先的ip地址则会报错 ; Service (服务)就是用来解决这个问题的…...
Python 数据可视化的 3 大步骤,你知道吗?
Python实现可视化的三个步骤: 确定问题,选择图形转换数据,应用函数参数设置,一目了然 1、首先,要知道我们用哪些库来画图? matplotlib Python中最基本的作图库就是matplotlib,是一个最基础的Python可视…...
CSS基础:盒子模型和浮动
盒子模型 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用 CSS盒模型本质上是一个盒子,封装HTML元素。 它包括:外边距(margin),边框(bord…...
OpenHarmony使用Socket实现一个TCP服务端详解
点击获取BearPi-HM_Nano源码 ,以D4_iot_tcp_server为例: 点击查看:上一篇关于socket udp实现的解析 查看 TCPServerTask 方法实现: static void TCPServerTask(void) {//连接WifiWifiConnect("TP-LINK_65A8",...
kafka监控工具安装和使用
1. KafkaOffsetMonitor 该监控是基于一个jar包的形式运行,部署较为方便。只有监控功能,使用起来也较为安全(1)消费者组列表 (2)查看topic的历史消费信息. (3)每个topic的所有parition列表(topic,pid,offset,logSize,lag,owner) (4)对consumer消费情况进…...
近期工作感悟
从应届生变为社畜已经半年了,在这里吐槽一下自己的所想给自己看。 首先是心理层面上的,初期大大增加的压力。 我觉得应届生能够来到大厂的,基本都是在大学有去规划学习,对自己技能比较认可的。比如我在学校自学游戏开发ÿ…...
大数据框架之Hadoop:HDFS(三)HDFS客户端操作(开发重点)
3.1 HDFS客户端环境准备 1.根据自己电脑的操作系统拷贝对应的编译后的hadoop jar包到非中文路径(例如:D:\javaEnv\hadoop-2.77),如下图所示。 2.配置HADOOP_HOME环境变量,如下图所示。 3&#…...
多模式支持无线监控技术:主动式定位、被动式定位
物联网空间信息与数字技术发展至今,已经催生了一大批优秀的践行者。在日常与商业应用中,室内外定位领域依托于这一技术的发展,更是在近几年风光无限。但是并不是说室内定位与室外定位都已经相当成熟,相对来说,室内定位…...
Cy5 Alkyne,1223357-57-0,花青素Cyanine5炔基,氰基5炔烃
CAS号:1223357-57-0 | 英文名: Cyanine5 alkyne,Cy5 Alkyne | 中文名:花青素CY5炔基CASNumber:1223357-57-0Molecular formula:C35H42ClN3OMolecular weight:556.19Purity:95%Appear…...
【MySQL】MySQL 中 WITH 子句详解:从基础到实战示例
文章目录一、什么是 WITH 子句1. 定义2.用途二、WITH 子句的语法和用法1.语法2.使用示例3.优点三、总结"梦想不会碎,只有被放弃了才会破灭。" "Dreams wont break, only abandoned will shatter."一、什么是 WITH 子句 1. 定义 WITH 子句是 M…...
c/c++开发,无可避免的模板编程实践(篇一)
一、c模板 c开发中,在声明变量、函数、类时,c都会要求使用指定的类型。在实际项目过程中,会发现很多代码除了类型不同之外,其他代码看起来都是相同的,为了实现这些相同功能,我们可能会进行如下设计…...
mulesoft MCIA 破釜沉舟备考 2023.02.13.04
mulesoft MCIA 破釜沉舟备考 2023.02.13.03 1. An integration Mule application consumes and processes a list of rows from a CSV file.2. One of the backend systems involved by the API implementation enforces rate limits on the number of request a particle clie…...
Camtasia2023最新版本新功能及快捷键教程
使用Camtasia,您可以毫不费力地在计算机的显示器上录制专业的活动视频。除了录制视频外,Camtasia还允许您从外部源将高清视频导入到录制中。Camtasia的独特之处在于它可以创建包含可单击链接的交互式视频,以生成适用于教室或工作场所的动态视…...
Fabric磁盘扩容后数据迁移
线上环境原来的磁盘比较小,随着业务数据的增多,磁盘需要扩容,因此需要把原来docker数据转移至新的数据盘。 数据迁移 操作系统: centOS 7 docker默认的数据目录为/var/lib/docker 创建一个新的目录/opt/dockerdata&…...
大厂光环下的功能测试,出去面试自动化一问三不知
在一家公司待久了技术能力反而变弱了,原来的许多知识都会慢慢遗忘,这种情况并不少见。一个京东员工发帖吐槽:感觉在大厂快待废了,出去面试问自己接口环境搭建、pytest测试框架,自己做点工太久都忘记了。平时用的时候搜…...
SATA SSD需要NCQ开启吗?
一、故事开篇最近有同学在咨询,SATA SSD是否需要NCQ功能?借此机会,今天我们来聊聊这个比较古老的话题,关于SATA协议的NCQ的故事。首先我们先回顾下SATA与NCQ的历史:2003年,SATA协议1.0问世,传输…...
知识图谱业务落地技术推荐之图神经网络算法库图计算框架汇总
1.PyTorch Geometric: https://pytorch-geometric.readthedocs.io/en/latest/notes/introduction.html PyG是一个基于PyTorch的用于处理不规则数据(比如图)的库,或者说是一个用于在图等数据上快速实现表征学习的框架。它的运行速度很快,训练模型速度可以达到DGL(Deep Gra…...
==与equals()的区别
与equals()的区别 对于 比较的是值是否相等如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址 对于equals方法 equals方法不能作用于基本数据类型的变量ÿ…...
【人工智能】对贝叶斯网络进行吉布斯采样
问题 现要求通过吉布斯采样方法,利用该网络进行概率推理(计算 P(RT|SF, WT)、P2(CF|WT)的概率值)。 原理 吉布斯采样的核心思想为一维一维地进行采样,采某一个维度的时候固定其他的维度,在本次实验中,假…...
Java 面向对象基础
文章目录一、类和对象1. 类的定义2. 对象的使用二、对象内存图三、成员变量和局部变量四、封装1. private 关键字2. this 关键字五、构造方法六、标准类制作一、类和对象 在此之前,我们先了解两个概念,对象和类。 万物皆对象,客观存在的事物…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...
