Kubernetes的Service详解

一、Service介绍

kubernetes 中, pod 是应用程序的载体,我们可以通过 pod ip 来访问应用程序,但是 pod ip 地址不是固定的,这也就意味着不方便直接采用pod ip 对服务进行访问。
为了解决这个问题,kubernetes 提供了 Service 资源, Service 会对提供同一个服务的多个 pod 进行聚合,并且提供一个统一的入口地址 通过访问Service的入口地址就能访问到后面的pod服务
Service 在很多情况下只是一个概念,真正起作用的其实是 kube-proxy 服务进程,每个 Node 节点上都运行着一个kube-proxy 服务进程。当创建 Service 的时候会通过 api-server etcd 写入创建的 service 的信息,而kube-proxy 会基于监听的机制发现这种 Service 的变动,然后 它会将最新的 Service 信息转换成对 应的访问规则

Service 是 Kubernetes 中用于定义一组 Pod 的逻辑集合及其访问策略的抽象。主要解决以下问题:

  • 服务发现:动态 Pod 环境下,如何找到其他服务。

  • 负载均衡:将流量均匀分发到多个 Pod 实例。

  • 解耦访问:客户端无需关心 Pod 的具体 IP 或节点位置。

  • 稳定访问端点:Pod 可能频繁重建,Service 提供固定访问入口(ClusterIP/DNS)。

二、Service的核心原理

1、kube-proxy:负责实现 Service 的流量转发,支持以下模式:

  • iptables(默认):通过 iptables 规则转发流量。

  • IPVS:高性能模式,基于内核的 IPVS 负载均衡。

  • userspace(已弃用):用户空间代理。

2、Endpoints:Service 通过标签选择器(Selector)动态维护后端 Pod 的 IP 列表(Endpoints 对象)。

3、EndpointSlice:替代 Endpoints 的扩展机制,支持更大规模的服务(分片存储 Endpoint 信息)。

三、Service常见的三种类型

Service的资源清单文件:

kind: Service # 资源类型
apiVersion: v1 # 资源版本
metadata: # 元数据
name: service # 资源名称
namespace: dev # 命名空间
spec: # 描述
selector: # 标签选择器,用于确定当前service代理哪些pod
app: nginx
type: # Service类型,指定service的访问方式
clusterIP: # 虚拟服务的ip地址
sessionAffinity: # session亲和性,支持ClientIP、None两个选项
ports: # 端口信息
- protocol: TCP
port: 3017 # service端口
targetPort: 5003 # pod端口
nodePort: 31122 # 主机端口

实验环境准备:

创建一个deployment.yaml文件,内容如下:

[root@k8s-master test]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: pc-deploymentnamespace: dev
spec:replicas: 3selector:matchLabels:app: nginx-podtemplate:metadata:labels:app: nginx-podspec:containers:- name: nginximage: nginx:1.17.1ports:- containerPort: 80
#创建
[root@k8s-master test]# kubectl create -f deployment.yaml
#查看详情
[root@k8s-master test]# # kubectl get pods -n dev -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
pc-deployment-575f6f4ff-7p8hs   1/1     Running   0          36m   100.125.152.6   k8s-node02   <none>           <none>
pc-deployment-575f6f4ff-lhqj4   1/1     Running   0          36m   100.97.125.7    k8s-node01   <none>           <none>
pc-deployment-575f6f4ff-mvnrp   1/1     Running   0          36m   100.97.125.8    k8s-node01   <none>           <none>#为了后面的测试,修改三台nginx的index.html页面(三台修改的IP地址不一样)
kubectl exec -it pc-deployment-575f6f4ff-7p8hs -n dev /bin/sh
# echo "`hostname`" > /usr/share/nginx/html/index.html

 修改完毕,访问测试:

1、ClusterIP

默认类型,为集群内部提供访问的虚拟 IP仅在集群内可访问

Kubernetes 中 Deployment 仅管理 Pod 副本,需通过 Service 暴露 Pod 服务,否则外部无法访问。

如果写yaml不太熟练的话,可以执行以下命令导入一个文件中:

[root@k8s-master test]# kubectl create service clusterip nginx-svc1 --tcp=80:80 -n dev --dry-run=client -o yaml > service-clusterip.yaml

创建 service-clusterip.yaml 文件:
[root@k8s-master test]# cat service-clusterip.yaml
apiVersion: v1
kind: Service
metadata:name: service-clusteripnamespace: dev
spec:selector:app: nginx-podclusterIP: 10.96.1.100 # service的ip地址,如果不写(删掉),就会默认生成一个IP地址type: ClusterIPports:- port: 80 # Service端口targetPort: 80 # pod端口
# 创建 service
[root@k8s-master test]# kubectl create -f service-clusterip.yaml
service / service-clusterip created
# 查看 service
[root@k8s-master test]# kubectl get svc -n dev -o wide
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service-clusterip   ClusterIP  
10.96.1.100   <none>        80/TCP    2s    app=nginx-pod

