开始之前

在开始区域负载均衡任务之前,必须首先 在多个集群上安装 Istio。 这些集群必须跨越三个地区,其中包含四个可用区。 所需集群的数量可能会因您的云提供商所提供的功能而异。

为简单起见,我们假设只有一个 primary cluster 在网格中。 由于更改仅需要应用于一个集群,因此这简化了配置控制平面的过程。

我们将部署 HelloWorld 应用程序的多个实例,如下所示:

Setup for locality load balancing tasks
Setup for locality load balancing tasks

在单个多区域集群环境中,还可以配置局部负载均衡以将故障转移到同一集群内的不同区域。 要测试它,您需要创建一个具有多个工作区域的集群,并将 istiod 实例和应用程序部署到每个区域。

1: 如果您没有多区域 Kubernetes 集群,您可以使用 kind 通过以下命令在本地部署一个集群:

  1. $ kind create cluster --config=- <<EOF
  2. kind: Cluster
  3. apiVersion: kind.x-k8s.io/v1alpha4
  4. nodes:
  5. - role: control-plane
  6. - role: worker
  7. - role: worker
  8. - role: worker
  9. EOF

2: 使用 topology.kubernetes.io/zone 为每个工作节点添加区域名称标签:

  1. $ kubectl label node kind-worker topology.kubernetes.io/zone=us-south10
  2. $ kubectl label node kind-worker2 topology.kubernetes.io/zone=us-south12
  3. $ kubectl label node kind-worker3 topology.kubernetes.io/zone=us-south13

3: 将 istiod 部署到控制平面节点,并将 helloworld 应用程序部署到每个工作节点。

环境变量

本指南假定将通过默认的 Kubernetes 配置文件中的上下文访问所有集群。 以下环境变量将用于各种上下文:

变量描述
CTX_PRIMARY用于主集群的上下文。
CTX_R1_Z1用于与 region1.zone1 中的 Pod 交互的上下文。
CTX_R1_Z2用于与 region1.zone2 中的 Pod 交互的上下文。
CTX_R2_Z3用于与 region2.zone3 中的 Pod 交互的上下文。
CTX_R3_Z4用于与 region3.zone4 中的 Pod 交互的上下文。

创建 sample 命名空间

首先,启用自动注入 Sidecar 并为 sample 命名空间生成 yaml:

  1. $ cat <<EOF > sample.yaml
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. name: sample
  6. labels:
  7. istio-injection: enabled
  8. EOF

为每个集群添加 sample 命名空间:

  1. $ for CTX in "$CTX_PRIMARY" "$CTX_R1_Z1" "$CTX_R1_Z2" "$CTX_R2_Z3" "$CTX_R3_Z4"; \
  2. do \
  3. kubectl --context="$CTX" apply -f sample.yaml; \
  4. done

部署 HelloWorld

使用地域作为版本号,为每个地域生成 HelloWorld 的 yaml:

Zip

  1. $ for LOC in "region1.zone1" "region1.zone2" "region2.zone3" "region3.zone4"; \
  2. do \
  3. ./@samples/helloworld/gen-helloworld.sh@ \
  4. --version "$LOC" > "helloworld-${LOC}.yaml"; \
  5. done

应用 HelloWorld YAML 到每个地域的合适集群:

  1. $ kubectl apply --context="${CTX_R1_Z1}" -n sample \
  2. -f helloworld-region1.zone1.yaml
  1. $ kubectl apply --context="${CTX_R1_Z2}" -n sample \
  2. -f helloworld-region1.zone2.yaml
  1. $ kubectl apply --context="${CTX_R2_Z3}" -n sample \
  2. -f helloworld-region2.zone3.yaml
  1. $ kubectl apply --context="${CTX_R3_Z4}" -n sample \
  2. -f helloworld-region3.zone4.yaml

部署 Sleep

部署 Sleep 应用到 region1 zone1

Zip

  1. $ kubectl apply --context="${CTX_R1_Z1}" \
  2. -f @samples/sleep/sleep.yaml@ -n sample

等待 HelloWorld Pod

等到 HelloWorld 在每个区域的 Pod 都为 Running

  1. $ kubectl get pod --context="${CTX_R1_Z1}" -n sample -l app="helloworld" \
  2. -l version="region1.zone1"
  3. NAME READY STATUS RESTARTS AGE
  4. helloworld-region1.zone1-86f77cd7b-cpxhv 2/2 Running 0 30s
  1. $ kubectl get pod --context="${CTX_R1_Z2}" -n sample -l app="helloworld" \
  2. -l version="region1.zone2"
  3. NAME READY STATUS RESTARTS AGE
  4. helloworld-region1.zone2-86f77cd7b-cpxhv 2/2 Running 0 30s
  1. $ kubectl get pod --context="${CTX_R2_Z3}" -n sample -l app="helloworld" \
  2. -l version="region2.zone3"
  3. NAME READY STATUS RESTARTS AGE
  4. helloworld-region2.zone3-86f77cd7b-cpxhv 2/2 Running 0 30s
  1. $ kubectl get pod --context="${CTX_R3_Z4}" -n sample -l app="helloworld" \
  2. -l version="region3.zone4"
  3. NAME READY STATUS RESTARTS AGE
  4. helloworld-region3.zone4-86f77cd7b-cpxhv 2/2 Running 0 30s

恭喜您! 您已成功完成系统配置,现在可以开始进行地域负载均衡任务了!

下一步

现在,您可以配置以下负载均衡选项之一:

您只应配置负载均衡选项之一,因为这些选项是互斥的。尝试同时配置两个选项可能会导致意外行为。