IBM Cloud Docs
基于策略的负载均衡

基于策略的负载均衡

公共和私有应用负载平衡器都支持第 4 层和第 7 层负载平衡,根据配置的策略和规则分配数据流量。 当入局请求与与策略关联的规则匹配时,策略将定义要执行的操作,这表示流量的分布方式。

第7层策略

您可以为 HTTP 和 HTTPS 听众定义政策。 对于每个策略,必须定义一个或多个规则。 只有当所有规则都匹配时,才会应用该策略。

您可以为监听器附加多个策略。 通常,首先对具有最低优先级的策略求值。 每个策略必须具有不同的优先级。

如果传入请求不符合任何策略规则,系统请求将重定向到配置的 HTTPS 重定向侦听器(如果存在)。 否则,系统会将请求重定向到侦听器的缺省池。 HTTPS 重定向优先级高于 HTTP 侦听器上的默认池。

层 7 策略支持以下操作:

  • 拒绝- 请求被拒绝,回复 403。
  • 重定向- 将请求重定向到配置的 URL 和响应代码。
  • 转发到池- 将请求发送到特定的后端池。
  • 转发给监听器- 将请求发送给特定的前端监听器。
  • HTTPS 重定向 —— 请求重定向到 监听器。HTTP HTTPS

策略属性

政策属性说明
属性 描述
名称 策略的名称。 名称在侦听器中必须唯一。
操作 所有策略规则匹配时要执行的操作。 可接受的值为 reject, redirect, forward_to_pool, forward_to_listenerhttps_redirect
优先级 将根据优先级升序对策略求值。
优先级 将根据优先级升序对策略求值。
URL 在操作设置为 redirect 的情况下,请求将重定向到的 URL。 您必须提供一个完整的 URL 或URI的参数。 当使用 URL 时,所有传入流量将重定向到这个 URL。 使用 URI 参数时,可通过使用参数的传入值来保留传入流量请求的值。 URI 参数的默认值等于其原始输入值。 要保留输入的值,请将它们作为 {protocol}{port}{host}{path}{query} 提供。 例如,如果传入请求的主持人是 ibm.com,则默认值是 {host},等于传入的 ibm.com 值。
HTTP 状态码 当操作设置为 redirecthttps_redirect 时,应用程序负载平衡器返回的响应状态代码。 可接受的值为 301, 302, 303, 307,或 308
目标 如果操作设置为 forward_to_pool,请求将转发到虚拟服务器实例的后端池。 或者,如果操作设置为 forward_to_listener,请求会被转发到同一 ALB 的前端监听器。
侦听器 如果操作设置为 https_redirect,请求将重定向到 HTTPS 监听器。
URI 请求重定向到的相对 URI (如果操作为 https_redirect)。 此属性可选。

第 7 层规则

规则定义了如何匹配请求。 同时支持基于 URI 的路由和基于参数的路由。 支持五种规则,描述如下。

第 7 层规则
类型 描述
hostname 请求与指定的 hostname 匹配,如 api.my_company.com
header 请求匹配 HTTP header 字段和值,例如 Cookie: xxxx
path 请求与 URL 中 hostname 后面的 path 匹配,例如 /index.html
query 请求与 URL 中的 query 匹配,例如 x=yquery 字符串必须进行百分比编码,并且区分大小写。
body POST 请求的 body 请求是表单编码的。 请求与主体匹配,例如 key=value。 区分大小写。
sni_hostname 在 TLS 协商过程中,“服务器名称指示”扩展中提供的服务器与指定的 SNI 主机名相匹配。

要匹配请求,必须在规则中定义 condition 语句。 支持三个条件,描述如下。

规则中定义的条件语句
条件 求值类型
contains 验证基于 type 抽取的值是否包含 value 中指定的字符串。
equals 验证基于 type 抽取的值是否与 value 中指定的字符串相同。
matches_regex 将基于 type 抽取的值与 value 中指定的正则表达式匹配。

