文档

通过CCM跨集群部署服务

更新时间:

CCM(Cloud Controller Manager)是ACK的一个系统核心组件,支持在同一个CLB后端挂载集群内节点和集群外ECS,可以解决迁移过程中流量中断的难题。同时CCM还支持将业务流量转发至多个Kubernetes集群内,支撑备份、容灾等需求,保障业务高可用。本文通过三个典型场景介绍如何通过CCM跨集群部署服务。

前提条件

背景信息

CCM提供Kubernetes与阿里云基础产品的对接能力,例如CLB、VPC等。目前CCM的功能包括管理负载均衡、跨节点通信等。

  • 当Service的类型设置为Type=LoadBalancer时,CCM会为该Service创建或配置阿里云负载均衡CLB,包括CLB、监听、后端服务器组等资源。

  • 当Service对应的后端Endpoint或者集群节点发生变化时,CCM会自动更新CLB的后端虚拟服务器组。

更多信息,请参见Cloud Controller Manager

场景一:将流量转发至集群内节点和集群外ECS

CCM支持在同一个CLB后端挂载集群内节点和集群外ECS,将流量分别转发至集群内部和外部。

1

  1. 使用以下示例服务的YAML内容,创建名为my-nginx-svc.yaml的文件。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID}             # ${YOUR_LB_ID}替换为您通过负载均衡管理控制台创建的CLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"  # 设置为false,CCM不会为CLB管理任何监听配置。
      labels:
        app: nginx
      name: my-nginx-svc
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:   # 将selector修改为my-nginx.yaml示例应用文件中matchLabels的值(即:app: nginx),从而将该服务关联至后端应用。
        app: nginx      
      type: LoadBalancer
    说明
    • CCM会使用该CLB作为Service的负载均衡,并根据其他注解配置CLB,自动为CLB创建多个虚拟服务器组。

    • CCM还提供了许多阿里云注解,支持丰富的负载均衡能力。更多信息,请参见通过Annotation配置传统型负载均衡CLB

  2. 执行以下命令创建名为my-nginx-svc服务。

    kubectl apply -f my-nginx-svc.yaml
  3. 登录传统型负载均衡CLB控制台,为CLB实例创建监听并关联CCM自动创建的虚拟服务器组。

    具体操作,请参见CLB监听概述

    重要

    CLB的监听端口需要与Service Port一致。

  4. 登录传统型负载均衡CLB控制台,在CCM自动创建的虚拟服务器组中添加集群外ECS并设置权重。

    具体操作,请参见创建和管理CLB虚拟服务器组

    配置完成后,在传统型负载均衡CLB控制台编辑虚拟服务器组页面,既可以看到集群内的节点(图示中①),也可以看到集群外的ECS(图示中②)。集群内应用进行扩缩容时,集群外的ECS节点不受影响。

    SLB

场景二:支持为集群内部及外部ECS设置权重

1

注意事项

  • 不能跨CLB复用虚拟服务器组。

  • 一个虚拟服务器组只能与一个端口关联。

  • 集群内节点权重由CCM组件设置,集群外ECS权重需要用户手动设置。

操作步骤

  1. 登录传统型负载均衡CLB控制台,创建服务器为空的虚拟服务器组,记录虚拟服务器组的分组ID。

    具体操作,请参见创建和管理CLB虚拟服务器组

  2. 为CLB实例创建监听并关联上一步创建的虚拟服务器组,记录实例的ID。

    具体操作,请参见CLB监听概述

    重要

    CLB的监听端口需要与Service Port一致。

  3. 在创建的虚拟服务器组中添加集群外ECS并设置权重。

    具体操作,请参见创建和管理CLB虚拟服务器组

  4. 使用以下示例应用的YAML内容,创建名为service.yaml的文件。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxx"  # lb-xxxxx替换为您通过负载均衡管理控制台创建的CLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80"   # ${YOUR_VGROUP_ID}替换为虚拟服务器组ID。    
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "60"   # 设置Service流量权重,该参数可选。
      name: nginx-svc
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      sessionAffinity: None
      type: LoadBalancer
  5. 执行以下命令创建名为service服务。

    kubectl apply -f service.yaml

    配置完成后,在传统型负载均衡CLB控制台编辑虚拟服务器组页面,既可以看到集群内的节点(图示中①),也可以看到集群外的ECS(图示中②)。集群内应用进行扩缩容时,集群外的ECS节点不受影响。

    SLB

场景三:将流量转发至多个Kubernetes集群内

通常企业会采取多种措施以保障应用的高可用性,例如创建多个集群进行备份容灾。这要求业务流量可以通过一个CLB接入多个Kubernetes集群,并且为Kubernetes集群设置不同的权重,示意图如下。

3

重要
  • 不能跨CLB复用虚拟服务器组。

  • 一个虚拟服务器组只能与一个端口关联。

  • 集群的命名空间+Service的组合名称不能相同。

  1. 登录传统型负载均衡CLB控制台,创建服务器为空的虚拟服务器组。

    具体操作,请参见创建和管理CLB虚拟服务器组

  2. 登录传统型负载均衡CLB控制台,为CLB实例创建监听并关联上一步创建的虚拟服务器组。

    具体操作,请参见CLB监听概述

    重要

    CLB的监听端口需要与Service Port一致。

  3. 使用以下示例应用的YAML内容,在集群A中创建名为service-a.yaml的文件。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}"                   # ${YOUR_LB_ID}替换为您通过负载均衡管理控制台创建的CLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80"   # ${YOUR_VGROUP_ID}替换为虚拟服务器组ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "20"                          # 设置Service流量权重,该参数可选。
      name: service-a     # service-a文件。
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      sessionAffinity: None
      type: LoadBalancer
    说明

    如果service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port有多个端口及虚拟服务器组的组合,可以通过英文半角逗号(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。

  4. 执行以下命令创建名为service-a服务。

    kubectl apply -f service-a.yaml
  5. 使用以下示例应用的YAML内容,在集群B中创建名为service-b.yaml的文件。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}"                  # ${YOUR_LB_ID}替换为您通过负载均衡管理控制台创建的CLB实例ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80"  # ${YOUR_VGROUP_ID}替换为虚拟服务器组ID。
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "80"                         # 设置Service流量权重,该参数可选。
      name: service-b      # service-b文件。
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      sessionAffinity: None
      type: LoadBalancer
    说明

    如果service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port有多个端口及虚拟服务器组的组合,可以通过半角逗号(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。

  6. 执行以下命令创建名为service-b服务。

    kubectl apply -f service-b.yaml

    配置完成后,在传统型负载均衡CLB控制台编辑虚拟服务器组页面,既可以看到集群A的节点,也可以看到集群B的节点。集群节点的权重按照注解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight自动设置。集群内应用进行扩缩容时,CLB后端虚拟服务器组会自动更新。

  • 本页导读 (1)