开始之前
在开始区域负载均衡任务之前,必须首先 在多个集群上安装 Istio。 这些集群必须跨越三个地区,其中包含四个可用区。 所需集群的数量可能会因您的云提供商所提供的功能而异。
为简单起见,我们假设只有一个 primary cluster 在网格中。 由于更改仅需要应用于一个集群,因此这简化了配置控制平面的过程。
我们将部署 HelloWorld
应用程序的多个实例,如下所示:
Setup for locality load balancing tasks
在单个多区域集群环境中,还可以配置局部负载均衡以将故障转移到同一集群内的不同区域。 要测试它,您需要创建一个具有多个工作区域的集群,并将 istiod 实例和应用程序部署到每个区域。
1: 如果您没有多区域 Kubernetes 集群,您可以使用 kind
通过以下命令在本地部署一个集群:
$ kind create cluster --config=- <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
EOF
2: 使用 topology.kubernetes.io/zone
为每个工作节点添加区域名称标签:
$ kubectl label node kind-worker topology.kubernetes.io/zone=us-south10
$ kubectl label node kind-worker2 topology.kubernetes.io/zone=us-south12
$ 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:
$ cat <<EOF > sample.yaml
apiVersion: v1
kind: Namespace
metadata:
name: sample
labels:
istio-injection: enabled
EOF
为每个集群添加 sample
命名空间:
$ for CTX in "$CTX_PRIMARY" "$CTX_R1_Z1" "$CTX_R1_Z2" "$CTX_R2_Z3" "$CTX_R3_Z4"; \
do \
kubectl --context="$CTX" apply -f sample.yaml; \
done
部署 HelloWorld
使用地域作为版本号,为每个地域生成 HelloWorld
的 yaml:
$ for LOC in "region1.zone1" "region1.zone2" "region2.zone3" "region3.zone4"; \
do \
./@samples/helloworld/gen-helloworld.sh@ \
--version "$LOC" > "helloworld-${LOC}.yaml"; \
done
应用 HelloWorld
YAML 到每个地域的合适集群:
$ kubectl apply --context="${CTX_R1_Z1}" -n sample \
-f helloworld-region1.zone1.yaml
$ kubectl apply --context="${CTX_R1_Z2}" -n sample \
-f helloworld-region1.zone2.yaml
$ kubectl apply --context="${CTX_R2_Z3}" -n sample \
-f helloworld-region2.zone3.yaml
$ kubectl apply --context="${CTX_R3_Z4}" -n sample \
-f helloworld-region3.zone4.yaml
部署 Sleep
部署 Sleep
应用到 region1
zone1
:
$ kubectl apply --context="${CTX_R1_Z1}" \
-f @samples/sleep/sleep.yaml@ -n sample
等待 HelloWorld
Pod
等到 HelloWorld
在每个区域的 Pod 都为 Running
:
$ kubectl get pod --context="${CTX_R1_Z1}" -n sample -l app="helloworld" \
-l version="region1.zone1"
NAME READY STATUS RESTARTS AGE
helloworld-region1.zone1-86f77cd7b-cpxhv 2/2 Running 0 30s
$ kubectl get pod --context="${CTX_R1_Z2}" -n sample -l app="helloworld" \
-l version="region1.zone2"
NAME READY STATUS RESTARTS AGE
helloworld-region1.zone2-86f77cd7b-cpxhv 2/2 Running 0 30s
$ kubectl get pod --context="${CTX_R2_Z3}" -n sample -l app="helloworld" \
-l version="region2.zone3"
NAME READY STATUS RESTARTS AGE
helloworld-region2.zone3-86f77cd7b-cpxhv 2/2 Running 0 30s
$ kubectl get pod --context="${CTX_R3_Z4}" -n sample -l app="helloworld" \
-l version="region3.zone4"
NAME READY STATUS RESTARTS AGE
helloworld-region3.zone4-86f77cd7b-cpxhv 2/2 Running 0 30s
恭喜您! 您已成功完成系统配置,现在可以开始进行地域负载均衡任务了!
下一步
现在,您可以配置以下负载均衡选项之一:
您只应配置负载均衡选项之一,因为这些选项是互斥的。尝试同时配置两个选项可能会导致意外行为。