Kubernetes之Service详解

本文尝试从Service暴露服务方式、Service控制器实现原理、使用规范等方面对Kubernetes 中的Service进行详细介绍。

一、Kubernetes 中的pod有哪些暴露服务的方式

各种 Kubernetes 中暴露服务的方式都有其独特的优缺点,根据具体的使用场景和需求,选择合适的方式非常重要。下面是对每种方式的优缺点简要总结:

1. Service (服务)

  • ClusterIP:

    • 优点:
      • 安全性高,只能在集群内部访问。
      • 性能高,不经过网络转发。
    • 缺点:
      • 无法直接从集群外访问。
  • NodePort:

    • 优点:
      • 可以通过节点的 IP 地址和指定的端口直接访问服务。
      • 相对简单直接,适用于测试和开发环境。
    • 缺点:
      • 端口范围有限,不适合大规模使用。
      • 暴露的端口需要集群节点 IP 可访问。
  • LoadBalancer:

    • 优点:
      • 可以自动创建外部负载均衡器,从而实现流量负载均衡和高可用性。
      • 支持集群外部直接访问。
    • 缺点:
      • 依赖云服务商支持,可能造成成本增加。
      • 配置和部署相对复杂,可能引入延迟和额外的网络开销。
  • ExternalName:

    • 优点:
      • 提供了一种简单直接的方式将服务映射到外部服务的别名。
      • 不需要额外的代理或中间件。
    • 缺点:
      • 仅限于将服务暴露为外部 DNS 记录,无法对流量进行管理和路由。

2. Ingress (入口)

  • 优点:
    • 允许定义复杂的 HTTP/HTTPS 规则和路径,并提供高级负载均衡功能。
    • 可以轻松管理多个服务的入口流量,提高灵活性和可维护性。
  • 缺点:
    • 配置和管理复杂,需要额外的 Ingress 控制器来处理流量。
    • 需要额外的 DNS 记录或负载均衡器来管理流量路由。

3. Port Forwarding (端口转发)

  • 优点:
    • 简单直接,适用于开发和调试单个 Pod。
    • 不需要额外的网络配置或负载均衡器。
  • 缺点:
    • 不适用于生产环境,无法扩展到多个 Pod 或多个用户。
    • 依赖于本地环境和网络连接稳定性。

4. ExternalIP (外部 IP)

  • 优点:
    • 允许将 Service 关联到集群外部的指定 IP 地址,灵活性较高。
    • 不需要额外的负载均衡器或路由器配置。
  • 缺点:
    • 可能造成 IP 地址冲突或安全风险,需要谨慎管理。
    • 不适用于动态 IP 地址环境,如云计算中的 IP 分配。

5. Headless Service (无头服务)

  • 优点:
    • 直接暴露每个 Pod 的 IP 地址,适用于一些特定的服务发现需求。
    • 简单直接,无需额外的代理或路由配置。
  • 缺点:
    • 需要额外的 DNS 解析配置,可能影响性能和可维护性。
    • 不支持负载均衡和流量管理。

总结

选择适合的服务暴露方式应基于具体的业务需求、安全性要求、性能需求和云基础设施的支持情况。例如,在生产环境中,可能会选择使用 LoadBalancer 或 Ingress 来管理流量和提高可用性;而在开发和测试阶段,NodePort 或 Port Forwarding 则更为方便和实用。综合考虑各种方式的优缺点,可以有效地满足不同场景下的服务暴露需求。

二、Deployment 、service、pod、container之前的关系

在 Kubernetes 中,Service 的实现原理涉及多个组件,包括 Deployment、Service、Pod 和 Container。下面详细介绍这些组件之间的关系和工作原理,并附上逻辑示意图。

组件关系和工作原理

  1. Deployment

    • 定义了应用程序的期望状态,如 Pod 的数量、镜像版本、更新策略等。
    • 管理 Pod 的创建、更新和删除,确保实际状态与期望状态一致。
  2. Service

    • 抽象了后台的一组 Pod,提供了一种稳定的网络访问方式。
    • 通过标签选择器选择与之关联的 Pod。
    • 提供负载均衡和服务发现功能。
  3. Pod

    • Kubernetes 中的最小可调度单元,包含一个或多个容器。
    • 每个 Pod 有一个唯一的 IP 地址,并共享网络和存储资源。
  4. Container

    • 运行在 Pod 内的实际应用实例。
    • 通过容器运行时(如 Docker)来管理其生命周期。

