网络规划
在进行操作前,您需要对vSwitch、VPC和集群的网段、名称等信息进行规划,本文规划如下:
- vSwitch和VPC的网络规划 - VPC网络规划 | 对象 | VPC名称 | Region | IPv4网段 |  | 集群 | vpc-hangzhou | cn-hangzhou | 20.0.0.0/8 |  | vpc-shanghai | cn-shanghai | 21.0.0.0/8 |  | 服务网格 | vpc-hangzhou2 | cn-hangzhou | 192.168.0.0/16 |  
 
- vSwitch网络规划 
 - 重要 - 为了避免使用CEN打通VPC网络后产生路由冲突,两个vSwitch不能使用相同的网段。 
 
| 对象 | vSwitch名称 | VPC | IPv4网段 |  | 集群 | vpc-hangzhou-switch-1 | vpc-hangzhou | 20.0.0.0/16 |  | vpc-shanghai-switch-1 | vpc-shanghai | 21.0.0.0/16 |  | 服务网格 | vpc-hangzhou-switch-2 | vpc-hangzhou2 | 192.168.0.0/24 |  
 
 
- 集群的Pod和Service网络规划 | 集群名称 | Region | VPC | Pod CIDR | Service CIDR |  | ack-hangzhou | cn-hangzhou | vpc-hangzhou | 10.0.0.0/16 | 172.16.0.0/16 |  | ack-shanghai | cn-shanghai | vpc-shanghai | 10.1.0.0/16 | 172.17.0.0/16 |  
 
步骤二:使用CEN实现跨地域VPC网络互通
使用CEN打通集群之间的VPC网络,以及集群和服务网格之间的VPC网络。
- 登录云企业网控制台,创建CEN实例。具体操作,请参见创建云企业网实例。 
- 创建转发路由器。 - 在云企业网实例页面,单击步骤1创建的云企业网实例名称,然后在基本信息页签下方,单击创建转发路由器。 
- 在创建转发路由器对话框,选择地域,输入名称,然后单击确认。 
 - 本示例配置了两个转发路由器: 
- 将VPC添加到转发路由器,为上海和杭州两个转发路由器重复下列步骤,将VPC连接到转发路由器。 - 在云企业网实例页面,单击步骤1创建的云企业网实例名称,然后在基本信息页签下方,单击刚创建的转发路由器ID,进入转发路由器页面。 
- 单击地域内连接管理页签,然后单击创建网络实例连接,实例类型选择专有网络(VPC),网络实例选择Region对应的VPC实例。 
- 其他选项保持默认,单击确定创建。 
 
- 设置跨地域带宽。 - 单击步骤2创建的转发路由器名称,在页面右侧,单击创建网络实例连接。 
- 在连接网络实例对话框,配置相关信息,然后单击确定创建。 - 下图为杭州到上海的示例。地域表示当前地域,对端地域表示目标地域。关于配置项的说明,请参见跨地域连接。 
 - 创建完成后,您可以在跨地域连接管理页签,看到新创建的实例。 
 
- 添加安全组规则。 - 以下以Flannel网络插件为例,在两个集群的安全组内添加对方集群的Pod网络CIDR。 
 - 说明 - Terway网络插件请使用集群vSwitch的CIDR。您可以登录专有网络管理控制台,在交换机页面的IPv4网段列,获取vSwitch的CIDR。 
 
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 获取Pod网络CIDR。 - 在集群列表页面,选择上海地域,单击ack-shanghai集群名称,然后在集群信息页面的基本信息页签,获取ack-shanghai集群的Pod网络CIDR。 
- 返回集群列表页面,选择杭州地域,单击ack-hangzhou集群名称,然后在集群信息页面的基本信息页签,获取ack-hangzhou集群的Pod网络CIDR。 
 
- 配置安全组。 - 分别在两个集群的集群信息页面单击基本信息页签,然后单击控制面安全组右侧的安全组ID。 
- 在安全组详情页签入方向下单击手动添加。 
- 设置协议类型为全部,源对方集群的Pod网络CIDR,其他为默认值,然后单击操作列下的保存。 
 
