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

【Kubernetes】Service 概念与实战

Service 概念与实战

  • 1.通过 Service 向外部暴露 Pod
  • 2.Service 的多端口设置
  • 3.集群内部的 DNS 服务
  • 4.无头 Service

在 Kubernetes 中部署的应用可能对应一个或者多个 Pod,而每个 Pod 又具有独立的 IP 地址。Service(服务)能够为一组功能相同的 Pod 提供统一不变的访问地址,使得集群具有稳定的 IP 地址(即 Cluster IP 地址),从而使在集群内部能够通过该 Cluster IP 地址将客户端请求路由到集群中的一个 Pod 上,从而实现客户端与 Pod 的通信。

Service 是 Kubernetes 中非常重要的组成部分,它主要为集群提供 请求的负载均衡Pod 的自动发现 功能。

Service 主要有以下两个作用:

  • Pod 的自动发现:通过标签 Label 与 Pod 关联,实现与 Pod 的通信。
  • 请求的负载均衡:提供不同的访问策略,以实现访问 Pod 请求的负载均衡。

1.通过 Service 向外部暴露 Pod

创建 Service 与创建应用的 Pod,可以被定义在同一个 YAML 文件中,也可以将它们在不同 YAML 文件中分开定义。下面通过使用两个 YAML 文件来分别定义 Service 和 Pod。

使用 Deployment 控制器来部署应用,创建文件 service-demo1.yaml,并在其中输入以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx name: nginx
spec:replicas: 3 selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginxname: nginximagePullPolicy: IfNotPresent

使用 kubectl apply 命令部署应用。

kubectl apply -f service-demo1.yaml

查看 Pod 的信息。

kubectl get pod -o wide

输出的信息如下:

在这里插入图片描述

创建 Service:编辑文件 service-demo2.yaml,在其中输入以下内容。

apiVersion: v1
kind: Service
metadata:name: service-demo2namespace: default
spec:# 这里使用 NodePort 类型的 Service 将应用程序暴露给外部type: NodePort ports:- name: httpport: 80protocol: TCPtargetPort: 80# 定义标签选择器,将服务 Service 与匹配便签的一组 Pod 关联起来selector:     app: nginx

使用 kubectl apply 命令创建 Service。

kubectl apply -f service-demo2.yaml

查看 Pod、Service 和 Endpoint 的信息。

kubectl get pods,service,endpoints -o wide
kubectl get pods,svc,ep -o wide

输出的信息如下:

在这里插入图片描述

从输出的信息可以看出,在创建 Service 时会自动创建应用的接入点 Endpoint,并将每个 Pod 的 IP 地址自动加入 Endpoint 中。Endpoint 也会自动感知后端 Pod 的 IP 地址,从而实现动态的负载均衡。

🚀 Kubernetes Endpoint 是一个 Kubernetes API 对象,‌它表示一个 Service 的后端集合,用于将流量从 Service 引导到实际运行应用程序的 Pod。‌这个对象包含一组 IP 地址和端口号的列表,‌这些 IP 地址和端口号对应于 Service 后端 Pod 的网络终点。‌当创建一个 Service 时,‌Kubernetes 会自动创建与之关联的 Endpoints 对象,‌并将 Service 的后端 Pod 的 IP 地址和端口号添加到 Endpoints 对象中。‌Endpoints 对象会根据 Service 的选择器自动选择与之关联的 Pod。‌当 Pod 的 IP 地址或端口号发生变化时,‌Kubernetes 会自动更新 Endpoints 对象,‌确保 Service 能够正确路由到后端 Pod。‌通过访问 Service 的 Cluster IP,‌可以从集群内部访问 Service,‌而通过访问 Service 的 Endpoints,‌可以直接访问 Service 的后端 Pod。‌

在这里插入图片描述
🚀 简单来说,‌Kubernetes Endpoint 是 Kubernetes 系统中用于描述 Service 后端 Pod 的网络终点信息的对象,‌它确保了 Service 能够高效地路由到正确的后端 Pod,‌从而实现服务的可用性和可扩展性。‌

在这里插入图片描述