Service 的实现原理

  1. 定义和注册 Service

    • 用户创建一个 Service 对象,API 服务器接收该请求并存储在 etcd 中。
    • Service 对象包含服务名称、选择器、类型、端口等信息。
  2. Endpoints 对象

    • Kubernetes 自动创建并维护 Endpoints 对象,包含与 Service 关联的 Pod 的 IP 地址和端口。
    • 通过标签选择器选择符合条件的 Pod。
  3. kube-proxy 组件

    • 运行在每个节点上,负责实现 Service 的网络代理功能。
    • 通过 iptables、ipvs 或用户空间模式来处理流量并进行负载均衡。
  4. 负载均衡和服务发现

    • kube-proxy 根据 Endpoints 对象的 IP 地址和端口进行流量转发。
    • 内置 DNS 服务为每个 Service 创建 DNS 记录,应用程序通过 DNS 名称访问 Service。

逻辑示意图

以下是 Deployment、Service、Pod 和 Container 之间的关系示意图:

+-----------------+     +---------------------+     +------------------+
|                 |     |                     |     |                  |
|   Deployment    |---->|      Service        |---->|      Pod         |
|                 |     |                     |     |                  |
+-----------------+     +---------+-----------+     +------------------+|| selects|+----------v---------+|                    ||    Endpoints       ||                    |+----------+---------+|| points to|+----------v---------+|                    ||      Pod           ||    (replica 1)     ||                    |+----------+---------+|| contains|+----------v---------+|                    ||    Container       ||                    |+--------------------+

解释

  • Deployment: 管理 Pod 的副本数量和更新策略,确保应用程序按照期望状态运行。
  • Service: 通过标签选择器选择符合条件的 Pod,并提供一个稳定的网络入口。
  • Pod: 运行一个或多个容器,并为每个容器提供共享的网络和存储环境。
  • Container: 运行在 Pod 内的实际应用实例,通过容器运行时来管理其生命周期。

这个示意图展示了 Kubernetes 中各组件之间的关系以及 Service 实现的基本原理。通过这些组件的协同工作,Kubernetes 能够提供稳定、高效的服务发现和负载均衡功能。

三、Service控制器工作流程

在 Kubernetes 中,Service 控制器负责管理 Service 对象和相关联的 Endpoints 对象。它确保 Service 始终与符合其选择器的 Pod 保持一致。以下是 Service 控制器的工作流程及其逻辑调用示意图。

Service 控制器的逻辑调用流程

  1. 定义和创建 Service:

    • 用户通过 kubectl 或其他工具创建一个 Service 对象。
    • Kubernetes API 服务器接收请求并将 Service 对象存储在 etcd 中。
  2. Service 控制器监听:

    • Service 控制器通过 API 服务器监听 Service 对象的创建、更新和删除事件。
  3. 更新 Endpoints:

    • 当 Service 控制器检测到 Service 对象的变化时,它会根据 Service 的选择器查找所有匹配的 Pod。
    • Service 控制器创建或更新 Endpoints 对象,使其包含所有符合条件的 Pod 的 IP 地址和端口。
  4. kube-proxy 配置:

    • kube-proxy 监听 API 服务器上的 Endpoints 对象的变化。
    • kube-proxy 根据 Endpoints 对象的变化,更新 iptables、ipvs 或用户空间代理规则,确保流量能够正确转发到 Pod。

逻辑调用示意图

以下是 Service 控制器逻辑调用的示意图:

+---------------------+     +------------------+    +---------------------+
|                     |     |                  |    |                     |
|     User/Client     |     | API Server       |    |    Service          |
|   (kubectl, etc.)   |     |                  |    |   Controller        |
|                     |     |                  |    |                     |
+---------+-----------+     +--------+---------+    +----------+----------+|                          |                        || Create Service           |                        |+------------------------->|                        ||                          |                        ||                          |                        ||                          |  Store Service in etcd ||                          +------------------------+|                          ||                          | Detect Service changes ||                          |                        ||                          +<-----------------------+|                          |                        ||                          | Query matching Pods    ||                          +------------------------>|                          |                        ||                          |  Create/Update         ||                          |  Endpoints object      ||                          +------------------------+|                          ||                          | Notify kube-proxy of   ||                          | Endpoints changes      ||                          +------------------------+|                          |
+---------v-----------+     +--------v---------+    +----------v----------+
|                     |     |                  |    |                     |
|  kube-proxy         |     |   etcd           |    |     Endpoints       |
|                     |     |                  |    |                     |
+---------+-----------+     +--------+---------+    +----------+----------+|                          |                        || Retrieve Endpoints       |                        |+<-------------------------+                        ||                          |                        || Update iptables/ipvs/    |                        || user-space rules         |                        |+--------------------------->                        ||                          |                        |
+---------v-----------+     +--------v---------+    +----------v----------+
|                     |     |                  |    |                     |
|   Service           |     |     Pod          |    |   Container         |
|                     |     |                  |    |                     |
+---------------------+     +------------------+    +---------------------+

