云服务器内容精选

  • 计费构成分析 可以将云容器实例的使用阶段按照规格分为两段: 在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元
  • CCE与CCI两者的配合 通过安装Virtual-Kubelet插件,可以在短时高负载场景时,将部署在CCE上的无状态工作负载(Deployment)、有状态工作负载(StatefulSet)、普通任务(Job)三种资源类型的容器实例(Pod),弹性创建到华为云云容器实例CCI服务上,以减少集群扩容带来的消耗。 具体功能如下: 支持容器实例实现秒级弹性伸缩:在集群资源不足时,无需新增节点,virtual-kubelet插件将自动为您在云容器实例CCI侧创建容器实例,减少运维成本。 无缝对接华为云容器镜像服务SWR,支持使用公用镜像和私有镜像。 支持CCI容器实例的事件同步、监控、日志、exec、查看状态等操作。 支持查看虚拟弹性节点的节点容量信息。 支持CCE和CCI两侧实例的service网络互通。 详情请参见华为云CCE弹性伸缩至CCI。
  • 基本介绍 表1 CCE和CCI基本介绍 云容器引擎CCE 云容器实例CCI 云容器引擎(Cloud Container Engine,简称CCE)提供高度可扩展的、高性能的企业级Kubernetes集群,支持运行Docker容器,提供了Kubernetes集群管理、容器应用全生命周期管理、应用服务网格、Helm应用模板、插件管理、应用调度、监控与运维等容器全栈能力,为您提供一站式容器平台服务。借助云容器引擎,您可以在华为云上轻松部署、管理和扩展容器化应用程序。 详细介绍请查看什么是云容器引擎。 云容器实例(Cloud Container Instance, CCI)服务提供Serverless Container(无服务器容器)引擎,让您无需创建和管理服务器集群即可直接运行容器。通过CCI您只需要管理运行在Kubernetes上的容器化业务,无需管理集群和服务器即可在CCI上快速创建和运行容器负载,使容器应用零运维,使企业聚焦业务核心,为企业提供了Serverless化全新一代的体验和选择。 而Serverless是一种架构理念,是指不用创建和管理服务器、不用担心服务器的运行状态(服务器是否在工作等),只需动态申请应用需要的资源,把服务器留给专门的维护人员管理和维护,进而专注于应用开发,提升应用开发效率、节约企业IT成本。传统上使用Kubernetes运行容器,首先需要创建运行容器的Kubernetes服务器集群,然后再创建容器负载。 详细介绍请查看什么是云容器实例。
  • 创建方式 表2 创建方式不同 云容器引擎CCE 云容器实例CCI CCE是基于Kubernetes的托管式容器管理服务,可以提供原生Kubernetes体验,可以一键创建原生Kubernetes集群,与社区能力基本一致。 使用CCE,您需要创建集群和节点,简单、低成本、高可用,无需管理Master节点。 CCI提供 Serverless Container引擎,在华为云上部署容器时,您不需要购买和管理ECS,可以直接在华为云上运行容器和Pod,为您省去底层ECS的运维和管理工作。 使用CCI,您无需创建集群,无需创建和管理Master节点及Work节点,可直接启动应用程序。
  • CCI服务的开源第三方中包含的公网地址声明是什么? CCI服务提供 Serverless Container(无服务器容器)引擎,让用户无需创建和管理服务器集群即可直接运行容器。在CCI服务组件开源依赖中,包含三方开源依赖k8s.io/kubernetes、go.etcd.io/etcd,其中涉及"http://metadata.google.internal."、"https://www.googleapis.com"、"https://storage.googleapis.com"等域名的公网地址均为开源仓内自带的公网地址,CCI服务不涉及与此类公网地址的连接,也不会与此类公网地址进行任何数据交换。 k8s.io/kubernetes开源社区链接:https://github.com/kubernetes/kubernetes go.etcd.io/etcd开源社区链接:https://github.com/etcd-io/etcd 父主题: 产品咨询类
  • 执行命名生成代码 以下命令在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 }
  • 初始化项目 创建项目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
  • 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的情况。
  • 变更配置后对计费的影响 如果您在购买按需计费实例后变更了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秒。
  • 命名空间与网络的关系 从网络角度,命名空间对应一个虚拟私有云(VPC)中一个子网,如图1所示,在创建命名空间时会关联已有VPC或创建一个新的VPC,并在VPC下创建一个子网。后续在该命名空间下创建的容器及其他资源都会在对应的VPC及子网之内。 通常情况下,如果您在同一个VPC下还会使用其他服务的资源,您需要考虑您的网络规划,如子网网段划分、IP数量规划等,确保有可用的网络资源。 图1 命名空间与VPC子网的关系
  • (可选)准备SSL证书 云容器实例支持使用HTTPS访问负载,在创建负载时,您可以使用自己的SSL证书。 SSL证书分为权威证书和自签名证书。权威证书由权威的数字证书认证机构签发,您可向第三方证书代理商购买,使用权威证书的Web网站,默认客户端都是信任的。自签名证书是由用户自己颁发给自己的,一般可以使用openssl生成,默认客户端是不信任的,浏览器访问时会弹出告警,选择忽略告警可继续正常访问。 SSL证书具体信息请参见SSL证书。
  • (可选)上传镜像 云平台提供了容器镜像服务,您可以上传容器镜像到容器镜像仓库中,创建负载时使用该镜像,具体使用方法请参见客户端上传镜像。 CCI当前暂不支持对接第三方镜像仓库。 如果您开通了企业管理,使用账号登录云容器实例控制台时,您需要在账号下的容器镜像服务中给IAM用户添加权限,IAM用户才能使用账号下的私有镜像。 给IAM用户添加权限有如下两种方法: 在镜像详情中为IAM用户添加授权,授权完成后,IAM用户享有读取/编辑/管理该镜像的权限,具体请参见在镜像详情中添加授权。 在组织中为IAM用户添加授权,使IAM用户对组织内所有镜像享有读取/编辑/管理的权限,具体请参见在组织中添加授权。