k8s中service对象

news2024/11/15 21:48:02

文章目录

  • 一、Service
    • 简介
    • Service和kube-proxy的作用与区别
      • Service的工作过程
      • kube-proxy的工作过程
      • 总结
  • 二、具体实践
    • ClusterIP
      • ClusterIP 基本概念
      • 应用场景
    • NodePort
      • NodePort 简介
      • 应用场景
    • ExternalName
      • 简介
      • 应用场景


一、Service

简介

Kubernetes (k8s) 中的 Service 对象是一种抽象,它定义了一组 Pod 的逻辑集合和访问它们的策略。Service 为 Pod 提供了一个稳定的网络端点,使得其他 Pod 或外部客户端可以可靠地访问这些 Pod,即使 Pod 的 IP 地址可能会发生变化。
Service的关键概念和特征:

  1. 稳定性和发现:尽管Pod的IP地址可能会因为重启或者扩缩容而变化,但是Service的虚拟IP(ClusterIP)保持稳定,提升了服务发现的稳定性。

  2. 选择器 (Selector):Service通常使用标签选择器来选择需要暴露的Pod集合。这允许动态更新后台Pod集群,而无需手动维护Pod列表。

Service的关键概念和特征:

  1. 服务发现:Service 为一组 Pod 提供一个统一的访问点(通常是 DNS 名称),使得其他组件可以轻松发现和访问这些 Pod。
  2. 负载均衡:当多个 Pod 提供相同的服务时,Service 可以自动在这些 Pod 之间进行负载均衡。
  3. 稳定的网络地址:Service 提供一个稳定的 IP 地址和端口,即使底层 Pod 发生变化,这个地址也保持不变。
  4. 抽象底层实现:Service 使得应用程序可以不必关心具体的 Pod IP 地址,只需要知道 Service 的名称即可。
  5. 支持多种类型:Kubernetes 支持多种类型的 Service,包括 ClusterIP、NodePort、LoadBalancer 和 ExternalName。

Service 的主要类型:

  1. ClusterIP(默认):为 Service 分配一个集群内部的 IP 地址,只能在集群内部访问。
  2. NodePort:在 ClusterIP 的基础上,为 Service 在每个节点上分配一个端口,可以通过 <NodeIP>:<NodePort> 从集群外部访问服务。
  3. LoadBalancer:在 NodePort 的基础上,使用云提供商的负载均衡器,将流量转发到 <NodeIP>:<NodePort>。(公有云使用)
  4. ExternalName:将服务映射到一个外部的 DNS 名称。

Service和kube-proxy的作用与区别

Kubernetes中的Service和kube-proxy都是与网络流量管理密切相关的组件,但它们的功能和工作机制有很大的不同。

Service的工作过程

  1. Service定义:服务在Kubernetes中通过YAML或JSON格式的配置文件来定义。配置文件中通常包括服务的类型(如ClusterIP、NodePort、LoadBalancer)、端口信息、标签选择器等。

  2. 选择Pod:Service根据定义的标签选择器(Selector)来识别需要暴露的Pod。Kubernetes通过这些选择器将流量转发到匹配的Pod。

  3. Endpoints创建:一旦Service被创建或更新,Kubernetes会创建或更新一个Endpoints对象,其中包含当前符合选择条件的Pod的IP和端口。

  4. 流量路由:每个Service都有一个稳定的虚拟IP(ClusterIP),集群内部的请求通过这个IP进入,然后根据Endpoints信息进行内部负载均衡,将流量路由到合适的Pod。

  5. 服务类型扩展

    • ClusterIP:默认类型,仅在集群内部访问。
    • NodePort:通过集群中每个节点的同一端口暴露服务,使得服务可以从外部访问。
    • LoadBalancer:利用云提供商的负载均衡器在外部直接暴露服务。
    • ExternalName:将服务映射到外部DNS名称。

kube-proxy的工作过程