规则属性

下表描述了第7层策略规则属性。

规则属性说明
属性 描述
type 指定规则的类型。 可接受的值为 hostnameheaderpathquerybody
condition 指定用于对规则求值的条件。 条件可以是 contains, equals,或 matches_regex
field 指定字段名称。 此字段仅适用于 header querybody 规则类型,并且不支持正则表达式和通配符。 例如,要匹配 HTTP 头中的 cookie,可以将该字段设置为 cookie。 当规则类型为 querybody 时,此字段是可选的。 此属性不适用于 sni_hostname 规则类型。
value 要匹配的字符串。 不支持通配符。 如果 condition 设置为 matches_regex,那么支持正则表达式。

  • 如果规则类型为 header,那么 fieldvalue 不允许使用以下字符: "(),/:;<=>?@[\]{}'
  • 如果规则类型为 body,那么 fieldvalue 不允许使用以下字符: "'=,()& 和空格。
  • 如果规则类型为 query,那么 fieldvalue 必须是百分比编码的字符串。

举例说明:制定政策和规则

以下层 7 示例显示了如何创建策略和规则并使其与侦听器相关联。

示例1:创建一个具有重定向策略的 HTTPS 侦听器

curl -H "Authorization: $iam_token" -X POST
"$vpc_api_endpoint/v1/load_balancers/$lbId/listeners" \
    -d '{
            "certificate_instance": {
                "crn": "crn:v1:bluemix:public:cloudcerts:us-south:a/1111111111111111111111111111:22222222-3333-4444-5555-666666666666:certificate:77777777777777777777777777777777"
            },
            "connection_limit": 2000,
            "port": 443,
            "protocol": "https",
            "policies": [
                {
                    "name": "hostname_header",
                    "action": "redirect",
                    "priority": 1,
                    "target": {
                        "url": "https://www.examples.com/",
                        "http_status_code": 307
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        },
                        {
                            "condition": "equals",
                            "type": "hostname",
                            "value": "abc.com"
                        }
                    ]
                },
                {
                    "name": "header_cookie",
                    "action": "redirect",
                    "priority": 5,
                    "target": {
                        "url": "https://www.mycookies.com/",
                        "http_status_code": 302
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        },
                        {
                            "condition": "equals",
                            "type": "header",
                            "field": "cookie",
                            "value": "flavor=oatmeal"
                        }
                    ]
                },
                {
                    "name": "path_hostname",
                    "action": "redirect",
                    "priority": 10,
                    "target": {
                        "url": "https://www.myexamples.com/",
                        "http_status_code": 301
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "hostname",
                            "value": "abc"
                        },
                        {
                            "condition": "equals",
                            "value": "/test",
                            "type": "path"
                          }
                    ]
                },
                {
                    "name": "uri_redirect",
                    "action": "redirect",
                    "priority": 10,
                    "target": {
                        "url": "https://{host}:8080/{path}?{query}",
                        "http_status_code": 301
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "hostname",
                            "value": "pqr"
                        }
                    ]
                }
            ]
        }'

例 2:创建将请求转发到资源库的策略,并将其与现有监听器关联

