云服务器内容精选

  • VPC网段之间的网络连通 登录云容器引擎控制台,选择本端集群,进入集群详情页,单击左侧导航栏“节点管理”,进入节点详情页。 单击“节点名称”下的节点,在弹出的页面中单击右上角“远程登录”,选择VNC方式登录。 根据界面提示,输入账号和密码,成功进入Linux环境中。 在云容器引擎控制台中,选择对端集群,进入集群详情页,单击左侧导航栏“节点管理”,进入节点详情页。 在3中,使用Linux命令查看网络是否连通。对端集群节点IP为4中的节点IP。例如:ping 172.X.X.X。 在对端集群中执行相同的操作。
  • 操作步骤 创建nginx-v1服务 进入CCE Console页面,单击在网格已添加的CCE集群名称进入集群详情页,单击“服务-服务”,选择对应命名空间,单击“创建服务”按钮。 参数填写说明: Service名称:自定义服务名称,例如nginx-v1。 访问类型:选择集群内访问。 选择器:单击“引用负载标签”,选择对应的工作负载,例如nginx。 端口配置:容器端口填写业务容器进程监听端口,例如80。服务端口填写通过service访问的端口,例如5566。 创建nginx-v2服务 参考步骤1创建nginx-v2服务。 创建基于流量比例的路由 进入华为云U CS 控制台,依次单击“服务网格-要配置的网格名称-服务网关-网关路由-HTTP路由-YAML创建”。 使用以下内容,创建nginx-canary网关路由。 apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: nginx-canary namespace: whtest spec: parentRefs: - group: gateway.networking.k8s.io kind: Gateway name: gwtest1 namespace: whtest rules: - backendRefs: - group: '' kind: Service name: nginx-v1 port: 5566 weight: 30 - group: '' kind: Service name: nginx-v2 port: 5566 weight: 70 matches: - path: type: PathPrefix value: / 该配置表示路由规则引用whtest命名空间下名为gwtest1的Gateway资源。因为未指定监听器名称,此处会尝试引用该Gateway的所有监听器。对于路径前缀为/的请求,将30%流量路由到同命名空间下的nginx-v1服务的5566端口,将70%流量路由到同命名空间下的nginx-v2服务的5566端口。 验证基于流量比例的路由生效 等待几秒钟待新规则配置下发成功,通过网关访问目标服务nginx应用,查看路由规则是否生效。 查看方法如下: 在浏览器中输入地址 http://$GATEWAY_ELB_IP:$GATEWAY_PORT/ ,其中, $GATEWAY_ELB_IP 是路由引用的whtest命名空间下名为gwtest1的网关的负载均衡公网地址; $GATEWAY_PORT是gwtest1网关的监听器对外端口。 预期结果: 反复多次刷新浏览器,约有70%的时间可以看到v2版本的nginx服务内容。
  • 使用场景 服务网关是网格的流量入口,网格外部的客户端通过服务网关访问网格内的服务。目前默认是基于Kubernetes Gateway API模型实现网关能力,网格服务详情中的灰度发布策略只适用于东西向网格内部服务间;对于南北向入口网关的目标服务,如果需要配置灰度发布策略,可参考下文为入口网关的目标服务配置灰度发布策略。 东西向网格内部服务间灰度发布,使用的是Istio的VirtualService/DestinationRule模型,依赖DestinationRulesubsets 来定义服务的版本。 南北向入口网关的目标服务灰度发布,使用的是Kubernetes Gateway API的后端服务定义(backend service definitions),依赖定义多个service来定义服务的版本。
  • 如何使用Istio API配置网关路由规则 ASM支持使用Istio API(Gateway, VirtualService, DestinationRule)配置网关、路由规则策略。本文介绍如何通过YAML创建资源对象启用该能力。 使用以下内容,保存为deployment.yaml文件,创建istio-ingressgateway deployment工作负载。 kind: Deployment apiVersion: apps/v1 metadata: name: istio-ingressgateway namespace: default # 命名空间名称,按需替换 spec: replicas: 1 # 工作负载实例数,按需替换 selector: matchLabels: app: istio-ingressgateway istio: ingressgateway template: metadata: labels: app: istio-ingressgateway istio: ingressgateway istio.io/rev: default service.istio.io/canonical-name: istio-ingressgateway service.istio.io/canonical-revision: latest sidecar.istio.io/inject: 'false' annotations: sidecar.istio.io/inject: 'false' spec: volumes: - name: workload-socket emptyDir: {} - name: credential-socket emptyDir: {} - name: workload-certs emptyDir: {} - name: istiod-ca-cert configMap: name: istio-ca-root-cert defaultMode: 384 - name: podinfo downwardAPI: items: - path: labels fieldRef: apiVersion: v1 fieldPath: metadata.labels - path: annotations fieldRef: apiVersion: v1 fieldPath: metadata.annotations defaultMode: 416 - name: istio-envoy emptyDir: {} - name: istio-data emptyDir: {} - name: istio-token secret: defaultMode: 420 optional: false secretName: cp-access-default - name: config-volume configMap: name: istio defaultMode: 416 optional: true - name: ingressgateway-certs secret: secretName: istio-ingressgateway-certs defaultMode: 384 optional: true - name: ingressgateway-ca-certs secret: secretName: istio-ingressgateway-ca-certs defaultMode: 384 optional: true containers: - name: istio-proxy image: swr.cn-north-7.myhuaweicloud.com/asm/proxyv2:1.15.5-r1-20230719152011 # proxyv2镜像地址替换 args: - proxy - router - '--domain' - $(POD_NAMESPACE).svc.cluster.local - '--proxyLogLevel=warning' - '--proxyComponentLogLevel=misc:error' - '--log_output_level=default:info' ports: - containerPort: 15021 protocol: TCP - containerPort: 8080 protocol: TCP - containerPort: 8443 protocol: TCP - name: http-envoy-prom containerPort: 15090 protocol: TCP env: - name: JWT_POLICY value: third-party-jwt - name: PILOT_CERT_PROVIDER value: istiod - name: CA_ADDR value: asm-mesh.kube-system.svc.cluster.local:15012 - name: NODE_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.nodeName - name: POD_NAME valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: INSTANCE_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.podIP - name: PROXY_CONFIG value: | {"discoveryAddress":"asm-mesh.kube-system.svc.cluster.local:15012"} - name: HOST_IP valueFrom: fieldRef: apiVersion: v1 fieldPath: status.hostIP - name: SERVICE_ACCOUNT valueFrom: fieldRef: apiVersion: v1 fieldPath: spec.serviceAccountName - name: ISTIO_META_WORKLOAD_NAME value: istio-ingressgateway - name: ISTIO_META_OWNER value: kubernetes://apis/apps/v1/namespaces/default/deployments/istio-ingressgateway # default替换为对应的命名空间名称 - name: ISTIO_META_MESH_ID value: whtest # 替换为实际的网格名称 - name: TRUST_DOMAIN value: cluster.local - name: ISTIO_META_UNPRIVILEGED_POD value: 'true' - name: ISTIO_ADDITIONAL_METADATA_EXCHANGE_KEYS value: ASM_MESH_ID,ASM_CLUSTER_ID - name: ISTIO_META_ASM_CLUSTER_ID value: 92311000-df43-11ed-b108-0255ac1001bb # 替换为实际的集群ID - name: ISTIO_META_ASM_MESH_ID value: a8653674-3fd2-11ee-9e48-0255ac100695 # 替换为实际的网格ID - name: ISTIO_META_CLUSTER_ID value: mesh-test # 替换为实际的集群名称 resources: limits: cpu: '2' memory: 1Gi requests: cpu: 100m memory: 128Mi volumeMounts: - name: workload-socket mountPath: /var/run/secrets/workload-spiffe-uds - name: credential-socket mountPath: /var/run/secrets/credential-uds - name: workload-certs mountPath: /var/run/secrets/workload-spiffe-credentials - name: istio-envoy mountPath: /etc/istio/proxy - name: config-volume mountPath: /etc/istio/config - name: istiod-ca-cert mountPath: /var/run/secrets/istio - name: istio-token readOnly: true mountPath: /var/run/secrets/tokens - name: istio-data mountPath: /var/lib/istio/data - name: podinfo mountPath: /etc/istio/pod - name: ingressgateway-certs readOnly: true mountPath: /etc/istio/ingressgateway-certs - name: ingressgateway-ca-certs readOnly: true mountPath: /etc/istio/ingressgateway-ca-certs readinessProbe: httpGet: path: /healthz/ready port: 15021 scheme: HTTP initialDelaySeconds: 1 timeoutSeconds: 1 periodSeconds: 2 successThreshold: 1 failureThreshold: 30 terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullPolicy: IfNotPresent securityContext: capabilities: drop: - ALL privileged: false readOnlyRootFilesystem: true allowPrivilegeEscalation: false restartPolicy: Always terminationGracePeriodSeconds: 30 dnsPolicy: ClusterFirst securityContext: runAsUser: 1337 runAsGroup: 1337 runAsNonRoot: true fsGroup: 1337 seccompProfile: type: RuntimeDefault affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: istio operator: In values: - master podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - istio-ingressgateway topologyKey: kubernetes.io/hostname schedulerName: default-scheduler tolerations: - key: istio operator: Exists effect: NoExecute strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 10% revisionHistoryLimit: 10 progressDeadlineSeconds: 600 执行以下命令,在当前集群中创建网关工作负载。 kubectl create -f deployment.yaml 使用以下内容,保存为svc.yaml文件,创建istio-ingressgateway loadbalancer service。 apiVersion: v1 kind: Service metadata: name: gw-svc1 namespace: default # 命名空间名称,按需替换 annotations: kubernetes.io/elb.class: union # elb实例类型,union共享型,performance独享型 kubernetes.io/elb.id: 73febb1c-b191-4fd9-832e-138b2657d3b1 # elb实例ID,可通过在cce服务发现创建负载均衡类型服务页查看可选择的elb实例 spec: ports: - name: http-gw-svc1-port1 # 端口名称,注意以服务协议打头 protocol: TCP port: 707 # 对外访问端口 targetPort: 1026 # 容器端口,必须大于1024,且不能与网格内其他网关服务使用的targetPort端口重复 selector: app: istio-ingressgateway istio: ingressgateway type: LoadBalancer sessionAffinity: None externalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack allocateLoadBalancerNodePorts: true internalTrafficPolicy: Cluster 执行以下命令,在当前集群中创建网关工作负载对应的loadbalancer service。 kubectl create -f svc.yaml 以上步骤1、2使用的kubectl连接的是当前集群。 使用以下内容,保存为gw.yaml文件,创建Istio Gateway配置。 apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: my-gateway namespace: default # 命名空间名称,按需替换 spec: selector: istio: ingressgateway servers: - hosts: - 100.85.115.86 # 使用的elb实例公网IP port: name: http-48382bd9 number: 1026 # 同上lb svc的targetPort protocol: http 执行以下命令,在网格控制面中创建网关Gateway资源对象。 kubectl create -f gw.yaml 使用以下内容,保存为vs.yaml文件,创建Istio VirtualService配置。 apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: nginx namespace: default # 命名空间名称,按需替换 spec: hosts: - 100.95.150.38 # 使用的elb实例公网IP gateways: - default/my-gateway # 使用步骤3的gw的命名空间、名称 http: - match: - headers: cookie: exact: "user=dev-123" route: - destination: port: number: 1234 host: nginx.default.svc.cluster.local 执行以下命令,在网格控制面中创建VirtualService资源对象。 kubectl create -f vs.yaml 结果验证。执行以下命令,访问nginx服务成功。 父主题: 服务网格
  • 网格配置概述 网格配置提供了集群管理、系统组件管理、sidecar管理、istio资源管理以及升级能力。 Istio控制面组件负责向数据面组件注入sidecar,管理数据面sidecar行为,下发策略配置,搜集监控数据等。其中,sidecar是指运行在业务Pod中,与业务容器协同工作,负责业务Pod的路由转发,监控数据采集,流量规则配置等功能。 “网格配置”中各个页签的功能如下: “基本信息”页签:可查看网格名称、网格ID、网格状态、网格类型、网格规格、当前版本、计费模式、网格控制面网段、可观测性以及已启用网格的集群。 企业版网格还支持添加、移除集群,详情请参见添加集群。 “系统组件管理”页签:(仅企业版网格包含)展示所有控制面组件对应的工作负载,包括istio-egressgateway、istio-ingressgateway、istio-eastwestgateway(非扁平网络包含)和istiod。如果启用了大规格实例优化(即安装Mantis插件),还会显示mantis-centralgateway组件的信息。 “sidecar管理”页签:支持查看所有注入了sidecar的工作负载信息,还可以进行sidecar注入、配置sidecar资源限制等操作。详情请参见sidecar管理。 “istio资源管理”页签:展示所有istio资源(如VirtualService、DestinationRule),还支持以YAML或JSON格式创建新的istio资源,或对现有istio资源进行修改。详情请参见istio资源管理。 “升级”页签:提供网格版本升级能力。详情请参见升级网格。 “网格扩展”页签:配置可观测性配置。详情请参见网格扩展。 父主题: 网格配置
  • 查看流量监控情况 登录应用服务网格控制台,单击已对接 APM 的服务网格名称进入详情页面。 在左侧导航栏中选择“监控中心”-“流量监控”。 查看整个系统的监控情况。 拓扑图中显示了系统处于运行中和未就绪的应用数量。 图1 流量拓扑 查看某个组件的监控情况。 选择服务网格、集群及命名空间,单击拓扑图上的组件,进入组件监控详情页面,如图2所示。 图2 流量监控详情页 其中, 流量概况:展示了应用详细的流量信息,包含请求总数、错误计数、平均时延、最大时延等。 部署信息:显示了组件内的所有实例状态及信息。 调用链:通过时间维度和组件版本来查看调用情况,支持使用高级搜索中的选项进行精准搜索。使用istio做服务治理时,无需在微服务代码中进行调用链埋点。但微服务代码在接收和发送请求时需要传递调用链相关的Header信息,才能构造成完整的调用链路,详情请参见如何使用Istio调用链埋点。
  • 如何使用Istio调用链埋点 Header信息包括如下内容,更多关于调用链的信息请参见https://istio.io/docs/tasks/telemetry/distributed-tracing/。 x-request-id x-b3-traceid x-b3-spanid x-b3-parentspanid x-b3-sampled x-b3-flags x-ot-span-context 下面以一个典型的例子来说明如何在接收和发送请求时,通过修改代码来传递调用链相关Header信息。 Python代码示例 服务接收端在处理请求时,从请求端解析相关Header。在调用后端请求时,传递Trace相关的header。 def getForwardHeaders(request): headers = {} if 'user' in session: headers['end-user'] = session['user'] incoming_headers = ['x-request-id', 'x-b3-traceid', 'x-b3-spanid', 'x-b3-parentspanid', 'x-b3-sampled', 'x-b3-flags', 'x-ot-span-context' ] return headers @ app.route('/productpage') def front(): product_id = 0# TODO: replace default value headers = getForwardHeaders(request) user = session.get('user', '') product = getProduct(product_id) detailsStatus, details = getProductDetails(product_id, headers) reviewsStatus, reviews = getProductReviews(product_id, headers) return render_template( 'productpage.html', detailsStatus = detailsStatus, reviewsStatus = reviewsStatus, product = product, details = details, reviews = reviews, user = user) Java代码示例 在java Rest接口上除了解析一般业务参数外,需要从header中解析trace相关信息。同样在调用下一个服务时传递该header信息。 @GET @Path("/reviews/{productId}") public Response bookReviewsById(@PathParam("productId") int productId, @HeaderParam("end-user") String user, @HeaderParam("x-request-id") String xreq, @HeaderParam("x-b3-traceid") String xtraceid, @HeaderParam("x-b3-spanid") String xspanid, @HeaderParam("x-b3-parentspanid") String xparentspanid, @HeaderParam("x-b3-sampled") String xsampled, @HeaderParam("x-b3-flags") String xflags, @HeaderParam("x-ot-span-context") String xotspan) { int starsReviewer1 = -1; int starsReviewer2 = -1; if (ratings_enabled) { JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan); if (ratingsResponse != null) { if (ratingsResponse.containsKey("ratings")) { JsonObject ratings = ratingsResponse.getJsonObject("ratings"); if (ratings.containsKey("Reviewer1")){ starsReviewer1 = ratings.getint("Reviewer1"); } if (ratings.containsKey("Reviewer2")){ starsReviewer2 = ratings.getint("Reviewer2"); } } } } String jsonResStr = getJsonResponse(Integer.toString(productId), starsReviewer1, starsReviewer2); return Response.ok().type(MediaType.APPLICATION_JSON).entity(jsonResStr).build(); } }
  • 升级前检查说明 集群资源检查,检查规则如下: CPU : istiod+istio-ingressgateway+istio-egressgateway实例数 * cpu申请值。 Memory: istiod+istio-ingressgateway+istio-egressgateway实例数 * 内存申请值。 集群版本检查。 集群状态检查,集群状态不可用不能进行升级。 网格状态检查,网格状态不可用不能进行升级。 废弃CRD检查(1.8及以上的版本不涉及)。 1.3和1.6版本使用的部分CRD在1.8版本中会废弃,升级到1.8版本后将不可用,请在升级前进行处理,包括如下资源 clusterrbacconfigs、servicerole、servicerolebinding、policy。 Istio 网关标签检查(1.8及以上的版本不涉及)。 Istio 网关标签(matchLabels)必须为 {app: istio-ingressgateway, istio: ingressgateway}。 升级前vs格式检查(1.8及以上的版本不涉及)。 1.8及以上版本网格界面仅支持显示 delegate 格式的 VirtualService,请用户根据指南1.3升级1.8 VirtualService支持Delegate切换进行修改,否则升级后将看不到创建的网关路由。注:该检查项并不会导致升级失败。 升级前网关配置检查(1.8及以上的版本不涉及)。 1.8及以上版本网关监听端口需要大于1024,若您的网关使用了小于1024以及以下的端口需要进行整改。 升级前组件亲和性检查。 金丝雀升级将在集群里新部署一套网格控制面和网关实例,升级前需要至少确保如下一个条件。 具有istio:master label的节点数量是 istiod实例数的两倍、所有可调度节点是istio-ingressgateway、istio-egressgateway 实例个数最大值的两倍。 istiod、istio-ingressgateway、istio-egressgateway pod反亲和性从【必须满足】改为【尽量满足】。 升级前插件检查(1.8及以上的版本不涉及)。 1.3和1.6网格支持的如下插件在1.8及以上版本不再支持,升级前请确保将如下插件卸载。 升级前命名空间自动注入检查。 基础版网格注入方式为命名空间注入,若您在当前已经注入pod所在的命名空间未打上注入label,则需要在升级前打上注入label。 升级前service selector检查。 升级前若业务service的参数selector中包含sidecarVersion的key,则需要在升级前去除该selector。 父主题: 金丝雀升级
  • 约束与限制 应用服务网格依赖集群CoreDNS的 域名 解析能力,请确保集群拥有足够资源,且CoreDNS插件运行正常。 集群启用Istio时,需要开通node节点(计算节点/工作节点)所在安全组的入方向7443端口规则,用于Sidecar自动注入回调。如果您使用CCE创建的默认安全组,此端口会自动开通。如果您自建安全组规则,请手动开通7443端口,以确保Istio自动注入功能正常。 1.13和1.15版本的istio组件不支持在CentOS和EulerOS2.5操作系统的节点上运行,在创建网格时,请不要指定这些类型的节点为mastre节点。 请根据下表ASM网格版本与集群版本适配规则匹配合适的网格版本和集群版本。 表1 ASM网格版本与集群版本适配规则 ASM网格版本 集群版本 1.3 v1.13、v1.15、v1.17、v1.19 1.6 v1.15、v1.17 1.8 v1.15、v1.17、v1.19、v1.21 1.13 v1.21、v1.23 1.15 v1.21、v1.23、v1.25、v1.27 1.18 v1.25、v1.27、v1.28、1.29
  • 处理策略 为了避免多个入口的配置相冲突,以及确保Istio各工作负载持续稳定运行,ASM 1.8.6及以上版本采取如下策略: 定义工作负载的关键运行配置和非关键运行配置 表1 各资源类型下的关键运行配置 工作负载 资源类型 配置项 配置项描述 istiod istio-ingressgateway istio-egressgateway Deployment spec.replicas 实例数 spec.strategy 升级策略 spec.template.spec.nodeSelector 调度策略 spec.template.spec.affinity 调度策略 spec.template.spec.tolerations 调度策略 spec.template.spec.containers.resources 资源请求和限制 Istio Operator默认保持当前集群中工作负载的关键运行配置不做更新,仅支持非关键运行配置更新。 若需要对关键运行配置进行修改,建议用户通过CCE控制台“工作负载”页面修改,若用户有特定需求,可通过工单进行咨询。
  • 服务公告 ASM使用istio-system、istio-operator命名空间承载网格运行所需的系统组件和系统运行配置,对于其下的资源对象: istio-system命名空间中的Deployment、DaemonSet、Service、ConfigMap、Secret、Role、RoleBinding、ServiceAccount资源对象; istio-operator命名空间下的Deployment、IstioOperator、ConfigMap、Secret、Role、RoleBinding、ServiceAccount资源对象; 建议您谨慎根据应用服务网格官网资料文档或在相关技术支持的指导下进行修改操作,以避免对您的业务产生影响。若用户有特定需求,也可通过提交工单进行咨询。
  • 操作步骤 登录应用服务网格ASM控制台。 单击右上角“购买网格”。 参考购买基础版网格中的指导,设置网格名称,选择Istio版本。 在“集群配置”中选择在创建集群中创建的集群,如果有多个集群,可以同时勾选多个。勾选后,系统自动校验集群是否符合添加要求,若校验不通过,会以图标标识,鼠标放上去可以查看校验不通过的原因以及解决方案。具体内容可参考集群校验报错常见场景及解决方案。 同一虚拟私有云的集群只能加入同一个网格。 为了满足高可用的要求,集群需要至少包含两个可用节点,每个节点至少保证有2U4G的可用资源。 如果实例(Pod)需要跨集群通信,集群需要使用ENI网络模型,且集群之间网络互通,可以处于同一VPC内,也可以将多个集群的VPC通过其他方式(对等连接、云连接等)连通。 集群的服务网段、容器网段不能和网格内已选集群的服务网段、容器网段冲突。如果集群和网格内的已选集群处于不同的VPC,集群的子网网段也不能冲突。 同一网格最多只能添加五个集群。 在可观测性配置中勾选“启用应用指标”,已默认选中“ AOM 服务”。其他可观测性配置根据需要配置即可。 展开高级配置,在“命名空间注入配置”中勾选集群的“default”命名空间,选择重启已有服务。 图1 命名空间注入配置 设置完成后单击“提交”。 创建时间预计需要5~10分钟,请耐心等待。当网格状态从“安装中”变为“运行中”,表示网格创建成功。
  • 为服务添加灰度版本 登录应用服务网格ASM控制台,单击“asmtest”网格内的。 创建灰度任务名称为“test”的灰度任务,并配置基本信息及灰度版本信息,灰度发布服务选择创建工作负载及服务中创建的名称为“servicetest”的服务,工作负载会自动关联“deptest”,单击“发布”。 图1 创建灰度任务 如果服务“servicetest”无法选择,需要确认服务是否异常,修复后才能选择。 单击“配置流量策略”,选择“基于流量比例”策略类型,为v2(灰度版本)配置“流量配比”为80%。 图2 配置流量策略 单击“策略下发”。 灰度策略的生效需要几秒的时间,您可以在监测灰度运行状态页面,观察灰度版本的运行状态。
  • 清除资源 到此本Demo已全部操作完成,因节点和应用运行过程中会产生费用,如果无特殊要求,请及时删除应用和节点,避免费用产生。 选择左侧导航中的“体验任务”,单击Bookinfo任务中的“卸载”。 单击“确定”。卸载Bookinfo体验任务,会自动删除productpage、details、reviews、ratings服务及相关资源。 图17 卸载体验任务 卸载体验任务后,已完成灰度发布的服务,其灰度版本对应的负载需要手动在CCE控制台删除。
  • 为服务添加灰度版本 本步骤将为Bookinfo应用的“reviews”服务添加新的灰度版本,并配置相应的灰度策略,将原有生产环境的默认版本的流量引流一部分到新版本中。 下面将以为“reviews”服务添加一个v3新版本,且v3新版本接收Bookinfo应用的30%流量为例进行配置。 部署灰度版本 在左侧导航中选择“灰度发布”,在金丝雀发布下,单击“立即发布”。 配置灰度发布基本信息。 灰度任务名称:用户自定义,此处设置为reviews-v3。 命名空间:选择服务所在命名空间。 灰度发布服务:在下拉框中选择reviews。 工作负载:选择服务所属的工作负载。 配置灰度版本信息。 部署集群:选择服务所属的集群。 版本号:配置为v3。 实例数量:使用默认。 实例配置:镜像版本选择1.17.2,其他参数保持默认。 单击“发布”,待启动进度为100%,表明灰度版本部署成功。 图8 查看启动进度 配置流量策略 为灰度版本设置流量策略,灰度版本会根据配置的流量配比引流老版本中的部分或全部流量。 灰度版本部署成功后,单击“配置流量策略”。 设置流量策略。 策略类型分为“基于流量比例”和“基于请求内容”,通过页签选择确定。 基于流量比例:根据流量比例配置规则,将从原版本中切分指定比例的流量到灰度版本。例如80%的流量走原版本,20%的流量走灰度版本。 基于请求内容:根据请求内容配置规则,只有请求内容中满足特定条件的流量会切分到灰度版本上。例如只有在Windows操作系统上的用户可以访问灰度版本。 以“基于流量比例”为例,且v3版本流量配比为20%。 图9 流量策略 单击“策略下发”。 灰度策略的生效需要几秒的时间,您需要在“监测与处理”页面开通 免费体验 APM,或者购买APM套餐包,否则无法观测到原版本和灰度版本的流量监控数据。 在“服务列表”页面,单击productpage服务中的“访问地址”。不断刷新页面,页面在v1和v3版本之间来回切换,并且比例大致接近4:1。 图10 v1版本页面 图11 v3版本页面 您也可以在一台已连接公网的机器上执行如下命令,持续访问productpage服务。 while true;do wget -q -O- http://ip:port/productpage; done 返回控制台的“监测与处理”页面查看v1和v3版本的实时流量监控情况。 图12 流量监控详情 在“流量监控”页面,您可以查看Bookinfo应用各服务之间的实时拓扑。ASM提供的流量监控功能,可监控服务之间的拓扑、会话请求调用链、各环节耗时和RPS、RT等性能状态。 图13 流量监控拓扑 从拓扑图可以看出,reviews-v1和reviews-v3服务的调用次数分别为706和167,比例大致接近4:1,符合设定的流量比例策略。成功实现了灰度发布。