2、NodePort

在 ClusterIP 基础上,在每个节点上开放一个静态端口(NodeIP:NodePort)

创建 service-nodeport.yam:
[root@k8s-master test]# cat service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:name: service-nodeportnamespace: dev
spec:selector:app: nginx-podtype: NodePortports:- port: 80 # Service端口nodePort: 30002targetPort: 80 # pod端口

# 创建service
[root@master ~]# kubectl create -f service-nodeport.yaml
service/service-nodeport created
# 查看service
[root@master ~]# kubectl get svc -n dev -o wide
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service-headliness   ClusterIP   None         <none>        80/TCP         9m10s   app=nginx-pod
service-nodeport     NodePort    10.96.1.99   <none>        80:30002/TCP   18s     app=nginx-pod

# 接下来可以通过电脑主机的浏览器去访问集群中任意一个nodeip30002端口,即可访问到pod 

3、LoadBalancer

通过云提供商的负载均衡器(如 AWS ELB、GCP LB)暴露服务到外部。

LoadBalancer和NodePort很相似,目的都是向外部暴露一个端口,区别在于LoadBalancer在集群的外部再来做一个负载均衡设备,而这个设备需要外部环境支持的,外部服务发送到这个设备上的请求,会被设备负载之后转发到集群中。

不分配 ClusterIP,直接访问 Pod 的 IP 或通过 DNS 解析,客户端需要自行实现负载均衡。

 三款开源 Kubernetes 负载均衡器: MetalLB vs PureLB vs OpenELB

apiVersion: v1
kind: Service
metadata:name: my-loadbalancer-service
spec:type: LoadBalancerselector:app: my-appports:- protocol: TCPport: 80targetPort: 8080externalTrafficPolicy: Local  # 保留客户端源 IP(默认是 Cluster)

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

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

相关文章

基于Nvidia Jetson Nano边缘计算设备使用TensorRT部署YOLOv8模型实现目标检测推理

0、背景 最近拿到一台边缘计算设备&#xff0c;在部署YOLO模型的过程中遇到一些问题&#xff0c;特此记录。 设备介绍信息&#xff1a;NVIDIA Jetson Orin Nano T201Developer Kit 开发套件 开发者套件&#xff1a;Jetson Orin Nano T201 8GB开发套件 使用指南文档&#x…

让人感到疑惑的const

const 关键字在不同的编程语言中有着不同的含义和限制&#xff0c;但通常它被用来声明一个常量或只读变量。然而&#xff0c;在 JavaScript 中&#xff0c;const 的行为有时可能会让人感到困惑&#xff0c;因为它并不总是意味着“不可变”&#xff08;immutable&#xff09;。让…

Python 列表全面解析

关于Python列表的详细教程&#xff0c;涵盖增删改查、切片、列表推导式及核心方法 一、 列表基础 1.1 创建列表 列表是Python中最常用的数据结构之一&#xff0c;支持动态存储多种类型的元素。 # 空列表 empty_list []# 初始化列表 numbers [1, 2, 3, 4] fruits ["a…

【Ratis】ReferenceCountedObject接口的作用及参考意义

Apache Ratis的项目源码里,大量用到了自定义的ReferenceCountedObject接口。 本文就来学习一下这个接口的作用,并借鉴一下它解决的问题和实现原理。 功能与作用 ReferenceCountedObject 是一个接口,用于管理对象的引用计数。它的主要功能和作用包括: 引用计数管理: 提供…

leetcode-50.Pow(x,n)

快速计算次方的方法。 首先&#xff0c;先保证n是正数。 如果n<0&#xff0c;就让x取反&#xff0c;n取绝对值。 然后考虑怎么快速乘法。 考虑 x 7 x 1 2 4 x ∗ x 2 ∗ x 4 x^7x^{124}x*x^2*x^4 x7x124x∗x2∗x4&#xff0c;可以发现&#xff0c;本来乘6次x&#xff0…

基于javaweb的SpringBoot公司日常考勤系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

游戏引擎学习第167天

回顾和今天的计划 我们不使用引擎&#xff0c;也不依赖库&#xff0c;只有我们自己和我们的小手指在敲击代码。 今天我们会继续进行一些工作。首先&#xff0c;我们会清理昨天留下的一些问题&#xff0c;这些问题我们当时没有深入探讨。除了这些&#xff0c;我觉得我们在资产…

深度学习框架PyTorch——从入门到精通(5)自动微分

使用torch.autograd自动微分 张量、函数和计算图计算梯度禁用梯度追踪关于计算图的更多信息张量梯度和雅可比乘积 在训练神经网络时&#xff0c;最常用的算法是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;根据损失函数的梯度相对于给定参数进行调整…

以食为药:缓解老人手抖的饮食策略