详细步骤说明

  1. 用户创建 Service:

    • 用户通过 kubectl 提交 Service 资源定义到 API 服务器。
    • API 服务器验证并将 Service 对象存储在 etcd 中。
  2. Service 控制器监听 Service 对象:

    • Service 控制器监听 API 服务器上的 Service 对象的事件(创建、更新、删除)。
    • 当检测到新的 Service 对象或 Service 对象的变化时,Service 控制器执行相应的操作。
  3. 更新 Endpoints 对象:

    • Service 控制器根据 Service 的选择器查找符合条件的 Pod。
    • 创建或更新 Endpoints 对象,使其包含所有符合条件的 Pod 的 IP 地址和端口。
    • 将 Endpoints 对象的变化存储在 etcd 中。
  4. kube-proxy 配置:

    • kube-proxy 监听 Endpoints 对象的变化。
    • 当检测到 Endpoints 对象的变化时,kube-proxy 更新本地的 iptables、ipvs 或用户空间代理规则。
    • 确保流量能够正确路由到与 Service 关联的 Pod。

通过上述步骤,Kubernetes 中的 Service 控制器确保 Service 始终与符合其选择器的 Pod 保持一致,并通过 kube-proxy 实现流量的正确路由和负载均衡。

四、Deploymen与Service使用规范

在生产实践中,结合 Deployment 和 Service 的使用规范,可以帮助运维工程师更好地管理服务,确保应用的高可用性、可扩展性和易维护性。以下是一些推荐的使用规范和最佳实践:

Deployment 规范

  1. 使用版本标签管理镜像

    • 使用明确的镜像版本标签(如 v1.0.0)而不是 latest,确保版本的可追踪和可控。
  2. 合理设置副本数量

    • 确保 Deployment 中定义的副本数量(replicas)能够满足高可用性需求。使用水平自动伸缩器(Horizontal Pod Autoscaler)根据负载自动调整副本数量。
  3. 配置资源请求和限制

    • 设置每个容器的 CPU 和内存资源请求和限制,以便 Kubernetes 可以更好地调度和管理资源。
  4. 配置健康检查

    • 配置 livenessProbereadinessProbe 来确保 Pod 的健康状态和服务的可用性。未通过健康检查的 Pod 将被重启或移出服务。
  5. 滚动更新策略

    • 使用滚动更新策略(RollingUpdate)逐步替换旧的 Pod,确保在更新过程中服务的连续性。可以通过 maxUnavailablemaxSurge 参数来控制更新过程。

Service 规范

  1. 选择合适的 Service 类型

    • 根据应用需求选择合适的 Service 类型(ClusterIP、NodePort、LoadBalancer、ExternalName)。对于内部服务使用 ClusterIP,对于外部访问使用 LoadBalancer。
  2. 配置 Service 选择器

    • 使用标签选择器(Label Selector)明确指定与 Service 关联的 Pod,确保流量能够正确路由到目标 Pod。
  3. 使用 Headless Service

    • 对于需要直接访问 Pod 的应用(如 StatefulSets),使用无头服务(Headless Service,clusterIP: None)。
  4. Service 发现和 DNS

    • 利用 Kubernetes 内置的 DNS 服务为每个 Service 创建 DNS 记录,应用程序通过 DNS 名称访问 Service,避免直接依赖 IP 地址。

网络和安全性

  1. 网络策略

    • 使用网络策略(Network Policy)来控制 Pod 间的网络流量,增强集群的安全性。定义允许和拒绝的流量规则,确保只有需要通信的 Pod 可以互相访问。
  2. 负载均衡和反向代理

    • 使用 Ingress 控制器来管理 HTTP 和 HTTPS 流量,通过定义 Ingress 资源来配置路由规则。确保外部流量能够正确路由到内部服务。
  3. TLS 和证书管理

    • 配置 Ingress 控制器使用 TLS 加密通信。使用 Cert-Manager 自动管理 TLS 证书的创建和续期。

