通過資源編排快速的構建負載均衡(SLB)

祝犁發表於2016-01-07

負載均衡(Load Balancer)是對多臺雲伺服器進行流量分發的負載均衡服務。負載均衡可以通過流量分發擴充套件應用系統對外的服務能力,通過消除單點故障提升應用系統的可用性。同樣在實際的專案開發中,通過多個負載均衡,我們可以方便的實現灰度釋出。

資源編排的負載均衡功能介紹

配置和管理一個負載均衡例項,主要涉及3部分的功能操作,包括:

  • 負載均衡例項屬性配置:通過例項屬性配置來定義一個負載均衡例項的型別
  • 負載均衡服務監聽配置:通過服務監聽配置來定義一個負載均衡例項的各項策略和轉發規則
  • 負載均衡後端伺服器配置:通過後端伺服器配置來定義一個負載均衡例項後端用來處理使用者請求的多個ECS例項

資源編排將上述的服務抽象為下面的資源型別:

負載均衡的實踐

首先我們建立一個空的負載均衡,和其它的資源型別一樣,我們首先建立一個JSON的模板。

建立一個負載均衡

根據模板定義我們可以選擇付費型別為按流量和固定頻寬。對於VPC型別的負載均衡需要提供相應的VpcIdVSwitchId即可。

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Resources": {
    "CreateLoadBalancer": {
      "Properties": {
        "AddressType": "internet",
        "InternetChargeType": "paybytraffic",
        "LoadBalancerName": "createByRos"
      },
      "Type": "ALIYUN::SLB::LoadBalancer"
    }
  },
  "Outputs": {
    "LoadBalanceDetails": {
      "Value": {
        "Fn::GetAtt": [
          "CreateLoadBalancer",
          "LoadBalancerId"
        ]
      }
    }
  }
}

在負載均衡上建立監聽

只建立一個負載均衡是不工作的,接著我們需要建立像對應的監聽。在下面的例子中我們建立一個HTTP的監聽,將前端的80埠對映到後端的8080埠上。

在這裡我們新增了一個新的資源ALIYUN::SLB::Listener, 基本配置和SLB的控制檯類似。相比控制檯的輸入引數,這裡抽象為了鍵值對,可以更加快捷方便的實現。建立的監聽在生產之後將會自動啟動。

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Resources": {
    "LoadBalancer": {
      "Properties": {
        "AddressType": "internet",
        "InternetChargeType": "paybytraffic",
        "LoadBalancerName": "createByRos"
      },
      "Type": "ALIYUN::SLB::LoadBalancer"
    },
    "CreateListener": {
      "Type": "ALIYUN::SLB::Listener",
      "Properties": {
          "LoadBalancerId": {"Ref": "LoadBalancer"},
          "ListenerPort": "80",
          "BackendServerPort": 8080,
          "Bandwidth": 1,
          "Protocol": "http",
          "HealthCheck": {
              "HealthyThreshold": 3,
              "UnhealthyThreshold": 3,
              "Interval": 2,
              "Timeout": 5,
              "HttpCode": "http_2xx,http_3xx,http_4xx,http_5xx"
          },
          "Scheduler": "wrr"
      }
    },
  },
  "Outputs": {
    "LoadBalanceDetails": {
      "Value": {
        "Fn::GetAtt": [
          "LoadBalancer",
          "LoadBalancerId"
        ]
      }
    }
  }
}

在負載均衡上掛載ECS資源

最後我們掛載相對應的ECS,並設定權重。權重的範圍為0-100。權重0代表著優雅的下線,將不再輸入流量。

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "InstanceOne": {
      "Description": "需要掛載的ECS的例項Id",
      "Type": "String"
    },
     "InstanceTwo": {
      "Description": "需要掛載的ECS的例項Id",
      "Type": "String"
    },   
  },
  "Resources": {
    "LoadBalancer": {
      "Properties": {
        "AddressType": "internet",
        "InternetChargeType": "paybytraffic",
        "LoadBalancerName": "createByRos"
      },
      "Type": "ALIYUN::SLB::LoadBalancer"
    },
    "CreateListener": {
      "Type": "ALIYUN::SLB::Listener",
      "Properties": {
          "LoadBalancerId": {"Ref": "LoadBalancer"},
          "ListenerPort": "80",
          "BackendServerPort": 8080,
          "Bandwidth": 1,
          "Protocol": "http",
          "HealthCheck": {
              "HealthyThreshold": 3,
              "UnhealthyThreshold": 3,
              "Interval": 2,
              "Timeout": 5,
              "HttpCode": "http_2xx,http_3xx,http_4xx,http_5xx"
          },
          "Scheduler": "wrr"
      }
    },
    "AttachEcs": {
      "Type": "ALIYUN::SLB::BackendServerAttachment",
      "Properties": {
        "LoadBalancerId": {"Ref": "LoadBalancer"},
        "BackendServers": [
            {
                "ServerId": {"Ref": "InstanceOne"},
                "Weight": 100
            },
             {
                "ServerId": {"Ref": "InstanceTwo"},
                "Weight": 100
            }           
        ]
      }    
    }
  },
  "Outputs": {
    "LoadBalanceDetails": {
      "Value": {
        "Fn::GetAtt": [
          "LoadBalancer",
          "LoadBalancerId"
        ]
      }
    }
  }
}

當開發和測試完成之後,您可以通過刪除資源棧,這樣建立的負載均衡,監聽將會被快速的刪除。

通過抽象化的模板。可以把日常的掛載SLB和解除安裝SLB通過資源編排的模板來快速的實現,降低重複勞動,提升釋出效率。

為了更加方便的簡化您的操作,我們將在下篇講解SLB的Clone。


相關文章