kube-proxy是Kubernetes中的网络代理,它在每个节点上运行,用于实现Kubernetes服务抽象的流量路由。它的工作过程包括:

  1. 监听API服务器:kube-proxy持续监听API服务器,以获取所有Service和Endpoints的最新信息。当这些对象发生变化时,kube-proxy会相应地更新自身的配置。

  2. 网络规则管理:根据服务规则和对应的Endpoints,kube-proxy在节点上设置网络规则。这些规则负责拦截经过的请求并将其转发到适当的Pod。

  3. 实现机制

    • iptables模式(传统):kube-proxy使用iptables为每个Service生成规则。规则通过NAT(网络地址转换)将请求从Service IP和端口重定向到Pod的IP和端口。
    • IPVS模式(更现代):使用Linux内核的IP虚拟服务器(IPVS)来实现更高效的负载均衡。IPVS对大量服务和流量提供了更好的性能。
  4. 负载均衡:根据Endpoints信息,kube-proxy负责在多个后端Pod之间负载均衡来自Service的流量。

总结

  • Service:在Kubernetes中用于将一组Pod作为服务来暴露,提供TCP/IP网络接口,从而实现负载均衡和服务发现。
  • kube-proxy:是一个网络代理,负责具体实现Service所需的流量转发和负载均衡功能。它运行在每个节点上,通过管理底层网络规则,确保集群内部外部的流量能够被正确地路由到相应的Pod。

二、具体实践

下面逐个演示service的四种类型,但LoadBalancer只在公有云环境中使用,故不演示。

ClusterIP

ClusterIP是Kubernetes中服务(Service)资源的默认类型,用于在集群内部提供对服务的稳定访问。

ClusterIP 基本概念

  • 集群内部访问:ClusterIP 为服务分配一个虚拟IP,只能在 Kubernetes 集群内部使用。外部无法直接访问。
  • 服务发现:集群内的其他 Pod 可以通过服务名称来访问这个服务,简单直观。
  • 负载均衡:当服务由多个 Pod 提供时,ClusterIP 会自动在这些 Pod 之间分配流量。

应用场景

  1. 内部服务通信:所有需要在 Kubernetes 内部通信的组件,比如微服务架构中的不同服务,通过 ClusterIP 互相调用。
  2. 数据库接入:集群内部的应用程序可以通过 ClusterIP 来访问数据库服务。
  3. 后端服务调用:前端应用或 API 网关访问后端服务时,利用 ClusterIP 提供稳定的网络路径。
apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: nginx-deployment  
  labels:  
    app: nginx-dep  
spec:  
  replicas: 10  
  selector:  
    matchLabels:  
      app: nginx  
  template:  
    metadata:  
      labels:  
        app: nginx  
    spec:  
      containers:  
      - name: nginx1  
        image: harbor.hiuiu.com/nginx/nginx:1.22a  
        imagePullPolicy: IfNotPresent  
        ports:  
        - containerPort: 80  
---  上面是启动模板文件,创建10个pod
apiVersion: v1  
kind: Service  
metadata:  
  name: myapp-service  
spec:  
  type: ClusterIP  
  ports:  
  - port: 80  暴露的端口
    targetPort: 80  pod的实际端口
  selector:  
    app: nginx
    

在这里插入图片描述

kubectl get service  myapp-service -o wide
查看service的状态

在这里插入图片描述
在这里插入图片描述
结果是集群内部可以访问,集群外部不可以访问。

NodePort

NodePort 简介

  • 什么是 NodePort:
    NodePort 是 Kubernetes 提供的一种服务类型,它允许外部流量通过特定端口访问集群内的服务。

  • 如何工作:

    • 在每个节点上开放一个固定范围的端口(30000-32767)。
    • 可以通过访问任一节点的 IP 和这个端口来访问服务。

应用场景

  1. 快速测试:

    • 在开发或测试环境中快速暴露服务给外部用户。
  2. 简单外部访问:

    • 没有复杂负载均衡需求的小规模或本地网络中使用。
  3. 结合负载均衡:

    • 可以与外部负载均衡器结合使用,提供更好的流量管理。
apiVersion: v1  
kind: Service  
metadata:  
  name: my-nodeport  
spec:  
  type: NodePort  
  selector:  
    app: nginx  
  ports:  
    - port: 80  
      targetPort: 80  
      nodePort: 30007
在这里插入代码片

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

ExternalName

ExternalName 是 Kubernetes 中的一种特殊服务类型,用于将集群内的服务请求直接映射到外部的 DNS 名称。

简介

  • DNS 名称映射:

    • ExternalName 服务通过将 Kubernetes 服务名称解析为外部 DNS 名称来工作。这意味着它不生成实际的网络代理,而是直接将域名解析为外部地址。
  • 无需端口或代理:

    • 这种服务类型不涉及 Kubernetes 代理,不需要暴露任何端口,只需简单地做 DNS 级别的转发。

