You need to enable JavaScript to run this app.
导航
服务
最近更新时间:2024.04.26 15:28:57首次发布时间:2023.12.13 19:07:11

Kubernetes 中 Service 是将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法,用来解决上述 Pod 访问问题。Service 拥有一个固定 IP 地址,用户可以通过访问 Service 来访问工作负载,而 Service 通过 Label 来选择 Pod,并将用户的访问流量转发给 Pod,同时,Service 还可以给 Pod 做负载均衡。

服务概述

Pod 的访问问题

工作负载创建完成后,其在多个 Pod 中运行,而 Pod 由于具备弹性伸缩属性,因此访问 Pod 会面临如下几个问题:

  • Pod 会随时被 Deployment 等控制器新建或删除,因此,直接访问 Pod 具有很大的不确定性,无法保证访问 Pod 的结果。
  • Pod 的 IP 地址是在 Pod 启动后才被分配,在启动前并不知道 Pod 的 IP 地址。
  • 工作负载是由一组(多个)运行相同镜像的 Pod 组成,逐个访问 Pod 也会带来很多问题。

Service 访问类型

Service 包含多种类型,适应于不同的场景。包括:集群内访问(ClusterIP)、节点端口访问(NodePort)、负载均衡(LoadBalancer)。

  • 集群内访问(ClusterIP):集群内访问(ClusterIP)是指将工作负载暴露给同一集群内其他工作负载访问的方式,可以通过 集群内部域名 访问。例如:创建一个名为 nginx 的 Service,端口号为 80,则集群内部访问时,直接通过 nginx:80 就可以访问到 Service,进而访问后台 Pod。

    在微服务相关场景,如果不需要负载均衡以及 Service IP,需要直通 Pod 的时候,可以配置 Headless Service。Headless Service 不会为 Service 创建 ClusterIP,DNS 查询时会返回所有 Pod 的 DNS 记录,这样就可以访问到所有 Pod 的 IP 地址。相当于直接访问 Pod。集群内访问(ClusterIP)和 Headless Service 的主要区别和应用场景如下。

    差异项集群内访问(ClusterIP)Headless Service
    ClusterIP
    解析 Service 的 DNS 结果返回 Service 的 ClusterIP 地址。返回所有 Pod 的 Pod IP 地址。
    其他应用访问 Service只能访问到 Service,具体的 Pod 由 iptables 决定,实现了针对 Pod 的负载均衡。能够直接访问到全部 Pod。

    应用场景

    需要 Service 为 Pod 进行负载均衡的场景。

    • 需要直接访问所有Pod的场景。例如在集群中部署 Kafka,无需 Service 来代理,客户端需要能够访问所有的 Pod。
    • Client 处理负载均衡的场景。例如在集群中部署两个应用负载,Client 负责处理负载均衡请求,此种场景下就无需 Serivce 来代理。
  • 节点端口访问(NodePort):节点端口访问(NodePort)是指在每个节点的 IP 上开放一个静态端口,通过静态端口对外暴露服务。其他应用通过请求Node_IP:Node_Port,即可访问服务。节点的 IP 地址可以分配私网地址,也可以分配公网地址。因此,通过节点访问方式,可以对内或对外暴露服务。

  • 负载均衡(LoadBalancer):负载均衡是指通过弹性负载均衡从公网访问到工作负载,提供了更高可靠性的保障,一般用于系统中需要暴露到公网的服务。

创建服务

前提条件

操作步骤

  1. 登录 分布式云原生控制台
  2. 在左侧导航栏选择 联邦主控实例,进入主控实例管理页面。
  3. 在主控实例列表,单击目标主控实例名称,进入主控实例配置页面。
  4. 在左侧导航栏选择 服务与路由 > 服务,进入服务管理页面。
  5. 单击 创建服务,根据引导提示配置参数,所有参数配置完成后,即可开始创建服务并实现多集群分发。
  • 完成服务相关资源配置,完成后单击 下一步:部署配置

alt

配置项说明
名称自定义服务名称,同一个命名空间下,名称必须唯一。
命名空间选择服务所属的命名空间。建议选择您自定义的命名空间,或系统默认创建的 default 命名空间。
标签单击 添加标签 图标,配置服务的标签。标签能够为服务定义不同的属性,方便批量筛选等需求。
注解对应 Kubernetes 中的 Annotation。单击 添加注解,为服务添加注解并配置键值对。
访问类型按需选择提供服务的访问类型,包括:集群内访问(ClusterIP)、节点端口访问(NodePort)、负载均衡(LoadBalancer)。

设置为 Headless Service

访问类型为集群内访问(ClusterIP)时需要配置,默认不勾选。
Headless Service 不会创建 ClusterIP,但会获取所有 Pod 的 DNS 记录,通过 Headless Service 可以查询到所有 Pod 的 IP 地址,例如:StatefulSet 使用 Headless Service 实现 Pod 间的相互访问。

端口映射

配置端口映射规则:

  • 名称:配置服务端口到容器端口映射的名称。

  • 服务端口:配置 Service 对外提供服务的端口。同一种协议的服务端口不允许重复。

  • 协议:根据业务的协议类型,选择端口协议。当前支持 TCP 协议和 UDP 协议。

  • 容器端口:配置容器的端口,该端口为工作负载对外提供服务的端口号或端口名称。例如:Nginx 开放的默认端口号为 80。

标签选择器

Service 通过标签选择器与后端容器组实例(Pod)绑定:

  • 添加标签:输入添加工作负载的标签,关联 Service 到指定工作负载。您可以在集群管理页面左侧导航栏单击 工作负载,找到目标工作负载,获取工作负载标签。

  • 关联工作负载:直接选择工作负载,关联到 Service。当前仅支持关联 无状态负载(Deployment)、有状态负载(Statefulset)。

外部流量策略访问类型为节点端口访问(NodePort)或负载均衡(LoadBalancer)时需要配置。

会话保持

默认不配置。启用后 Service 将来自同一个 IP 地址的访问请求转发到同一台后端服务器上。

说明

  • 建议设置超时时间数值大于 120 秒。

  • Headless Service 不支持会话保持,超时时间配置不会生效。

  • 填写服务的部署分发策略,完成后单击 确定

alt

配置项说明

分发策略

部署配置的开关,可根据实际情况(是否已创建策略、是否需要立即分发资源)确定是否需要立即配置策略并分发资源。

  • 关联已有策略:已经创建部署策略、差异化策略,即刻关联策略并分发资源。

  • 暂不关联:仅创建资源,暂不关联策略,也不进行资源分发,直到更新部署策略。

部署策略

根据实际情况配置资源关联的部署策略(包括:命名空间级或集群级)。
选定部署策略后,可展示部署策略中副本模式调度和跟随调度配置的开启状态,若需要调整部署策略相关配置,可单击 配置,跳转到部署策略更新页面进行调整。

差异化策略配置资源关联的差异化策略(包括:命名空间级或集群级),可根据实际情况选择一个或多个差异化策略,的确没有差异时可留空不填。

冲突资源接管

默认不勾选,表示待分发资源与成员集群中已有资源名称冲突时的处理策略,勾选后将通过联邦资源统一管理已存在的资源。资源冲突场景具体说明及注意事项参见:资源冲突策略

  • 若不勾选此项,当成员集群中已经存在待分发的同名资源时,将会出现资源冲突错误,已存在的资源不受影响,待分发资源分发失败。

  • 若勾选此项,需要进一步指定 接管目标集群。当成员集群中已经存在待分发的同名资源时,将通过联邦资源统一接管已存在的资源。

管理服务

联邦资源的管理操作基本相同,详细介绍参见:管理联邦资源