- 分别登录两个集群的节点, 使用ping命令测试与另一个集群中的网络是否连通。具体操作,请参见节点登录。 
 
步骤三:添加集群到ASM实例并创建托管式的入口网关
- 将杭州地域和上海地域的两个集群添加到ASM实例。具体操作,请参见添加集群到ASM实例。 
- 创建入口网关。 - apiVersion: istio.alibabacloud.com/v1beta1
kind: IstioGateway
metadata:
  annotations:
    asm.alibabacloud.com/managed-by-asm: 'true'
  name: ingressgateway
  namespace: istio-system
spec:
  gatewayType: ingress
  dnsPolicy: ClusterFirst
  externalTrafficPolicy: Local
  hostNetwork: false
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  replicaCount: 1
  resources:
    limits:
      cpu: '2'
      memory: 2G
    requests:
      cpu: 200m
      memory: 256Mi
  rollingMaxSurge: 100%
  rollingMaxUnavailable: 25%
  runAsRoot: true
  serviceType: LoadBalancer
 
步骤四:部署演示应用Bookinfo
重要 以下步骤涉及到多次切换kubeconfig,建议您将两个集群的kubeconfig配置到同一个config文件中,并使用kubectl config use-context进行切换。您也可以使用kubecm或kubectx来管理多个集群的kubeconfig。
 - 使用以下内容创建bookinfo.yaml。 - 展开查看YAML内容 - apiVersion: v1
kind: Service
metadata:
  name: details
  labels:
    app: details
    service: details
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-details
  labels:
    account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: details-v1
  labels:
    app: details
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: details
      version: v1
  template:
    metadata:
      labels:
        app: details
        version: v1
    spec:
      serviceAccountName: bookinfo-details
      containers:
      - name: details
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-ratings
  labels:
    account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-v1
  labels:
    app: ratings
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ratings
      version: v1
  template:
    metadata:
      labels:
        app: ratings
        version: v1
    spec:
      serviceAccountName: bookinfo-ratings
      containers:
      - name: ratings
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: reviews
  labels:
    app: reviews
    service: reviews
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-reviews
  labels:
    account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v1
  labels:
    app: reviews
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v1
  template:
    metadata:
      labels:
        app: reviews
        version: v1
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v1:1.20.1
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
      volumes:
      - name: wlp-output
        emptyDir: {}
      - name: tmp
        emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v2
  labels:
    app: reviews
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v2
  template:
    metadata:
      labels:
        app: reviews
        version: v2
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v2:1.20.1
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
      volumes:
      - name: wlp-output
        emptyDir: {}
      - name: tmp
        emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v3
  labels:
    app: reviews
    version: v3
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v3
  template:
    metadata:
      labels:
        app: reviews
        version: v3
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v3:1.20.1
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
      volumes:
      - name: wlp-output
        emptyDir: {}
      - name: tmp
        emptyDir: {}
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: productpage
  labels:
    app: productpage
    service: productpage
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-productpage
  labels:
    account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9080"
        prometheus.io/path: "/metrics"
      labels:
        app: productpage
        version: v1
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.20.1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
      volumes:
      - name: tmp
        emptyDir: {}
---
 
- 分别在ack-hangzhou集群和ack-shanghai集群部署Bookinfo应用。 - kubectl apply -f bookinfo.yaml
 
- 使用kubectl连接到ASM实例,创建路由规则。 - 使用以下内容,创建asm.yaml。 - 展开查看YAML内容 - apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  subsets:
  - name: v1
    labels:
      version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v2-mysql
    labels:
      version: v2-mysql
  - name: v2-mysql-vm
    labels:
      version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---
	  
 
- 创建路由规则。 - kubectl apply -f asm.yaml
 
 
- 验证Bookinfo应用是否部署成功。 - 获取入口网关地址。 
- 在浏览器地址栏,输入http://{入口网关服务的IP地址}/productpage,持续刷新页面10次,访问Bookinfo应用。 - 每次刷新都会访问reviews服务的v1、v2和v3版本。您可以看到reviews服务三个版本出现的比例接近1:1:1。  
 
 
步骤五:使用跨地域故障转移和跨地域流量分布
设置跨地域故障转移
- 停用ack-hangzhou集群的review。 - 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在无状态页面设置命名空间为default,单击reviews-v1右侧操作列下的伸缩。 
- 在伸缩页面设置所需容器组数量为0,然后单击确定。 
 
