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配置负载均衡
  2. 执行以下命令创建名为my-nginx-svc服务。
    kubectl apply -f my-nginx-svc.yaml
  3. 登录传统型负载均衡CLB控制台,为CLB实例创建监听并关联CCM自动创建的虚拟服务器组。
    具体操作,请参见监听概述
    重要 CLB的监听端口需要与Service Port一致。
  4. 登录传统型负载均衡CLB控制台,在CCM自动创建的虚拟服务器组中添加集群外ECS并设置权重。
    具体操作,请参见创建和管理虚拟服务器组

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

    SLB

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

1

注意事项

  • 不能跨CLB复用虚拟服务器组。
  • 一个虚拟服务器组只能与一个端口关联。
  • 集群内节点权重由CCM组件设置,集群外ECS权重需要用户手动设置。

操作步骤

  1. 登录传统型负载均衡CLB控制台,创建服务器为空的虚拟服务器组,记录虚拟服务器组的分组ID。
    具体操作,请参见创建和管理虚拟服务器组
  2. 为CLB实例创建监听并关联上一步创建的虚拟服务器组,记录实例的ID。
    具体操作,请参见监听概述
    重要 CLB的监听端口需要与Service Port一致。
  3. 在创建的虚拟服务器组中添加集群外ECS并设置权重。
    具体操作,请参见创建和管理虚拟服务器组
  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控制台,创建服务器为空的虚拟服务器组。
    具体操作,请参见创建和管理虚拟服务器组
  2. 登录传统型负载均衡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后端虚拟服务器组会自动更新。