You need to enable JavaScript to run this app.
导航
集群内访问(ClusterIP)
最近更新时间:2024.11.27 14:42:15首次发布时间:2022.03.04 23:10:38

集群内访问(ClusterIP)允许通过服务将工作负载暴露给同一集群内其他工作负载访问。本文介绍如何配置 ClusterIP 类型的服务。

背景信息

当在集群中创建一个集群内访问(ClusterIP)类型的服务时,系统会为该服务生成内部访问域名,格式为服务名称.命名空间.svc.cluster.local:端口号。例如:在 default 命名空间,创建一个名为 nginx 的 Service,端口号为 80 时,则集群内部直接通过域名nginx:80nginx.default:80就可以访问到该 Service 和后端 Pod。

alt

在不需要负载均衡以及 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 来代理。

前提条件

操作步骤

通过控制台创建

  1. 登录 容器服务控制台

  2. 单击左侧导航栏中的 集群

  3. 在集群列表页面,单击目标集群名称。

  4. 在集群管理页面的左侧导航栏中,选择 服务与路由 > 服务,单击 创建服务,配置服务。

    • 基本信息

      配置项说明
      名称根据系统提示,配置服务的名称。在同一个命名空间下,名称必须唯一。
      命名空间选择服务所属的命名空间。建议选择您自定义的命名空间,或系统默认创建的 default 命名空间。命名空间相关介绍,请参见 命名空间概述
      标签单击 添加标签 图标,配置服务的标签。标签能够为服务定义不同的属性,方便批量筛选等需求。
      注解对应 Kubernetes 中的 Annotation。单击 添加注解,为服务添加注解并配置键值对。
    • 访问配置
      alt

      配置项说明
      访问类型配置服务的访问类型,本例中选择:集群内访问(ClusterIP)

      通信协议

      邀测·申请试用】针对 IPv4/IPv6 双栈集群,提供按需配置服务通信协议能力,兼容 IPv6 地址访问服务的业务场景。包括以下选项:

      • IPv4:表示仅支持 IPv4 地址访问服务。
      • IPv6:表示仅支持 IPv6 地址访问服务。
      • IPv4&IPv6:同时支持通过 IPv4 和 IPv6 访问服务,默认使用 IPv4。
      • IPv6&IPv4:同时支持通过 IPv6 和 IPv4 访问服务,默认使用 IPv6。

      说明

      IPv4/IPv6 双栈集群搭建方法参见:通过 VKE 搭建 IPv4/IPv6 双栈集群

      端口映射

      配置端口映射规则:

      • 名称:配置服务端口到容器端口映射规则的名称。
      • 服务端口:配置 Service 对外提供服务的端口。同一种协议的服务端口不允许重复。

      说明

      在 VPC-CNI 网络的集群中,不同协议的服务端口也不允许重复,即 TCP 和 UDP 协议不能用同一个服务端口号。

      • 协议:根据业务的协议类型,选择端口协议。支持 TCP 协议和 UDP 协议。
      • 容器端口:配置容器的端口,该端口为工作负载对外提供服务的端口号。例如:Nginx 开放的默认端口号为 80。

      标签选择器

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

      • 添加标签:输入添加工作负载的标签,关联 Service 到指定工作负载。您可以在集群管理页面左侧导航栏单击 工作负载,找到目标工作负载,获取工作负载标签。
      • 关联工作负载:直接选择工作负载,关联到 Service。当前支持关联无状态负载(Deployment)、有状态负载(Statefulset)和守护进程(DaemonSet)。

      会话保持

      是否启用会话保持功能。

      • 默认未配置,表示不启用会话保持功能。
      • 勾选 配置超时时间,启用会话保持功能,并配置会话保持的持续时间。启用后 Service 将来自同一个 IP 地址的访问请求转发到同一台后端服务器上。建议设置超时时间数值大于 120 秒。

      说明

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

  5. 单击 确定,完成配置。

通过 kubectl 命令行创建

说明

通过 kubectl 命令行配置 ClusterIP 访问类型的 Service 前请确保:

  • 已安装 kubectl 工具到本地。具体操作说明,请参见 安装和设置 kubectl
  • 已通过 kubectl 连接目标集群。具体操作说明,请参见 连接集群
  1. 创建工作负载的 YAML 文件。示例文件service-demo.yaml代码如下:
    apiVersion: v1
    kind: Service
    metadata:
      name: service-demo # 服务的名称。
    spec:
      selector:
        app: nginx # 通过标签选择器将服务与后段容器组(Pod)绑定。
      ipFamilyPolicy: PreferDualStack  # 通信协议类型。SingleStack 表示单栈,PreferDualStack 表示双栈。
      ipFamilies: # 具体使用的通信协议。单栈场景支持 IPv4、IPv6;双栈场景支持 IPv4&IPv6、IPv6&IPv4。
      - IPv6
      - IPv4
      ports:
      - name: rule # 端口映射规则名称。
        protocol: TCP # 服务协议,支持 TCP 或 UDP。
        port: 8080 # 服务端口。
        targetPort: 80 # 容器端口,即工作负载对外提供服务的端口号或端口名称,例如:Nginx 开放的默认端口号为 80。
      type: ClusterIP # 服务的类型。
    
  2. 执行以下命令,创建服务。
    kubectl apply -f service-demo.yaml
    

结果验证

查看服务

配置完成后,您可以在服务列表中查看已创建的服务,包括集群 IP(即 ClusterIP)和内部端点(内部访问域名)。

alt

访问服务

服务创建完成后,在集群内的容器或节点上访问该服务的方法如下:

  • 通过服务的ClusterIP:Port,可以访问到该服务。
  • 相同命名空间下,使用service-demo:80,可以访问到该服务。
  • 垮命名空间下,使用service-demo.default:80,可以访问到该服务。

alt