访问任意节点的 31767 端口都可以访问应用。

在这里插入图片描述
在这里插入图片描述

2.Service 的多端口设置

service-demo2.yaml 文件中定义的 Service 只暴露了一个端口,但在很多情况下需要 Service 暴露多个端口,例如同时暴露 HTTP 端口和 HTTPS 端口。Kubernetes 允许在定义 Service 时指定多个端口,但每个端口必须指定一个唯一的名称,以避免产生歧义。

下面是 Kubernetes 官方提供的一个示例。

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: MyAppports:- name: httpprotocol: TCPport: 80targetPort: 9376- name: httpsprotocol: TCPport: 443targetPort: 9377

3.集群内部的 DNS 服务

Service 在实现请求代理和负载均衡时,默认采用的是 Cluster IP 地址。但是 Cluster IP 地址不是永远不变的,因此建议在应用中不要使用 Cluster IP 地址,而使用 Service 的名称。Kubernetes 集群提供的 DNS 服务可以将 Service 的名称解析为 Cluster IP 地址。

下面对 Kubernetes 集群内部的 DNS 服务 进行一个简单的验证。

查看系统命名空间中的 Pod。

kubectl get pods -n kube-system | grep dns

输出的信息如下:

在这里插入图片描述

🚀 在 kube-system 的命名空间中自动启动了 Pod 来运行 DNS 服务。

创建 Service。

kubectl apply -f service-demo2.yaml

输出的信息如下:

在这里插入图片描述

使用 busybox1.28.4 版本创建一个 Pod,并进入 Pod 的内部。

kubectl run -it --image=busybox:1.28.4 --rm --restart=Never sh

busybox 的 Pod 中查找 service-demo2 服务,集群内部的 DNS 服务将返回 Service 的域名信息。

nslookup service-demo2

在这里插入图片描述

这里的 10.100.69.136 就是 Service service-demo2 对应的 Cluster IP。

🚀 nslookup 命令可以从 本地 DNS 服务器 中查看所有的 IP 地址和域名 信息(它就像一本互联网电话簿)。

4.无头 Service

每一个 Service 都会有一个 Service 名称,并最终由 DNS 解析成 Cluster IP 地址。连接到 Service 的客户端最终通过 Cluster IP 地址被转发到后端一个随机选择的 Pod 上。因此,这时客户端并不清楚后端 Pod 的 IP 地址。但是对于一些有状态的客户端来说,需要清楚地知道后端每个 Pod 的 IP 地址才能与其直接进行通信。这时就需要使用无头 Service(Headless Service)。

在这里插入图片描述
无头 Service 的运行机制核心是:去掉了 DNS 解析 Cluster IP 地址这个过程,直接返回后端 Pod 的 IP 地址。

创建部署描述文件 headless-service.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Service
metadata:name: headless-service
spec:selector:name: busybox# 设置为无头服务 Service	clusterIP: Noneports:- name: demo port: 1234targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:name: headless-service-pod-1labels:name: busybox
spec:hostname: headless-service-pod-1containers:- image: busyboxcommand:- sleep- "3600"name: busybox
---
apiVersion: v1
kind: Pod
metadata:name: headless-service-pod-2labels:name: busybox
spec:hostname: headless-service-pod-2containers:- image: busyboxcommand:- sleep- "3600"name: busybox

执行 kubectl apply -f 命令。

kubectl apply -f headless-service.yaml

在这里插入图片描述

查看 Service 和 Pod 的信息。

kubectl get svc,pod -o wide

输出的信息如下:

在这里插入图片描述

🚀 可以看到,service/headless-service 的 Cluster IP 的值是 None(即这是一个无头 Service),在它的后面有两个 Pod,以及每个 Pod 实际的 IP 地址。

使用 kubectl exec 命令进入其中一个 Pod 内部。

kubectl exec pod/headless-service-pod-1 -it /bin/sh

在 Pod 内部查看所使用的 DNS 服务器信息(也可以用 nslookup headless-service 查询)。

more /etc/resolv.conf

输出的信息如下:

在这里插入图片描述