- 配置DestinationRule。 - 配置DestinationRule,当1s内无法请求到reviews服务,该reviews服务将被移除1min。 
- 在网格详情页面左侧导航栏,选择。 
- 在目标规则页面单击reviews右侧操作列下的YAML。 
- 在编辑面板增加以下内容,然后单击确定。 - spec:
  ......
  trafficPolicy:
    connectionPool:
      http:
        maxRequestsPerConnection: 1
    outlierDetection:
      baseEjectionTime: 1m
      consecutive5xxErrors: 1
      interval: 1s
 - maxRequestsPerConnection:最大连接数量。 
- baseEjectionTime:最小的移除时间长度。 
- consecutive5xxErrors:连续错误数量。 
- interval:移除检测的时间间隔。 
 
 
- 启用跨地域故障转移。 - 在网格详情页面左侧导航栏,选择。 
- ASM实例版本1.22.6.66以下- 在基本信息页面,单击基于地理位置的负载均衡右侧的设置。 
- 在基于地理位置的故障转移对话框设置当策略源是cn-shanghai,源故障转移至cn-hangzhou,当策略源是cn-hangzhou,源故障转移至cn-shanghai,然后单击确认。 
 - ASM实例版本1.22.6.66及以上- 在基本信息页面,单击基于地理位置的负载均衡右侧的设置基于地理位置的负载均衡。 
- 单击跨地域规则下的设置地域优先级规则,设置故障地域是- cn-shanghai,优先转移地域为- cn-hangzhou。
 
- 单击添加,再设置故障地域是- cn-hangzhou,优先转移地域- cn-shanghai,然后单击保存配置。
 
 
 
- 执行以下命令,循环请求10次Bookinfo应用,并对路由到v2版本reviews服务的结果数量进行统计。 - for ((i=1;i<=10;i++));do curl http://<ack-hangzhou集群中80端口的入口网关地址>/productpage 2>&1|grep full.stars;done|wc -l
 - 预期输出: - 20
 - 可以看到访问10次,返回20(每次路由到v2版本reviews服务会返回两行包含- full stars的结果),说明10次请求全部路由到了ack-shanghai集群的v2版本reviews服务,跨地域故障转移成功。
 
设置跨地域流量分布
重要 跨地域流量分布能力仅支持版本≥1.22.6.66的实例。
 - 登录ASM控制台,在左侧导航栏,选择。 
- 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择。 
- 在基本信息页面,单击基于地理位置的负载均衡右侧的设置基于地理位置的负载均衡。 
- 单击设置流量分布规则,设置源为- cn-hangzhou,目标为- cn-shanghai,流量比例为10%,单击保存配置。
 
 - 说明 - 基于地理位置的负载均衡默认启用的是故障转移模式,您需要先单击页面右上角的关闭功能才可以重新选择并启用流量分布模式。 
 
- 执行以下命令,循环请求10次Bookinfo应用,验证跨地域流量分布是否成功。 - for ((i=1;i<=10;i++));do curl http://<ack-hangzhou集群中80端口的入口网关地址>/productpage 2>&1|grep full.stars;done
 - 预期输出: - <!-- full stars: -->
<!-- full stars: -->
 - 可以看到访问10次,输出2行- full stars,说明10次请求中9次路由到了ack-hangzhou集群的v1版本reviews服务,1次路由到了ack-shanghai集群的v2版本reviews服务,流量按照权重路由到多个集群成功。
 
FAQ
为什么通过云企业网CEN打通了集群VPC网络,在ASM中加入K8s集群仍然提示失败?
当您的集群处于不同地域,在打通集群VPC网络时,您若未购买跨地域流量包,或者未正确设置跨地域流量,ASM控制平面将无法连接到数据平面集群,导致ASM添加集群失败。
针对以上这个问题,您需要重新在云企业网CEN中设置跨地域流量打通集群VPC网络,具体操作,请参见步骤二:使用CEN实现跨地域VPC网络互通。