应用场景

  1. 访问外部服务:

    • 当您需要从 Kubernetes 内部访问集群外部的服务时,可以使用 ExternalName 类型。例如,某些第三方 API 或外部数据库服务。
  2. 服务切换/重定向:

    • 在迁移阶段,可以使用 ExternalName 将流量指向临时的外部主机,简化服务切换过程。
  3. 统一服务访问:

    • 可以通过 ExternalName 为 Kubernetes 集群内的服务提供与外部服务一致的访问接口,统一服务调用方式。
apiVersion: v1
kind: Pod
metadata:
  name: external-pod
spec:
  containers:
  - name: external-c
    image: harbor.hiuiu.com/linux_system/centos/centos7:7.9.2009
    command: ["/bin/sh"]
    args: ["-c","while true; do echo aaa; sleep 10; done"]
---
apiVersion: v1
kind: Service
metadata:
  name: external(集群内部的域名)
spec:
  type: ExternalName
  externalName: baidu.com

在这里插入图片描述
进入集群内部,去查看那个域名,解析出来的名字是baidu.com
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

使用redis设计延迟队列

目录 延迟队列概念与重要性 定义&#xff1a;延迟队列的基本概念 重要性&#xff1a;延迟队列在处理异步任务中的关键作用 图表&#xff1a;延迟队列的工作流程图 ​编辑延迟队列设计案例 背景介绍 设计目标 系统架构 设计要点 现有物理拓扑 图表&#xff1a;有赞延迟…

GStreamer 简明教程(五):Pad 相关概念介绍,Pad Capabilities/Templates

系列文章目录 GStreamer 简明教程&#xff08;一&#xff09;&#xff1a;环境搭建&#xff0c;运行 Basic Tutorial 1 Hello world! GStreamer 简明教程&#xff08;二&#xff09;&#xff1a;基本概念介绍&#xff0c;Element 和 Pipeline GStreamer 简明教程&#xff08;三…

自修C++Primer----3.2标准库类型string

目录 1.String的相关操作 1.1拷贝初始化&&直接初始化 1.2显示创建临时对象 1.3读取string对象内容 1.4一次读取多个未知对象 1.5使用getline读取一整行内容 1.6size()的返回值size_type类型 1.7两个string对象比较 1.8string对象赋值 1.9两个string对象相加 1…

策略产品 ①算法逻辑

目录 一、机器学习与AI的关系 二、机器学习全流程 1. 问题定义 2. 数据处理 3. 特征工程 4. 模型训练 5. 模型评估 6. 模型应用 机器学习是AI的关键技术之一&#xff0c;是指机器从历史数据中学习规律&#xff0c;从而提升系统某个性能度量的过程。这篇文章&#xff0c;我们在作…

C Primer Plus第十四章编程练习,仅供参考

第十四章编程练习 第一个问题让我们改写复习题5&#xff0c;创建一个函数去计算一年到某个月份的天数&#xff0c;在一个结构数组中去存储相关数据。完整程序代码以及运行结果如下&#xff1a; #include<stdio.h> #include<string.h> #include<ctype.h> st…

当外接硬盘接入到macOS上,只读不可写时,应当格式化

当windows磁盘格式例如 NTFS 的硬盘接入到macOS上时&#xff0c;会发现无法新建文件夹&#xff0c;无法删除、重命名。原因是磁盘格式对不上macOS&#xff0c;需要进行格式化。格式化时请注意备份重要数据。具体做法如下&#xff0c;在macOS中找到磁盘工具&#xff0c;然后对磁…

【HTML】常用几种模拟动画效果【附源代码】

1. 模拟音频波纹加载效果 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthde…

计算机视觉编程

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…

如何在程序中创建出多条线程

多线程是编程中的一个重要概念&#xff0c;它允许程序同时执行多个任务&#xff0c;每个任务可以看作是一个线程。在Java中&#xff0c;多线程尤为常见且强大&#xff0c;它通过允许程序在并发环境下运行&#xff0c;提高了程序的执行效率和响应速度。以下是对Java多线程的详细…

数学建模~~~预测方法--决策树模型