监控和日志

  1. 日志管理

    • 使用集中化的日志管理系统(如 ELK Stack 或 Loki)来收集和分析 Pod 的日志。确保日志能够持久化存储和检索。
  2. 监控和报警

    • 使用 Prometheus、Grafana 等监控工具监控集群和应用的状态。设置合适的报警规则,及时发现和响应异常情况。

灾备和恢复

  1. 定期备份

    • 定期备份 etcd 数据,确保集群配置和状态的持久化。使用工具(如 Velero)进行集群和应用数据的备份和恢复。
  2. 灾难恢复演练

    • 定期进行灾难恢复演练,验证备份和恢复流程的有效性。确保在实际灾难发生时能够迅速恢复服务。

配置管理和自动化

  1. 配置管理

    • 使用 ConfigMap 和 Secret 管理应用配置和敏感信息。确保配置的灵活性和安全性。
  2. 自动化工具

    • 使用 Helm 或 Kustomize 管理应用的部署和配置。利用 CI/CD 工具(如 Jenkins、GitLab CI)实现自动化部署和持续集成。

示例 YAML 配置

以下是一个示例 YAML 配置,结合了 Deployment 和 Service 的最佳实践:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-applabels:app: my-app
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: my-image:v1.0.0resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"livenessProbe:httpGet:path: /healthzport: 8080initialDelaySeconds: 15periodSeconds: 20readinessProbe:httpGet:path: /readinessport: 8080initialDelaySeconds: 5periodSeconds: 10---
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80targetPort: 8080type: ClusterIP

通过遵循上述规范和最佳实践,可以帮助运维工程师更好地管理 Kubernetes 中的 Deployment 和 Service,确保应用程序的稳定性、可扩展性和安全性。

完。

希望对您有用!关注锅总,可及时获得更多运维实用操作!

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

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

相关文章

在Windows10中使用Vim

服务器没有图形界面&#xff0c;但是numpy包又需要调用图形界面接口&#xff0c;这样就导致了错误&#xff0c;搞得我只好先回windows开发。看来当年 Ubuntu桌面版也不算是多此一举啊。 这么多ide我还是喜欢vim&#xff0c;因为它真的太简单了。咱们这个老年机启动的也非常快&…

【jenkins1】gitlab与jenkins集成

文章目录 1.Jenkins-docker配置&#xff1a;运行在8080端口上&#xff0c;机器只要安装docker就能装载image并运行容器2.Jenkins与GitLab配置&#xff1a;docker ps查看正在运行&#xff0c;浏览器访问http://10....:8080/2.1 GitLab与Jenkins的Access Token配置&#xff1a;不…

力扣爆刷第153天之TOP100五连刷31-35(合并区间、编辑距离、复原IP)

力扣爆刷第153天之TOP100五连刷31-35&#xff08;合并区间、编辑距离、复原IP&#xff09; 文章目录 力扣爆刷第153天之TOP100五连刷31-35&#xff08;合并区间、编辑距离、复原IP&#xff09;一、56. 合并区间二、124. 二叉树中的最大路径和三、72. 编辑距离四、19. 删除链表的…

Kubernetes排错(七)-Pod 状态一直 ContainerCreating

查看 Pod 事件 $ kubectl describe pod apigateway-6dc48bf8b6-l8xrw -n cn-staging 异常原因 1&#xff09;no space left on device ... Events:Type Reason Age From Message---- ------ …

Google项目管理总览(一)

目录 一、项目管理基础 1.1、项目 1.2、项目管理 1.2.1、重要性&#xff08;why&#xff09; 1.2.2、项目生命周期 1.2.3、方法论&#xff08;项目管理&#xff09; 1.3、项目经理 1.3.1、构建人际关系的技巧 1.3.2、注意 1.4、组织架构 1.5、组织文化 二、Project …

Crypto/Util/number.py“, line 139 value |= 2L ** (N-1) # Ensure high bit is set

Crypto/Util/number.py", line 139 value | 2L ** (N-1) # Ensure high bit is set 解决办法 pip3 install pyrebase4

[SAP ABAP] 读取内表数据

1.读取单条数据 1.1 索引查找 语法格式 READ TABLE <itab> INTO <wa> INDEX <idx>.<itab>&#xff1a;代表内表 <wa>&#xff1a;代表工作区 <idx>&#xff1a;代表索引值 示例1 结果显示&#xff1a; 1.2 关键字查找 READ TABLE <…

