农民 发表于 2024-5-16 23:14:02

基于istio实现单集群地域故障转移

本文分享自华为云社区《基于istio实现单集群地域故障转移》,作者:可以交个朋侪。
一 背景

随着应用步伐的增长并变得更加复杂,微服务的数目也会增加,失败的可能性也会增加。微服务的故障可能多种原因造成,例如硬件题目、网络延迟、软件错误,乃至人为错误。故障转移Failover 是体系韧性设计中的一个基础能力,它们可以确保体系在出现故障时能够继续运行,并且能够在最小化的影响下举行恢复,减少或者消除对使用方或终极用户的影响,从而提高整个体系对外的可用性。
二 简介

云原生K8s、istio默认使用node上特定label作为地域信息:

[*]地区:代表较大的地理区域,例如 us-east。一个地区通常包罗许多可用区。 在 Kubernetes 中,标签topology.kubernetes.io/region 决定了节点所在的地区。
[*]区域:区域内的一组计算资源。通过在区域内的多个区域中运行服务,可以在区域内的区域之间举行故障转移, 同时保持终极用户的数据地域性。在 Kubernetes 中,标签topology.kubernetes.io/zone决定了节点所在的区域。
[*]分区:允许管理员进一步细分区域,以实现更细粒度的控制,例如“相同机架”。 Kubernetes 中不存在分区的概念。所以 Istio 引入了自界说节点标签 topology.istio.io/subzone 来界说分区。
kubectl describe node xxx |grep topo
https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/519/984/817/2850086000519984817.20240410113204.19099649264190929429956514164771:50001231000000:2800:62D82EACB5FB3943FA22E4BAA3136B69B8E19BCBF0A85F3880F39F78345A111F.png
如下图所示演示环境,helloworld作为服务端有多个实例分别部署在不同zone中(不同zone节点topology.kubernetes.io/zone的label不同)。通过istio的destinationrule中localityLbSetting.failover(故障转移策略)和outlierDetection(故障异常点检测),可以实现客户端业务访问helloworld服务时候,优先访问与客户端同可用区的服务端,当同可用区的helloworld服务端全部故障后,再访问指定可用区的服务端,实现故障转移。
https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/519/984/817/2850086000519984817.20240410113204.63523539126477808057377762677220:50001231000000:2800:9FA885FEAB0F77FE30508E4887E2FF5296CA762C841D0E0AEE379C30DC8B6763.png
三 实战演练

事先准备好kubernetes+istio作为操纵环境。可用华为云CCE和ASM服务举行操纵。
3.1 部署服务端

1.创建sample 命名空间,并设置istio-proxy sidecar自动注入
apiVersion: v1
kind: Namespace
metadata:
name: sample
labels:
    istio-injection: enabled2.部署helloworld服务 作为服务端
将根据以下脚本天生对yaml配置清单
#!/bin/bashset -euo pipefaildisplay_usage() {    echo    echo "USAGE: ./gen-helloworld.sh [--version] [--includeService value] [--includeDeployment value]"    echo "    -h|--help: Prints usage information"    echo "    --version: Specifies the version that will be returned by the helloworld service, default: 'v1'"    echo "    --includeService: If 'true' the service will be included in the YAML, default: 'true'"    echo "    --includeDeployment: If 'true' the deployment will be included in the YAML, default: 'true'"}INCLUDE_SERVICE=${INCLUDE_SERVICE:-"true"}INCLUDE_DEPLOYMENT=${INCLUDE_DEPLOYMENT:-"true"}SERVICE_VERSION=${SERVICE_VERSION:-"v1"}while (( "$#" )); docase "$1" in    -h|--help)      display_usage      exit 0      ;;    --version)      SERVICE_VERSION=$2      shift 2      ;;    --includeService)      INCLUDE_SERVICE=$2      shift 2      ;;    --includeDeployment)      INCLUDE_DEPLOYMENT=$2      shift 2      ;;    *)      echo "Error: Unsupported flag $1" >&2      display_usage      exit 1      ;;esacdoneSERVICE_YAML=$(cat
页: [1]
查看完整版本: 基于istio实现单集群地域故障转移