目录 0.直击重点 1.决策树概念 2.节点特征的选择算法 3.基尼系数的计算 4.决策树的分类 5.模型的搭建 6.模型的改进和评价 ROC曲线 参数调优 &#xfeff;GridSearch网格搜索 使用搜索结果重新建模 0.直击重点 这个文章&#xff0c;我们从三个维度进行说明介绍&#…

如何使用Python快速修改文件的标签(如何将歌词嵌入到音乐文件中,含歌词嵌入接口源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Python与Music 📒📝 1. 初探音乐文件的标签📝 使用Python修改标签📝 将歌词嵌入音乐文件⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾经听过一首好听的歌曲,却发现它的标签信息(元数据信息)杂乱无章?甚至找不到歌词?…

【Remi Pi开发板镜像烧录】使用sd卡进行瑞米派镜像的烧录

烧录大典 按照《软件开发指南》4.2.1和4.2.2的顺序进行&#xff0c;具体烧录哪个镜像结合你自己的需求&#xff0c;每个镜像的区别参考以下链接 https://mbb.eet-china.com/forum/topic/143906_1_1.html Tera term界面全屏如下设置看着比较舒服 设置完之后setup->save-&g…

智能优化特征选择|基于鹦鹉优化(2024年新出优化算法)的特征选择(分类器选用的是KNN)研究Matlab程序 【优化算法可以替换成其他优化方法】

智能优化特征选择|基于鹦鹉优化&#xff08;2024年新出优化算法&#xff09;的特征选择&#xff08;分类器选用的是KNN&#xff09;研究Matlab程序 【优化算法可以替换成其他优化方法】 文章目录 一、PO基本原理PO基本原理基本流程示例应用 二、实验结果三、核心代码四、代码获…

npm pack使用

npm pack 的作用主要是从包中创建一个压缩文件&#xff08;tarball&#xff09;&#xff0c;通常具有.tgz扩展名&#xff0c;包含了打包的模块及其依赖&#xff0c;可用于分发或部署。其应用场景包括私有库或组件的分发、离线环境的依赖安装、CI/CD 自动化构建等。 在使用npm管…

UE管理内容 —— FBX Material Pipeline

目录 Material Support Multiple Materials Material Naming Material Ordering Texture Import FBX管道将应用于网格体&#xff08;静态网格体和骨架网格体&#xff09;的材质和纹理&#xff0c;从3D应用程序传输到虚幻&#xff1b; 要转换简单材质&#xff0c;可以导入源…

Gameplay Ability System(通过GameplayEffect里的Execution修改角色属性)

一、关于GameplayEffectExecutionCalculation类 1、查看GameplayEffectExecutionCalculation类的Execute函数 这个函数将编辑器里设置的参数传进来&#xff0c;然后通过计算再返回出去&#xff0c;这个函数被标记为BlueprintNativeEvent&#xff0c;所以我们可以在自己的类Pla…

python怎么去除换行符

在Python的编写过程中&#xff0c;获取到的字符串进场存在不明原因的换行和空格&#xff0c;如何整合成一个单句&#xff0c;成为问题。 方法&#xff1a; 一、去除空格 “ ”代表的为空格 "xyz".strip() # returns "xyz" "xyz".ls…

ES6 class小挑战

// 编码挑战 #2 /* 重新创建挑战 1&#xff0c;但这次使用 ES6 类&#xff1b; a. 添加一个名为 “speedUS ”的获取器&#xff0c;返回当前速度&#xff08;单位&#xff1a;mi/h&#xff09;&#xff08;除以 1.6&#xff09;&#xff1b; 3. a. 添加一个名为 “speedUS ”…

RM遥控键鼠控制总结

硬件&通信介绍 RM比赛中各个参赛队伍使用的都是大疆官方提供的遥控器套装&#xff0c;包括遥控器和接收机&#xff0c;接收机上共三个引脚&#xff1a;VCC&#xff0c;GND&#xff0c;DBUS&#xff08;数据通道&#xff09;&#xff0c;首次使用需要进行遥控器和接收机配对…

Bootstrap 滚动监听(Scrollspy)插件

滚动监听&#xff08;Scrollspy&#xff09;插件&#xff0c;即自动更新导航插件&#xff0c;会根据滚动条的位置自动更新对应的导航目标。其基本的实现是随着您的滚动&#xff0c;基于滚动条的位置向导航栏添加 .active class。 如果您想要单独引用该插件的功能&#xff0c;那…