在这里可以看到,使用的 DNS 服务器的 IP 地址是 10.96.0.10

  • search:配置的是集群的域名后缀。
  • nameserver:配置的是 kube-dns 服务的 IP 地址。

那么,这些配置从哪里来的呢?kubelet 的启动的配置文件 --config=/var/lib/kubelet/config.yaml 中有两个参数,分别用于指定域名服务的 IP 和集群域名。kubelet 在创建容器时才可以将这些配置传入进去。

在这里插入图片描述

在宿主机上使用 dig 命令访问无头 Service。

dig @10.96.0.10 headless-service.default.svc.cluster.local

输出的信息如下:

在这里插入图片描述

可以看到,在 ANSWER SECTION 中直接返回了后端两个 Pod 的 IP 地址。

相关文章:

【Kubernetes】Service 概念与实战

Service 概念与实战 1.通过 Service 向外部暴露 Pod2.Service 的多端口设置3.集群内部的 DNS 服务4.无头 Service 在 Kubernetes 中部署的应用可能对应一个或者多个 Pod,而每个 Pod 又具有独立的 IP 地址。Service(服务)能够为一组功能相同的…...

RTSP|RTMP流如何指定坐标位置和分辨率获取RGB数据实时渲染和算法分析

接上一篇blog:同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析-CSDN博客 我们知道,由于解码后的YUV或RGB数据size比较大,如果想把转换后的RGB数据传给比如python算法的话,数据量还是挺大,为此&#xff…...

基于ssm+vue+uniapp的英语学习交流平台小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...

如何判断一个TimerTask是否已经完成

如何判断一个TimerTask是否已经完成 判断TimerTask是否已经完成并不是TimerTask或Timer类直接提供的功能,因为TimerTask一旦被提交给Timer执行,它就在一个独立的线程中运行,而Timer类并不直接提供方法来查询或控制任务的执行状态。 然而&am…...

Android常用面试题

1、如何理解Java的多态?其中,重载和重写有什么区别? 2、谈一下JVM内存区域划分?哪部分是线程公有的,哪部分是私有的? 3、final关键字的用法? 4、死锁是怎么导致的?如何定位死锁 5、数…...

JSON与Jsoncpp库:数据交换的灵活选择

