首页 > 其他分享 >运维锅总详解Kubernetes之Service

运维锅总详解Kubernetes之Service

时间:2024-07-18 12:29:34浏览次数:21  
标签:控制器 Service Kubernetes IP 运维锅 Pod Endpoints

本文尝试从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 的创建、更新和删除,确保实际状态与期望状态一致。

Service

  • 抽象了后台的一组 Pod,提供了一种稳定的网络访问方式。

  • 通过标签选择器选择与之关联的 Pod。

  • 提供负载均衡和服务发现功能。

Pod

  • Kubernetes 中的最小可调度单元,包含一个或多个容器。

  • 每个 Pod 有一个唯一的 IP 地址,并共享网络和存储资源。

Container

  • 运行在 Pod 内的实际应用实例。

  • 通过容器运行时(如 Docker)来管理其生命周期。

Service 的实现原理

  1. 定义和注册 Service

  • 用户创建一个 Service 对象,API 服务器接收该请求并存储在 etcd 中。

  • Service 对象包含服务名称、选择器、类型、端口等信息。

Endpoints 对象

  • Kubernetes 自动创建并维护 Endpoints 对象,包含与 Service 关联的 Pod 的 IP 地址和端口。

  • 通过标签选择器选择符合条件的 Pod。

kube-proxy 组件

  • 运行在每个节点上,负责实现 Service 的网络代理功能。

  • 通过 iptables、ipvs 或用户空间模式来处理流量并进行负载均衡。

负载均衡和服务发现

  • 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 中。

Service 控制器监听:

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

更新 Endpoints:

  • 当 Service 控制器检测到 Service 对象的变化时,它会根据 Service 的选择器查找所有匹配的 Pod。

  • Service 控制器创建或更新 Endpoints 对象,使其包含所有符合条件的 Pod 的 IP 地址和端口。

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 中。

Service 控制器监听 Service 对象:

  • Service 控制器监听 API 服务器上的 Service 对象的事件(创建、更新、删除)。

  • 当检测到新的 Service 对象或 Service 对象的变化时,Service 控制器执行相应的操作。

更新 Endpoints 对象:

  • Service 控制器根据 Service 的选择器查找符合条件的 Pod。

  • 创建或更新 Endpoints 对象,使其包含所有符合条件的 Pod 的 IP 地址和端口。

  • 将 Endpoints 对象的变化存储在 etcd 中。

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,确保版本的可追踪和可控。

合理设置副本数量

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

配置资源请求和限制

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

配置健康检查

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

滚动更新策略

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

Service 规范

  1. 选择合适的 Service 类型

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

配置 Service 选择器

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

使用 Headless Service

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

Service 发现和 DNS

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

网络和安全性

  1. 网络策略

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

负载均衡和反向代理

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

TLS 和证书管理

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

监控和日志

  1. 日志管理

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

监控和报警

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

灾备和恢复

  1. 定期备份

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

灾难恢复演练

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

配置管理和自动化

  1. 配置管理

  • 使用 ConfigMap 和 Secret 管理应用配置和敏感信息。确保配置的灵活性和安全性。

自动化工具

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

示例 YAML 配置

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image:v1.0.0
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20
        readinessProbe:
          httpGet:
            path: /readiness
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10


---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP

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

完。88cd4b373a960b18dcfbcd053abc574a.png希望对您有所帮助!关注锅总,及时获得更多花里胡哨的运维实用操作!

80a216ca21f76b8b7ba11869db1a6b93.png

锅总个人博客

https://gentlewok.blog.csdn.net/

锅总微信公众号

8bc5d52fc94a4a5069a666f28a6919f9.png

标签:控制器,Service,Kubernetes,IP,运维锅,Pod,Endpoints
From: https://blog.csdn.net/qq_35630153/article/details/140517415

相关文章

  • kubernetes的网络实现
    前言K8s如何实现相同Node中Pod和Pod通信不通Node间Pod通信  CalicoCalico是1个基于BGP协议的网络互联解决方案;Calico是1个纯3层的SDN解决方案即CNI插件,使用路由来实现报文寻址和传输。相比Flannel,ovs等SDN解决方案,Calico避免了层叠网络带来的性能损耗。将Node节点......
  • Goby漏洞发布 | CVE-2024-4879 ServiceNowUI /login.do Jelly模板注入漏洞【已复现】
    漏洞名称:ServiceNowUI/login.doJelly模板注入漏洞(CVE-2024-4879)EnglishName:ServiceNowUI/login.doInputValidationVulnerability(CVE-2024-4879)CVSScore:9.3漏洞描述:ServiceNow是一个业务转型平台。通过平台上的各个模块,ServiceNow可用于从人力资源和员工管理到自动......
  • post测webservice
    webservice地址 asmx, 直接打开浏览器,里写的很清楚了。    postman设置 设置soapaction直接复制示例code 结果 ......
  • 在 Kubernetes 上部署 llama3
    转自:https://zhuanlan.zhihu.com/p/695534674Ollama与OpenWebUI介绍Ollama 是一个运行大模型的工具,可以看成是大模型领域的Docker,可以下载所需的大模型并暴露API。OpenWebUI 是一个大模型的WebUI交互工具,支持Ollama,即调用Ollama暴露的API实现与大模型交互:部署......
  • 【K8s】专题七(2):Kubernetes 服务发现之 Ingress
    以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!目录一、基本介绍二、工作原理三、资源清单(示例)1、IngressController2、Ingress对象四、常用命令一、基本介绍Ingress是Kubernetes提供的一种服务......
  • K8S教程:如何使用Kubeadm命令在PetaExpress Ubuntu系统上安装Kubernetes集群
    Kubernetes,通常缩写为K8s,是一个开源的容器编排平台,旨在自动化容器化应用的部署、扩展和管理。有了Kubernetes,您可以轻松地部署、更新和扩展应用,而无需担心底层基础设施。一个Kubernetes集群由控制平面节点(master节点)和工作节点(worker节点)组成。确保集群的高效运......
  • android系统启动流程- ServiceManager进程启动流程
    *注:基于Android11源码ServiceManager进程是在init进程创建的,所以我们从init进程的main()开始分析://文件路径:system/core/init/main.cppintmain(intargc,char**argv){...if(!strcmp(argv[1],"second_stage")){//TODO根据条件会走到这个分支......
  • Android 四大组件 Activity、Service、Broadcast、Content Provider
    一、Android四大组件Activity、Service、Broadcast、ContentProvider1、Activity:1.1、打开App内部Activity:Intentintent=newIntent(SourceActivity.this,TargetActivity.class);startActivity(intent); 1.2、打开Activity并获取返回结果(类似模式对话框): 主Activit......
  • Kubernetes近十年里程碑及版本偏差策略
    1、Kubernetes十年回顾Kubernetes的历史始于2014年6月6日的那次历史性提交,随后,Google工程师EricBrewer在2014年6月10日的DockerCon2014上的主题演讲(及其相应的Google博客)中由宣布了该项目。在接下来的一年里,一个由主要来自Google和RedHat......
  • How to link multiple docker-compose services via network
    Howtolinkmultipledocker-composeservicesvianetworkNewscenario:SharinganetworkbetweenservicesIfyouwantdefineservicesinmultipledocker-compose.ymlfiles,andalsohavenetworkconnectivitybetweentheservices,youneedtoconfigureyou......