云服务器内容精选

  • 使用Python SDK 您可以前往开发体验馆 Codelabs / Namespace生命周期代码示例(Python)下载相关代码,并在线调试。 首先需要先生成kubeconfig配置文件,参考cci-iam-authenticator使用参考,使用子命令generate-kubeconfig生成kubeconfig配置文件。 这里的示例代码采用了定期刷新token的方式来防止token过期(缓存值token有效期为24小时),您可以增加获取失败重试的操作,以提升可用性。 定期刷新token的方式不适用于该账号权限发生变更的情形,如果账号权限发生变更(如主账号变更子账号权限,导致子账号权限发生变更),变更前获取的token会失效,需要重新获取 # -*- coding: utf-8 -*- import logging import time import threading from kubernetes import client, config NAMESPACE = "test-k8s-client-namespace" logging.basicConfig( level=logging.INFO, datefmt="%Y-%m-%d %H:%M:%S", format="%(asctime)s %(levelname)s %(message)s", ) def create_namespace(): flavor = "general-computing" pool_size = "10" namespace = client.V1Namespace( metadata=client.V1ObjectMeta( name=NAMESPACE, annotations={ "namespace.kubernetes.io/flavor": flavor, "network.cci.io/warm-pool-size": pool_size, }, labels={ "rbac.authorization.cci.io/enable-k8s-rbac": "false", } ) ) logging.info("start to create namespace %s", NAMESPACE) client.CoreV1Api().create_namespace(namespace) logging.info("namespace created") def create_network(): name = "test-k8s-client-namespace-cn-north-7-default-network" project_id = "{project_id}" domain_id = "{domain_id}" security_group_id = "{security_group_id}" available_zone = "{available_zone}" vpc_id = "{vpc_id}" cidr = "{cidr}" network_id = "{network_id}" subnet_id = "{subnet_id}" body = { "apiVersion": "networking.cci.io/v1beta1", "kind": "Network", "metadata": { "annotations": { "network.alpha.kubernetes.io/default-security-group": security_group_id, "network.alpha.kubernetes.io/domain-id": domain_id, "network.alpha.kubernetes.io/project-id": project_id, }, "name": name, }, "spec": { "availableZone": available_zone, "cidr": cidr, "attachedVPC": vpc_id, "networkID": network_id, "networkType": "underlay_neutron", "subnetID": subnet_id, } } api = client.CustomObjectsApi() logging.info("start to create network") api.create_namespaced_custom_object( group="networking.cci.io", version="v1beta1", namespace=NAMESPACE, plural="networks", body=body, ) logging.info("network created") def create_deployment(): app = "test-k8s-client-deployment" image = "library/nginx:stable-alpine-perl" body = client.V1Deployment( api_version="apps/v1", kind="Deployment", metadata=client.V1ObjectMeta(name=app), spec=client.V1DeploymentSpec( replicas=2, selector={"matchLabels": {"app": app}}, template=client.V1PodTemplateSpec( metadata=client.V1ObjectMeta(labels={"app": app}), spec=client.V1PodSpec( containers=[ client.V1Container( name="container-0", image=image, resources=client.V1ResourceRequirements( requests={"cpu": "500m", "memory": "1024Mi"}, limits={"cpu": "500m", "memory": "1024Mi"}, ), ) ], image_pull_secrets=[ client.V1LocalObjectReference(name="imagepull-secret")], priority=0), ), ) ) logging.info("start to create deployment %s/%s", NAMESPACE, app) client.AppsV1Api().create_namespaced_deployment(NAMESPACE, body) logging.info("deployment created") def get_deployment(): app = "test-k8s-client-deployment" resp = client.AppsV1Api().read_namespaced_deployment(app, NAMESPACE) logging.info("deployment detail: %s", resp) def delete_deployment(): app = "test-k8s-client-deployment" logging.info("start to delete deployment") client.AppsV1Api().delete_namespaced_deployment(app, NAMESPACE) logging.info("deployment deleted") def delete_namespace(): logging.info("start to delete namespace: %s", NAMESPACE) client.CoreV1Api().delete_namespace(NAMESPACE) def main(): # Configs can be set in Configuration class directly or using helper # utility. If no argument provided, the config will be loaded from # default location. path = '{path to kubeconfig}' config.load_kube_config(path) # 因为token有效期为24小时,所以这里设置了一个每12小时获取新的token的定时任务 # 注意:如果账号权限发生变更(如主账号变更子账号权限,导致子账号权限发生变更),变更前获取的token会失效,需要重新获取。 # 另外,您可以增加获取失败重试的操作,以提升可用性 def _refresh(): while True: time.sleep(12 * 3600) try: config.load_kube_config(path) except Exception as e: print("load_kube_config error: %s" % e) t = threading.Thread(target=_refresh) t.daemon = True t.start() create_namespace() create_network() # wait for namespace and network to be active logging.info("waiting for namespace and network to be active") time.sleep(30) create_deployment() get_deployment() delete_deployment() delete_namespace() if __name__ == '__main__': main()
  • 初始化项目 创建项目examples.com/cci-examples。 项目依赖k8s.io/client-go、k8s.io/code-generator,以下版本可供参考 k8s.io/client-go@kubernetes-1.15.0、k8s.io/code-generator@kubernetes-1.15.0 k8s.io/client-go@kubernetes-1.16.0、k8s.io/code-generator@kubernetes-1.16.0 k8s.io/client-go@kubernetes-1.17.0、k8s.io/code-generator@kubernetes-1.17.0 k8s.io/client-go@kubernetes-1.18.0、k8s.io/code-generator@kubernetes-1.18.0 k8s.io/client-go@kubernetes-1.19.0、k8s.io/code-generator@kubernetes-1.19.0 k8s.io/client-go@kubernetes-1.20.0、k8s.io/code-generator@kubernetes-1.20.0 mkdir -p examples.com/cci-examples cd examples.com/cci-examples/ go mod init examples.com/cci-examples go get k8s.io/client-go@kubernetes-1.15.0 go get k8s.io/code-generator@kubernetes-1.15.0
  • 执行命名生成代码 以下命令在linux环境下执行 # 生成vendor文件夹 go mod vendor # 执行构建脚本 chmod 755 hack/update-codegen.sh # hack/update-codegen.sh会执行vendor/k8s.io/code-generator/generate-groups.sh chmod 755 vendor/k8s.io/code-generator/generate-groups.sh ./hack/update-codegen.sh 执行成功后,将会生成代码,目录结构将为 ├── go.mod ├── go.sum ├── hack │ ├── boilerplate.go.txt │ ├── tools.go │ └── update-codegen.sh └── pkg ├── apis │ └── networking.cci.io │ └── v1beta1 │ ├── doc.go │ ├── register.go │ ├── types.go │ └── zz_generated.deepcopy.go └── client └── networking.cci.io └── v1beta1 ├── clientset.go ├── doc.go ├── fake │ ├── clientset_generated.go │ ├── doc.go │ └── register.go ├── scheme │ ├── doc.go │ └── register.go └── typed └── networking.cci.io └── v1beta1 ├── doc.go ├── fake │ ├── doc.go │ ├── fake_network.go │ └── fake_networking.cci.io_client.go ├── generated_expansion.go ├── network.go └── networking.cci.io_client.go
  • 定义CRD资源Network 创建文件夹pkg/apis/networking.cci.io/v1beta1,其中networking.cci.io为CRD资源的group,v1beta1为CRD资源版本 mkdir -p pkg/apis/networking.cci.io/v1beta1 在新建文件夹中新建以下文件: doc.go // +k8s:deepcopy-gen=package // +groupName=networking.cci.io // +groupGoName=NetworkingCCI package v1beta1 types.go package v1beta1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // NetworkList is a list of network resource in container. type NetworkList struct { metav1.TypeMeta `json:",inline"` // Standard list metadata. // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` Items []Network `json:"items" protobuf:"bytes,2,rep,name=items"` } // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // Network is a network resource in container. type Network struct { metav1.TypeMeta `json:",inline"` // +optional metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Spec defines the attributes on a network // +optional Spec NetworkSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"` // Status describes the network status // +optional Status NetworkStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` } // NetworkSpec describes the attributes on a network resource. type NetworkSpec struct { // network type NetworkType string `json:"networkType,omitempty" protobuf:"bytes,5,opt,name=networkType"` // ID of the VPC to attach AttachedVPC string `json:"attachedVPC,omitempty" protobuf:"bytes,4,opt,name=attachedVPC"` // network ID NetworkID string `json:"networkID,omitempty" protobuf:"bytes,7,opt,name=networkID"` // Subnet ID SubnetID string `json:"subnetID,omitempty" protobuf:"bytes,8,opt,name=subnetID"` // available zone AvailableZone string `json:"availableZone,omitempty" protobuf:"bytes,9,opt,name=availableZone"` // The CIDR of the network CIDR string `json:"cidr,omitempty" protobuf:"bytes,3,opt,name=cidr"` } // NetworkStatus describes the status of a network type NetworkStatus struct { // State describes the network state // +optional State string `json:"state" protobuf:"bytes,1,opt,name=state"` // Message describes why network is in current state // +optional Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"` } const ( // NetworkInitializing means the network is initializing NetworkInitializing = "Initializing" // NetworkPending means the network is processing NetworkPending = "Pending" // NetworkActive means the network is available NetworkActive = "Active" // NetworkFailed means the network is not available NetworkFailed = "Failed" // NetworkTerminating means the network is undergoing graceful termination NetworkTerminating = "Terminating" ) register.go package v1beta1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" ) // GroupName is the group name use in this package const GroupName = "networking.cci.io" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"} // Resource takes an unqualified resource and returns a Group qualified GroupResource func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() } var ( // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) localSchemeBuilder = &SchemeBuilder AddToScheme = localSchemeBuilder.AddToScheme ) // Adds the list of known types to the given scheme. func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &Network{}, &NetworkList{}, ) // Add the watch version that applies metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil }
  • FAQ 问:上述代码示例是否存在请求结果返回码为401的情况? 答:一般情况下,如果密码或AK/SK配置无误,client-go提供的定期刷新token的机制(即定期调用cci-iam-authenticator刷新token,具体实现参考https://github.com/kubernetes/client-go/blob/master/plugin/pkg/client/auth/exec/exec.go),能确保token不会因过期而失效(token的有效期为24小时),从而避免请求结果返回码为401。 但当账号权限发生变更时,token可能也会失效,不属于超期失效的情形,在该情形下,仍会出现请求结果返回码为401的情况。
  • 核对资源用量是否与实际相符 假设用户在2023/04/08 10:09:06购买了一个按需计费通用计算型云容器实例(Pod规格:CPU 2核,内存 4GB),并在2023/04/08 12:09:06时刻将其删除。 云容器实例流水账单 按需计费云容器实例按秒计费,每一个小时整点结算一次费用,您可以在流水账单中核对每一个计费周期的信息是否和实际相符,具体如表1所示。 表1 云容器实例流水账单 产品类型 云容器实例 CCI 产品 云容器实例 计费模式 按需 消费时间 2023/04/08 10:09:06 ~ 2023/04/08 12:09:06时段计费系统将生成3笔流水账单,对应每一个计费周期,分别如下: 2023/04/08 10:09:06 ~ 2023/04/08 11:00:00 2023/04/08 11:00:00 ~ 2023/04/08 12:00:00 2023/04/08 12:00:00 ~ 2023/04/08 12:09:06 官网价 官网价=使用时长*单价*Core+使用时长*单价*GB 本例中,在第一个计费周期内云容器实例的使用量为3054秒,单价可在云容器实例价格详情中查询,以Pod规格CPU为2核、内存为4GB为例,此Pod价格为0.0001225/Pod/秒,CPU为2核,内存为4GB,那么官网价=3054 * 0.0001225= 0.374115元。同理,您可以计算剩余计费周期内资源的官网价。 优惠金额 用户使用云服务享受折扣优惠如商务折扣、伙伴授予折扣以及促销优惠等减免的金额。基于官网价的优惠金额。 抹零金额 华为云产品 定价精度为小数点后8位(单位:元),因此在计费过程中会产生小数点后8位的资源使用费用。而在实际扣费时,仅扣除到小数点后2位,小数点后第3位到第8位部分金额会被舍弃,这种舍弃部分的金额称作抹零金额。 以第一个计费周期为例,抹零金额为:0.004115 元 应付金额 应付金额=官网价-优惠金额-抹零金额 以第一个计费周期为例,假设优惠金额为0,那么应付金额=0.374115 - 0 - 0.004115 = 0.37 元 云容器实例明细账单 明细账单可以通过多维度展示客户账单的详细信息。一般通过设置统计维度为“按使用量”,统计周期为“按账期”来统计资源在某个月份的总开销,建议您核对表2所示的信息是否和实际相符。 表2 云容器实例明细账单 产品类型 云容器实例 CCI 产品 云容器实例 计费模式 按需 资源名称/ID 云容器实例的名称和ID 例如:cci-272f,4cdeb1cd-7071-4890-9ce4-e6c2299e960e 规格 云容器实例的类型和规格 本例为通用计算型,(Pod规格:CPU 2核,内存 4GB) 使用量类型 按需计费云容器实例的使用量类型为“时长” 单价 按需计费模式为简单 定价 (使用量*单价)时提供单价信息,其他的定价(如EIP公网带宽的阶梯定价)等不提供单价。 按需计费云容器实例属于简单定价,您可以在云容器实例价格详情中查询单价。 单价单位 在云容器实例价格详情中查询到的单价单位:元/Pod/秒 使用量 按产品单价单位显示使用量,云容器实例的单价单位为元/Pod/秒,因此使用量以小时为单位。本例中,2023/04/08 10:09:06 ~ 2023/04/08 12:09:06时段总计使用量为2小时。 使用量单位 小时 官网价 官网价=使用量*单价*容量 本例中,使用量为2小时,单价可在云容器实例价格详情中查询,以0.0001225元/Pod/秒为例,(Pod规格:CPU 2核,内存 4GB),那么官网价=2 * 0.0001225 * 60 * 60 = 0.882 元。 优惠金额 用户使用云服务享受折扣优惠如商务折扣、伙伴授予折扣以及促销优惠等减免的金额。基于官网价的优惠金额。 应付金额 用户使用云服务享受折扣优惠后需要支付的费用金额。
  • 计费构成分析 可以将云容器实例的使用阶段按照规格分为两段: 在2023/03/18 15:30:00 ~ 2023/03/20 9:00:00期间按照Pod规格:CPU 2核,内存 4GB计费,计费时长为41.5小时,费用计算如下: 在2023/03/20 9:00:00 ~ 2023/03/31 23:59:59期间按照Pod规格:CPU 4核,内存 8GB计费,计费时长为279小时,费用计算如下: 由此可见,在3月份,该云容器实例总共产生的费用为: 第一段时间产生费用:0.0001225*41.5*60*60=18.301元 第二段时间产生费用:0.000245*279*60*60=246.078元 总共产生费用:18.301+246.078=264.379元
  • 计费说明 云容器实例的计费项由Pod规格组成。具体内容如表1所示。 表1 云容器实例计费项 Pod规格计费项 计费项说明 适用的计费模式 计费公式 通用计算型 计费因子:CPU和内存,不同规格的实例类型提供不同的计算和存储能力 按需计费 CPU:Core数量 * Core单价 * 计费时长 内存:GB数量 * GB单价 * 计费时长 请参见云容器实例价格详情中的“价格详情”。 GPU加速型 计费因子:CPU、内存和GPU,不同规格的实例类型提供不同的计算、存储、GPU加速能力 按需计费 CPU:Core数量 * Core单价 * 计费时长 内存:GB数量 * GB单价 * 计费时长 GPU:GPU数量 * GPU单价 * 计费时长 请参见云容器实例价格详情中的“价格详情”。
  • 资源包抵扣顺序规则 当购买了多个相同属性的资源包,会按照资源包过期时间顺序进行抵扣,优先抵扣过期时间近的资源包。 场景示例: 某客户分别购买了两个华北-北京四区域的资源套餐包: 资源包A:CPU规格1,000 核*时,2022年10月1日生效,购买时长1年,即2023年10月1日过期。 资源包B:CPU规格10,000 核*时,2022年11月1日生效,购买时长1年,即2023年11月1日过期。 表2 资源包抵扣顺序示例 时间 抵扣顺序 2022年10月1日~2022年10月31日 只有资源包A生效。 使用资源包A抵扣,超出CPU规格1,000 核*时,部分按需计费。 2022年11月1日~2023年10月1日 资源包A、B同时生效,叠加使用。 优先使用资源包A抵扣,超出CPU规格1,000 核*时部分使用资源包B抵扣,超出CPU规格10,000 核*时部分按需计费。 2023年10月1日~2023年11月1日 资源包A过期,只有资源包B生效。 使用资源包B抵扣,超出CPU规格10,000 核*时部分按需计费。 2023年11月1日~ 资源包A、B均已过期,此时为按需计费。
  • 变更配置后对计费的影响 如果您在购买按需计费实例后变更了Pod配置,会产生一个新订单并开始按新配置的价格计费,旧订单自动失效。 如果您在一个小时内变更了Pod配置,将会产生多条计费信息。每条计费信息的开始时间和结束时间对应不同配置在该小时内的生效时间。 例如,您在9:00:00购买了一台按需计费Pod,Pod规格为CPU 2核,内存 4GB,并在9:30:00升配为CPU 4核,内存 8GB,那么在9:00:00 ~ 10:00:00间会产生两条计费信息。 第一条对应9:00:00 ~ 9:30:00,Pod规格按照CPU 2核,内存 4GB计费。 第二条对应9:30:00 ~ 10:00:00,Pod规格按照CPU 4核,内存 8GB计费。
  • 计费示例 假设您在2023/04/18 9:59:30购买了一台按需计费通用计算型云容器实例(Pod规格:CPU 2核,内存 4GB),计费资源包括CPU和内存,然后在2023/04/18 10:45:46将其删除,则: 第一个计费周期为9:00:00 ~ 10:00:00,在9:59:30 ~ 10:00:00间产生费用,该计费周期内的计费时长为30秒。 第二个计费周期为10:00:00 ~ 11:00:00,在10:00:00 ~ 10:45:46间产生费用,该计费周期内的计费时长为2746秒。 您需要为每个计费周期付费,各项CCI资源单独计费,计费公式如表2所示。产品价格详情中标出了资源的每秒价格。 表2 计费公式 Pod规格类型 计费公式 资源单价 CPU Core数量 * Core单价 * 计费时长 请参见云容器实例价格详情中的“价格详情”。 内存 GB数量 * GB单价 * 计费时长 请参见云容器实例价格详情中的“价格详情”。
  • 计费周期 按需计费CCI资源按秒计费,每一个小时整点结算一次费用(以UTC+8时间为准),结算完毕后进入新的计费周期。计费的起点以CCI实例创建成功的时间点为准,终点以实例删除时间为准。 例如,您在8:45:30购买了一台按需计费的通用计算型云容器实例,相关资源包括CPU和内存,然后在8:55:30将其删除,则计费周期为8:00:00 ~ 9:00:00,在8:45:30 ~ 8:55:30间产生费用,该计费周期内的计费时长为600秒。
  • 计费模式概述 云容器实例提供计费模式分为按需计费和套餐包计费两种方式。 按需计费,按需计费一种后付费模式,即先使用再付费,以实例为单位,采用按量付费的计费模式,秒级计费,按小时结算。 套餐包计费,允许您根据实际业务需求灵活地调整资源使用,无需提前预置资源,从而降低预置过多或不足的风险。一般适用于电商抢购等设备需求量瞬间大幅波动的场景。 表1 按需计费模式 计费模式 按需计费 套餐包 付费方式 后付费 按照实例实际使用时长计费。 预付费 按照订单购买的套餐包计费。 计费周期 秒级计费,按小时结算。 按订单购买的套餐包周期计费。 适用计费项 Pod规格包含CPU、内存和GPU。 套餐包分为CPU套餐包和内存套餐包。 变更计费模式 支持变更为套餐包计费模式。 套餐包即买即用,不支持在套餐包未使用完变更计费模式。套餐包使用完后将自动变更为按需计费模式。 变更规格 支持变更Pod规格。 支持变更Pod规格。 适用场景 适用于计算资源需求波动的场景,可以随时开通,随时删除。 一般适用于电商抢购等设备需求量瞬间大幅波动的场景。 父主题: 计费模式
  • 操作步骤 安装“云原生监控插件”。 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“插件中心”,进入插件中心首页。 选择“云原生监控插件”,单击“安装”。 图1 安装云原生监控插件 在安装插件页面,进行规格配置,部署模式选择“Server模式”。 如果需要在Agent部署模式下使用HPA功能,请联系技术支持人员。 通过云原生监控插件,提供系统资源指标。 如果CCE集群中未安装metrics-server插件,请开启Metric API,详情请参见通过Metrics API提供资源指标。配置完成后,可使用Prometheus采集系统资源指标。 如果CCE集群中已安装metrics-server插件,可以选择以下任意一种方式进行处理: 方式一:请卸载“Kubernetes Metrics Server”插件后,开启Metric API。 登录CCE控制台。 选择CCE集群,单击进入CCE集群总览页面。 在导航栏左侧单击“插件中心”,进入插件中心首页。 选择“Kubernetes Metrics Server”插件,单击“卸载”。 开启Metric API,详情请参见通过Metrics API提供资源指标。配置完成后,可使用Prometheus采集系统资源指标。 方式二:修改APIService对象。 需要更新APIService对象“v1beta1.metrics.k8s.io”: apiVersion: apiregistration.k8s.io/v1 kind: APIService metadata: labels: app: custom-metrics-apiserver release: cceaddon-prometheus name: v1beta1.metrics.k8s.io spec: group: metrics.k8s.io groupPriorityMinimum: 100 insecureSkipTLSVerify: true service: name: custom-metrics-apiserver namespace: monitoring port: 443 version: v1beta1 versionPriority: 100 可以将该对象保存为文件,命名为metrics-apiservice.yaml,然后执行以下命令: kubectl apply -f metrics-apiservice.yaml 执行kubectl top pod -n monitoring命令,如果显示如下,则表示Metrics API能正常访问: # kubectl top pod -n monitoring NAME CPU(cores) MEMORY(bytes) ...... custom-metrics-apiserver-d4f556ff9-l2j2m 38m 44Mi ...... 卸载插件时,需要执行以下kubectl命令,同时删除APIService对象,否则残留的APIService资源将导致metrics-server插件安装失败。 kubectl delete APIService v1beta1.metrics.k8s.io
  • 约束与限制 使用共享VPC的CCE集群不支持开启“网络互通”功能。 使用CCE集群中的Bursting插件对接CCI 2.0服务,支持配置独享型ELB的Ingress和Service。Bursting插件1.5.5以下版本不支持配置ELB类型的Service。 当前网络互通能力依赖sidecar容器的启动,因此在初始化容器中暂不支持使用网络互通能力,且业务容器如果使用preStart、postStart功能阻塞后续容器的启动会导致网络互通能力异常。 跨CCE和CCI实例Service网络互通只支持集群内访问(ClusterIP)类型。不支持在init-container中访问CCE侧ClusterIP service。 跨CCE和CCI实例,在对接LoadBalancer类型的Service或Ingress时: 禁止指定健康检查端口,在CCE集群下,由于CCI的容器与CCE的容器在ELB注册的后端使用端口不一致,指定健康检查端口会导致部分后端健康检查异常。 跨集群使用Service对接同一个ELB的监听器时,需确认健康检查方式,避免服务访问异常。 跨CCE和CCI实例,在对接共享型LoadBalancer类型的Service时,需要放通node安全组下100.125.0.0/16网段的容器端口。