目录 引言 一.JSON简介 二. Jsoncpp库概述 三. Jsoncpp核心类介绍 3.1 Json::Value类 3.2 序列化与反序列化类 四. 实现序列化 五. 实现反序列化 结语 引言 在现代软件开发中,数据交换格式扮演着至关重要的角色。JSON(JavaScript Object Notati…...

salesforce rich text 字段支持html中内嵌JavaScript吗

Salesforce 的富文本字段(Rich Text Field)不支持在 HTML 中内嵌 JavaScript。为了安全,Salesforce 会自动移除或过滤用户输入中的任何 JavaScript 代码。这是为了防止跨站点脚本(XSS)攻击,从而保护 Salesf…...

Ubuntu24.04、22.04或20.04安装Golang方法教程

在Ubuntu Linux(例如 Ubuntu 24.04、22.04 或 20.04)上安装Go(Golang)是一个简单的过程。我们可以使用默认系统存储库使用本教程中给出的命令下载开源 Go 编程语言,轻松构建简单、可靠和高效的软件。 Go语言由Google…...

学习记录第二十二天

time函数与localtime函数 在Linux环境下使用C语言处理时间&#xff0c;通常会涉及到几个重要的头文件和函数。主要的头文件是 <time.h>&#xff0c;它包含了处理时间的各种函数和数据结构。 1. 数据结构 1.time_t: 一个类型定义&#xff0c;用于存储时间值&#xff0c…...

红酒与艺术展览:品味艺术与风味的双重盛宴

当艺术的魅力与红酒的醇香交织在一起&#xff0c;一场别开生面的盛宴便悄然展开。今天&#xff0c;让我们一同走进这场红酒与艺术展览的邂逅&#xff0c;品味艺术与风味的双重盛宴。 一、艺术展览的瑰丽世界 艺术展览&#xff0c;如同一座瑰丽的宝库&#xff0c;汇聚了无数艺…...

1Panel配置

1. 脚本安装 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sh quick_start.sh2. 配置镜像加速 在容器-> 配置中设置&#xff0c;否则安装软件会失败。 https://docker.211678.top https://docker.1panel.live …...

场外期权是如何定价的?场外期权定价的基本原理是什么?

场外期权的定价通常基于多种复杂的因素&#xff0c;以下是一些场外期权主要的影响因素和常见的定价方法&#xff1a; 影响场外期权定价的因素&#xff1a; 标的资产价格&#xff1a;标的资产当前的市场价格是定价的基础。标的资产价格波动率&#xff1a;波动率反映了标的资产价…...

vue中数据持久化

在Vue中&#xff0c;数据持久化通常指的是将Vue组件或应用中的数据保存到用户的浏览器或设备的存储中&#xff0c;以便在用户的会话&#xff08;session&#xff09;或跨会话&#xff08;如重新加载页面或重新打开浏览器&#xff09;中保持这些数据。Vue本身并不直接提供数据持…...

小白零基础学数学建模系列-Day3-线性回归模型的构建与评估

文章目录 1 线性回归基础1.1 线性回归概念与应用1.2 数学原理与推导1.3 线性回归的实现 2 案例分析&#xff1a;房价预测2.1 加载数据2.2 数据预处理2.3 探索性数据分析2.4 观察选择特征2.5 准备训练模型的数据2.6 将数据拆分为训练集和测试集2.7 训练和测试模型2.8 模型评估 3…...

Flutter中的 extended_nested_scroll_view 库:介绍与使用指南

在开发Flutter应用时&#xff0c;处理复杂的滚动效果是一项常见的任务。Flutter提供了NestedScrollView来实现可折叠的应用栏与滚动列表的结合&#xff0c;但在某些情况下&#xff0c;NestedScrollView可能不够强大。为了解决这些问题&#xff0c;我们可以使用extended_nested_…...

Elasticsearch 综合搜索案例解析

Elasticsearch 是一个功能强大的搜索引擎&#xff0c;它不仅支持全文搜索&#xff0c;还提供了排序、分页、高亮显示等多种搜索结果处理功能。通过综合使用这些功能&#xff0c;我们可以构建出丰富而高效的搜索应用。本文将通过一个具体的案例&#xff0c;介绍如何在 Elasticse…...

Web存储革命:揭秘JavaScript的会话存储(sessionStorage)

标题&#xff1a;Web存储革命&#xff1a;揭秘JavaScript的会话存储&#xff08;sessionStorage&#xff09; 在当今的Web开发中&#xff0c;状态管理和数据持久化是构建交互式应用的关键。JavaScript提供了多种客户端存储解决方案&#xff0c;其中会话存储&#xff08;sessio…...

基于python的百度迁徙迁入、迁出数据分析(九)

副标题&#xff1a;从百度迁徙数据看——人口虹吸效应 人口虹吸效应&#xff1a;人口虹吸效应是指大城市或中心城市因其经济、文化、教育、医疗等资源的优势&#xff0c;吸引周边地区的人口、资本和其他资源向其集中的一种现象。这种效应在城市化进程中尤其明显&#xff0c;通…...

2025上海礼品展 华东礼品工艺品展览会

2025第25届上海国际礼品及家居用品展 在璀璨繁华的上海&#xff0c;一场盛大的礼品盛宴即将拉开帷幕。2025年上海国际礼品及 家居用品展览会(简称“华礼展”)&#xff0c;作为华东地区乃至全国范围内备受瞩目的礼 品行业盛会&#xff0c;将于2025年6月29日至7月1日在上海新国…...

Flink开发(一):概述与基础

目录 1. Flink概述 1.1 什么是Flink&#xff1f; 1.2 Flink的主要特点 2. Flink的核心组件 2.1 Flink架构 2.2 数据流模型 3. Flink的基础应用 3.1 开发环境配置 3.3 数据源和数据接收器 4. Flink的高级功能 4.1 状态管理与容错 4.2 窗口操作 5. Flink的应用场景 …...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...