手抖&#xff0c;在医学上称为震颤&#xff0c;是老年人常见的症状之一。其成因复杂&#xff0c;可能涉及神经系统病变、甲状腺功能异常、药物副作用等。除了积极就医治疗&#xff0c;合理的饮食对于缓解手抖症状、提高老人生活质量具有重要意义。 老人手抖时&#xff0c;身体能…

JUC大揭秘:从ConcurrentHashMap到线程池,玩转Java并发编程!

目录 JUC实现类 ConcurrentHashMap 回顾HashMap ConcurrentHashMap CopyOnWriteArrayList 回顾ArrayList CopyOnWriteArrayList: CopyOnWriteArraySet 辅助类 CountDownLatch 线程池 线程池 线程池优点 ThreadPoolExecutor 构造器各个参数含义&#xff1a; 线程…

C++之list类及模拟实现

目录 list的介绍 list的模拟实现 定义节点 有关遍历的重载运算符 list的操作实现 &#xff08;1&#xff09;构造函数 (2)拷贝构造函数 &#xff08;3&#xff09;赋值运算符重载函数 &#xff08;4&#xff09;析构函数和clear成员函数 &#xff08;5&#xff09;尾…

Elasticsearch 向量检索详解

文章目录 1、向量检索的用途2、适用场景2.1 自然语言处理&#xff08;NLP&#xff09;&#xff1a;2.2 图像搜索&#xff1a;2.3 推荐系统2.4 音视频搜索 3、向量检索的核心概念3.1 向量3.2 相似度计算3.3 向量索引 4、案例&#xff1a;基于文本的语义搜索5、总结 向量检索是 E…

自学软硬件第755 docker容器虚拟化技术

见字如面&#xff0c; 这里是AIGC创意人_竹相左边&#xff0c; 正在通过AI自学软硬件工程师&#xff0c;目标手搓可回收火箭玩具。 我很喜欢 《流浪地球 2》中 &#xff0c;马兆&#xff1a;没有硬件支撑&#xff0c;你破解个屁。 写作背景 今天在剪视频&#xff0c;然后看…

不可不知的分布式数据库-TiDB

不可不知的分布式数据库-TiDB 介绍TiDb架构TiDb与Mysql的区别功能特性性能表现数据可靠性运维管理成本 Docker部署TiDB1. 获取 TiDB 配置文件2. 启动 TiDB 集群3. 连接到 TiDB4. 停止和清理 TiDB 集群注意事项 实用案例TiDB实现分布式事务实现原理实现方式SQL 方式编程方式 注意…

20242817李臻《Linux⾼级编程实践》第四周

20242817李臻《Linux⾼级编程实践》第4周 一、AI对学习内容的总结 第5章 Linux进程管理 5.1 进程基本概念 进程与程序的区别 程序&#xff1a;静态的二进制文件&#xff08;如/bin/ls&#xff09;&#xff0c;存储在磁盘中&#xff0c;不占用运行资源。进程&#xff1a;程…

基于 Prometheus + Grafana 监控微服务和数据库

以下是基于 Prometheus Grafana 监控微服务和数据库的详细指南&#xff0c;包含架构设计、安装配置及验证步骤&#xff1a; 一、整体架构设计 二、监控微服务 1. 微服务指标暴露 Spring Boot 应用&#xff1a; xml <!-- 添加 Micrometer 依赖 --> <dependency>…

使用GoogleNet实现对花数据集的分类预测

使用GoogleNet实现对花数据集的分类预测 1.作者介绍2.关于理论方面的知识介绍2.1GooLeNet的知识介绍2.2CNN发展阶段2.2GooLeNet创新模块 3.关于实验过程的介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1数据集介绍3.2实验过程3.3实验结果 1.作者介绍 王海博, 男 , 西安…

流量密码破解:eBay店铺首页改版后的黄金展示位

流量密码破解&#xff1a;eBay店铺首页改版后的黄金展示位 近年来&#xff0c;跨境电商行业竞争日趋激烈&#xff0c;流量分配机制的调整成为平台卖家最为关注的核心议题之一。作为全球领先的在线电商平台&#xff0c;eBay的每一次页面优化都可能对卖家的经营策略产生深远影响…

从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!

我正在参加Trae「超级体验官」创意实践征文&#xff0c; 本文所使用的 Trae 免费下载链接&#xff1a; www.trae.ai/?utm_source… 前言 大家好&#xff0c;我是小Q&#xff0c;字节跳动近期推出了一款 AI IDE—— Trae&#xff0c;由国人团队开发&#xff0c;并且限时免费体…

Netty:java高性能网络编程的基石(下)

一、Netty是什么&#xff1f;为什么需要它&#xff1f; Netty是一个异步事件驱动的网络应用框架&#xff0c;基于Java NIO技术封装&#xff0c;用于快速开发高性能、高可靠性的网络服务器和客户端程序。作为当前最流行的NIO框架之一&#xff0c;支撑着Dubbo、RocketMQ、Elasti…