Redis协议规范简介

Redis客户端使用为名为RESP&#xff08;Redis序列化协议&#xff09;的协议与Redis服务器进行通信。虽然该协议是专门为Redis设计的&#xff0c;但它也可以用于其他的CS软件项目的通信协议。 RESP可以序列化不同的数据类型&#xff0c;如整型&#xff0c;字符串&#xff0c;数…

【python】python海底捞门店营业数据分析与可视化(数据集+源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

pyttsx3:Python文本到语音转换库的全面指南

目录 引言 一、pyttsx3 简介 二、安装 pyttsx3 三、基本用法 四、配置语音属性 五、支持的命令和功能 六、高级用法 结语 引言 在当今的软件开发中&#xff0c;提供语音交互功能已成为提升用户体验的一种重要方式。Python&#xff0c;作为一种广泛使用的编程语言&#x…

JavaSE基础总结复习之面向对象の知识总结

目录 Java语言的基础特点 面向对象 类和对象 类 类的构造 一&#xff0c;发现类 二&#xff0c;发现类的共有属性&#xff08;成员变量&#xff09; 三&#xff0c;定义类的成员方法&#xff08;行为&#xff0c;动词&#xff09; 四&#xff0c;使用类创建对象 对象…

vue3使用 JSX / TSX语法

一、什么是 JSX / TSX JSX / TSX 语法 JSX 是一种将XML语法嵌入到JavaScript中的语法。在 Vue3 中&#xff0c;我们可以使用JSX语法来编写组件的模板。使用JSX语法可以让我们更加灵活地定义组件的模板&#xff0c;并且可以让我们在编写组件时使用JavaScript的全部语言特性。 …

05-5.5.2 并查集

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

【面试干货】HashSet 和 TreeSet 的区别

【面试干货】HashSet 和 TreeSet 的区别 1、实现方式HashSetTreeSet 2、性能添加、删除和查找操作的时间复杂度HashSetTreeSet 3、元素唯一性4、迭代顺序HashSetTreeSet 5、使用场景HashSetTreeSet 6、示例代码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不…

阅读笔记:明朝那些事儿妖孽横行的宫廷

明朝那些事儿第四部看完了&#xff0c;合上书本给我印象比较深刻的文臣要数王守仁&#xff0c;不愧为明朝的军事家&#xff0c;思想家&#xff0c;文学家&#xff0c;教育家&#xff0c;他经过多年的思索、磨难、追求&#xff0c;终于有一天&#xff0c;在穷乡僻壤&#xff0c;…

Linux的基本指令第二篇

1.cat - 查看文件 语法&#xff1a;cat [选项] [文件] 功能&#xff1a; 查看目标文件的内容 -b 对非空输出行编号 -n对输出的所有行编号 -s不输出多行空行 现有一个文件test.c cat -n test.c cat -b test.c cat -s test.c 创建一个新文件 加入源文件的内容 || …

Python基础教程(三十二):random模块

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝💝💝如有需要请大家订阅我的专栏【Python系列】哟!我会定期更新相关系列的文章 💝💝💝关注!关注!!请…

华为OD刷题C卷 - 每日刷题38(万能字符单词拼写,虚拟理财游戏)

1、&#xff08;万能字符单词拼写&#xff09;&#xff1a; 这段代码是解决“万能字符单词拼写”的问题。它提供了一个Java类Main&#xff0c;其中包含main方法和getResult方法&#xff0c;以及一个辅助方法success&#xff0c;用于计算使用给定字符chars能拼写出的单词words中…

数据分析:置换检验Permutation Test

欢迎大家关注全网生信学习者系列&#xff1a; WX公zhong号&#xff1a;生信学习者Xiao hong书&#xff1a;生信学习者知hu&#xff1a;生信学习者CDSN&#xff1a;生信学习者2 介绍 置换检验是一种非参数统计方法&#xff0c;它不依赖于数据的分布形态&#xff0c;因此特别适…

flowable 适配达梦数据库(最简单的方式)

只需要引入一个 jar 包&#xff0c;就可以轻松实现 flowable 对达梦数据库的适配。 参考如下博客&#xff1a; SpringBoot 中的 Liquibase 适配达梦数据库&#xff08;DM&#xff09;和 Flowable 工作流_liquibase 达梦数据库-CSDN博客 SpringBoot 中的 flyway 支持达梦数据库…