curl -H "Authorization: $iam_token" -X POST
"$vpc_api_endpoint/v1/load_balancers/$lbId/listeners/$listenerId/policies" \
    -d '{
            "policies": [
                {
                    "action": "forward",
                    "priority": 1,
                    "target": {
                        "id": "7df616da-4dd6-43d3-881d-801ae29e29fe"
                    },
                    "rules": [
                        {
                            "condition": "equals",
                            "type": "header",
                            "field": "cookie",
                            "value": "flavor=oatmeal"
                        }
                    ]
                },
                {
                    "action": "forward",
                    "priority": 5,
                    "target": {
                        "id": "0738-8061c411-0d50-4c79-b475-102666796434"
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        }
                    ]
                },
                {
                    "action": "forward",
                    "priority": 10,
                    "target": {
                        "id": "0738-62914e09-3928-4d89-b7f7-1bb7a6d7fe85"
                    },
                    "rules": [
                        {
                            "condition": "matches_regex",
                            "type": "hostname",
                            "value": "abc[a-z]*.com"
                        }
                    ]
                },
                {
                    "action": "forward",
                    "priority": 6,
                    "target": {
                        "id": "0738-62914e09-3928-4d89-b7f7-1bb7a6d7fe85"
                    },
                    "rules": [
                        {
                            "condition": "equals",
                            "type": "path",
                            "value": "/test/testtest"
                        }
                    ]
                }
            ]
        }'

示例3:创建一个具有https重定向策略的 HTTP 监听器

curl -H "Authorization: $iam_token" -X POST
"$vpc_api_endpoint/v1/load_balancers/$lbId/listeners" \
    -d '{
            "connection_limit": 2000,
            "port": 80,
            "protocol": "http",
            "policies": [
                {
                    "name": "hostname_header",
                    "action": "https_redirect",
                    "priority": 1,
                    "target": {
                        "listener": {
                            "id": "0134-d578be10-31e3-46b3-8513-79babb852319"
                        },
                        "http_status_code": 307
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        },
                        {
                            "condition": "equals",
                            "type": "hostname",
                            "value": "abc.com"
                        }
                    ]
                },
                {
                    "name": "header_cookie",
                    "action": "https_redirect",
                    "priority": 2,
                    "target": {
                        "listener": {
                            "id": "0456-a578be10-31e3-46b3-8513-79babb852398"
                        },
                        "http_status_code": 302
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "header",
                            "field": "aheader",
                            "value": "avalue"
                        },
                        {
                            "condition": "equals",
                            "type": "header",
                            "field": "cookie",
                            "value": "flavor=oatmeal"
                        }
                    ]
                },
                {
                    "name": "path_hostname",
                    "action": "https_redirect",
                    "priority": 5,
                    "target": {
                        "listener": {
                            "id": "0386-d898be10-21e3-66b3-9513-69babb852390"
                        },
                        "http_status_code": 301,
                        "uri": "/test/sample"
                    },
                    "rules": [
                        {
                            "condition": "contains",
                            "type": "hostname",
                            "value": "abc"
                        },
                        {
                            "condition": "equals",
                            "value": "/test",
                            "type": "path"
                          }
                    ]
                }
            ]
        }'

第 4 层政策

您可以为 TCP 监听器定义策略。 对于每个策略,必须定义一个或多个规则。 与第 7 层策略类似,第 4 层策略优先级最低,只有在所有指定规则都匹配时才会应用。

如果传入请求不符合任何策略的规则,客户端可能会收到 SSL 错误。

第 4 层策略支持以下操作:

  • 转发到池- 请求被发送到特定的后端池。
  • 转发给监听器- 将请求发送给特定的前端监听器。

第 4 层规则

第 4 层规则定义如何匹配请求,与第 7 层规则相同。 但只支持 sni_hostname 类型,其中 field 不适用,conditionvalue 属性与第 7 层规则相同。

示例使用 sni_hostname 规则创建 TCP 监听器

curl -H "Authorization: $iam_token" -X POST
"$vpc_api_endpoint/v1/load_balancers/$lbId/listeners"     -d '{
            "connection_limit": 2000,
            "port": 443,
            "protocol": "tcp",
            "policies": [
                {
                    "action": "forward_to_listener",
                    "name": "listener-forward-policy",
                    "priority": 4,
                    "rules": [
                      {
                        "condition": "equals",
                        "type": "sni_hostname",
                        "value": "www.example.com"
                      }
                    ],
                    "target": {
                      "id": "r134-20275400-825e-4d9b-8177-076fdb4134cc"
                    }
                }
            ]
        }'