云服务器内容精选

  • 自定义来源新增 新增商品类型为AstroZero应用的broker来源。 同时以AstroZero为例开发Service Broker接口Demo,提供以下接口进行接口配置: 1)认证凭据 URL POST /baas/auth/v1.0/oauth2/token Headers示例 Content-Type:application/x-www-form-urlencoded 请求示例 { "grant_type": "client_credentials", "client_id": "", "client_secret": "" } 响应示例 { "access_token": "", "expires_in": 3600, "token_type": "Bearer" } 配置图片 认证凭据携带说明:调用服务目录等其他接口时,会取鉴权接口的Body出差中的access_token,放入Header中access-token中,来建立鉴权。 2)服务目录 URL GET /service/CP_DS__AstroZeroBrokerDemo/1.0.0/catalog 请求示例 无 响应示例 { "services": [ { "allow_context_updates": false, "bindable": false, "bindings_retrievable": false, "description": "", "id": "$CP_DS__AstroZeroBrokerDemo_b", "instances_retrievable": false, "name": "$CP_DS__AstroZeroBrokerDemo_b", "plan_updateable": false, "plans": [ { "bindable": false, "description": "", "free": true, "id": "003M000000ppqFT7kFRQ", "name": "CP_DS__AstroZeroBrokerDemo-0.0.9__svc", "plan_updateable": false, "schemas": { "service_binding": null, "service_instance": { "create": { "parameters": { "properties": { "client_id": { "description": "客户端ID", // 创建时需要界面输入入参 "type": "string" }, "client_secret": { "description": "客户端密钥", // 创建时需要界面输入入参 "type": "password" } }, "required": [ "client_id", "client_secret" ], "type": "object" } } } } } ] } ] } 配置图片 3)服务创建 URL PUT /service/CP_DS__AstroZeroBrokerDemo/1.0.0/service_instances/{instance_id} 请求示例 { "context": "string", "maintenance_info": {}, "parameters": { "client_id": "", "client_secret": "" }, "plan_id": "string", "service_id": "string" } 响应示例 { "metadata": { "display": [ { "description": "", "type": "string", "value": "" } ] }, "parameters": { "client_id": "string", "client_secret": "string" } } 配置图片 4)服务实例信息 URL GET /service/CP_DS__AstroZeroBrokerDemo/1.0.0/service_instances/{instance_id} 请求示例 { "plan_id": "string", "service_id": "string" } 响应示例 { "description": "", "instance_usable": false, "state": "", "update_repeatable": false } 5)服务实例信息最新操作 URL GET /service/CP_DS__AstroZeroBrokerDemo/1.0.0/service_instances/{instance_id}/last_operation 请求示例 { "plan_id": "string", "service_id": "string", "operation": "string" } 响应示例 { "description": "string", "instance_usable": false, "state": "string", "update_repeatable": false } 父主题: 以AstroZero为例的Service Broker接入样例
  • 响应消息体 字段名称 类型 必填 说明 dashboard_url string 否 服务实例对应仪表板地址。 operation string 否 对于异步操作,返回对应异步操作在第三方系统中的唯一标识,该标识可以作为参数在服务实例最新操作信息接口使用。 metadata ServiceInstanceMetadata 否 服务实例后与Exchange页面交互信息。 ServiceInstanceMetadata 字段名称 类型 必填 说明 display Display[] 否 服务创建后页面展示内容。 接入点信息Display 字段名称 类型 必填 说明 description string 是 展示描述。 value string 是 展示信息。 tyue string 是 展示类型(string/number/password)。
  • URI POST /api/v1/namespaces/{namespace}/services 表1 路径参数 参数 是否必选 参数类型 描述 namespace 是 String object name and auth scope, such as for teams and projects 表2 Query参数 参数 是否必选 参数类型 描述 dryRun 否 String When present, indicates that modifications should not be persisted. An invalid or unrecognized dryRun directive will result in an error response and no further processing of the request. Valid values are: - All: all dry run stages will be processed fieldManager 否 String fieldManager is a name associated with the actor or entity that is making these changes. The value must be less than or 128 characters long, and only contain printable characters, as defined by https://golang.org/pkg/unicode/#IsPrint. pretty 否 String If 'true', then the output is pretty printed.
  • 状态码 状态码 描述 200 OK 201 Created 202 Accepted 400 BadRequest 401 Unauthorized 403 Forbidden 404 NotFound 405 MethodNotAllowed 406 NotAcceptable 409 AlreadyExists 415 UnsupportedMediaType 422 Invalid 429 TooManyRequests 500 InternalError 503 ServiceUnavailable 504 ServerTimeout
  • 请求示例 创建ClusterIP类型的Service,公开的端口为80,端口的IP协议为"TCP"。 { "apiVersion" : "v1", "kind" : "Service", "metadata" : { "labels" : { "app" : "redis" }, "name" : "redis" }, "spec" : { "ports" : [ { "name" : "service0", "port" : 8080, "protocol" : "TCP", "targetPort" : 80 } ], "selector" : { "app" : "redis" }, "type" : "ClusterIP" } } 创建LoadBalancer类型的Service,指定elb实例ID、项目ID和账号ID。 LoadBalancer类型Service需要在metadata.annotations自定义中添加elb实例ID(kubernetes.io/elb.id)、项目ID(tenant.kubernetes.io/project-id)和账号ID(tenant.kubernetes.io/domain-id) { "apiVersion" : "v1", "kind" : "Service", "metadata" : { "annotations" : { "kubernetes.io/elb.id" : "77e6246c-a091-xxxx-xxxx-789baa571280", "tenant.kubernetes.io/domain-id" : "65382xxxxxxxxxxxxxxxxxe684b", "tenant.kubernetes.io/project-id" : "a9cab8xxxxxxxxxxxxxxxx41c0aeb" }, "name" : "nginx" }, "spec" : { "ports" : [ { "name" : "service0", "port" : 8080, "protocol" : "TCP", "targetPort" : 80 } ], "selector" : { "app" : "nginx" }, "type" : "LoadBalancer" } }
  • 响应示例 状态码: 200 OK { "apiVersion" : "v1", "kind" : "Service", "metadata" : { "creationTimestamp" : "2018-09-04T00:45:36Z", "labels" : { "app" : "redis" }, "name" : "redis", "namespace" : "namespace-test", "resourceVersion" : "5146412", "selfLink" : "/api/v1/namespaces/namespace-test/services/redis", "uid" : "d6a1ce79-afdb-11e8-b6ef-f898ef6c78b4" }, "spec" : { "clusterIP" : "10.247.212.210", "ports" : [ { "name" : "service0", "port" : 8080, "protocol" : "TCP", "targetPort" : 80 } ], "selector" : { "app" : "redis" }, "sessionAffinity" : "None", "type" : "ClusterIP" }, "status" : { "loadBalancer" : { } } }
  • Service是如何工作的 Kubernetes中的Service对象就是用来解决上述Pod访问问题的。Service有一个固定IP地址,Service将访问他的流量转发给Pod,具体转发给哪些Pod通过Label来选择,而且Service可以给这些Pod做负载均衡。 那么对于上面的例子,通过为前后台添加两个Service,通过Service来访问Pod,这样前台Pod就无需感知后台Pod的变化,如图2所示。 图2 通过Service访问Pod
  • LoadBalancer类型的Service 现在您知道可以创建ClusterIP类型的Service,通过Service的IP可以访问到Service后端的Pod。 云容器实例同时还支持创建LoadBalancer类型的Service,将增强型ELB实例与Service绑定,这样访问ELB实例的流量就会访问到Service。 ELB实例根据IP地址不同可以分为私网ELB实例和公网ELB实例,区别在于公网ELB实例绑定了一个公网IP,您可以根据需要选择。您可以调用创建负载均衡器(增强型)创建ELB实例,更方便的方法是通过ELB控制台创建增强型ELB实例。 ELB实例必须与Service在同一个VPC内,否则无法绑定。 跨namespace不支持service或ELB 域名 访问,只能通过ELB内网IP:端口访问。 图3 LoadBalancer Service 下面是一个创建LoadBalancer类型的Service。创建完成后,可以通过ELB的IP:Port访问到后端Pod。 apiVersion: v1 kind: Service metadata: name: nginx annotations: kubernetes.io/elb.id: 77e6246c-a091-xxxx-xxxx-789baa571280 # ELB的ID spec: selector: app: nginx ports: - name: service0 targetPort: 80 port: 8080 # ELB访问端口 protocol: TCP type: LoadBalancer # Service的类型
  • 直接访问Pod的问题 负载创建完成后,如何访问负载呢?访问负载实际上就是访问Pod,但是直接访问Pod会有如下几个问题: Pod会随时被Deployment这样的控制器删除重建,那访问Pod的结果就会变得不可预知。 Pod的IP地址是在Pod启动后才被分配,在启动前并不知道Pod的IP地址。 应用往往都是由多个运行相同镜像的一组Pod组成,一个个Pod的访问也变得不现实。 举个例子,假设有这样一个应用程序,使用Deployment创建了前台和后台,前台会调用后台做一些计算处理,如图1所示。后台运行了3个Pod,这些Pod是相互独立且可被替换的,当Pod出现状况被重建时,新建的Pod的IP地址是新IP,前台的Pod无法直接感知。 图1 负载间访问
  • M CS 的工作原理 MCS的功能主要通过控制面组件karmada-controller-manager实现。karmada-controller-manager实时监控Service和MCS的变化,解析MCS对象定义的规则并负责将请求转发到相应的后端Service。 图1 MCS工作原理 MCS的工作原理如图1,实现流程如下: 用户在集群联邦控制面创建工作负载,并为其配置Service对象。图中名为foo的Service部署在cluster B中。 用户在集群联邦控制面创建MCS对象,并在MCS中配置访问规则,包括下发集群与目标集群名称等。图中的下发集群为cluster B,目标集群为cluster A。 karmada-controller-manager监控到Service和MCS对象的变化,将Service下发到源集群,并将源集群中的Endpoint Slices采集并下发到目标集群。 用户在目标集群(cluster A)中访问部署在下发集群(cluster B)中的Service时,请求将会被路由到源集群的服务后端,从而实现跨集群服务发现及访问。
  • 为什么需要MCS Service是Kubernetes中的一种资源对象,定义了一组Pod的访问方式。Service为Pod提供了一个稳定的IP地址和DNS名称,使得应用程序可以通过该IP地址或DNS名称来访问这些Pod,从而自动发现和连接到可用的Pod。在多集群场景下,为了满足数据主权、状态管理、可伸缩性等要求,需要将服务拆分至多个集群进行访问,这个过程相较单集群的服务访问而言更加困难。 MCS(Multi Cluster Service)是一种多集群Service资源对象,将Service的边界从单个集群扩展至集群联邦,帮助您简洁快速地实现跨集群服务发现和访问。 具体来说,MCS的应用场景非常广泛,典型的应用场景包括: 应用容灾:使用MCS,您可以在多个区域的不同集群中访问同一个Service,因此如果某个集群中应用不可用,访问请求可切换至其他集群进行处理。 服务共享:使用MCS,可以更便捷地在不同集群中访问公共服务(监控、日志系统等),无需为所有集群部署本地公共服务副本。 应用迁移:MCS桥接了不同集群服务间的通信,您可以将同一Service部署到不同集群,通过流量迁移来更轻松地进行应用迁移。
  • MCS的使用流程 MCS的使用流程见图2,具体的使用流程如下: 检测集群间的节点网络互通与容器网络互通,若未互通则需按照要求打通。具体操作请参见设置集群网络。 在集群联邦中提前部署可用的工作负载和服务。具体操作请参见准备工作。 创建MCS对象,并在MCS中配置访问规则。具体操作请参见创建MCS对象。 跨集群访问服务,即在MCS中配置的目标集群中访问部署在下发集群中的服务。具体操作请参见跨集群访问服务。 图2 MCS使用流程
  • 相关操作 通过UCS控制台,您还可以执行表1中的操作。 表1 相关操作 操作 说明 YAML创建 单击右上角“YAML创建”,可使用已有的YAML创建服务。 查看详情 选择服务所在的命名空间。 (可选)根据服务名称进行搜索。 单击服务名称即可查看服务详情,包括基本信息以及各集群的部署信息。 在服务详情页的部署集群栏中单击“查看YAML”,可查看各个集群中部署的服务实例YAML,并支持下载。 编辑YAML 单击服务名称后的“编辑YAML”,可查看并编辑当前服务的YAML文件。 更新 单击服务名称后的“更新”。 根据服务参数更改信息。 单击“确认”提交已修改的信息。 删除 单击服务名称后的“删除”,并单击“是”进行确认。 批量删除 勾选需要删除的服务。 单击左上角的“批量删除”。 单击“是”进行确认。
  • 创建工作负载后设置 登录UCS控制台,在左侧导航栏中选择“容器舰队”。 在“容器舰队”页签下找到已开通集群联邦的舰队,单击名称进入详情页。 在左侧导航栏中选择“服务与路由”,选择“服务”页签。 选择服务所在命名空间,并单击右上角“创建服务”。如需新建命名空间,请参见创建命名空间。 设置访问参数。 图2 创建服务 Service名称:自定义服务名称,可与工作负载名称保持一致。 服务类型:选择“集群内访问 ClusterIP”。 端口配置: 协议:TCP或UDP,请根据业务的协议类型选择。 服务端口:容器端口映射到集群虚拟IP上的端口,用虚拟IP访问应用时使用,端口范围为1-65535,可任意指定。 容器端口:容器镜像中应用程序实际监听的端口,需用户确定。例如:nginx程序实际监听的端口为80。 命名空间:服务所在命名空间。 选择器:服务通过选择器与负载(标签)关联。单击“引用负载标签”,可选择已有的工作负载。 负载类型:选择需要关联的负载类型。 工作负载:选择一个已有的工作负载。如工作负载列表未显示,请单击刷新。 标签:选择工作负载后自动获取对应的标签,不可修改。 图3 引用负载标签 单击“确认”。创建成功后可在“服务”页签的列表中查看。
  • 创建工作负载时设置 创建Deployment、StatefulSet、DaemonSet等不同类型的工作负载时添加Service的方法一致。 参考创建无状态负载、创建有状态负载或创建守护进程集,在服务配置步骤,单击,进行工作负载服务配置。 Service名称:服务名称,可自定义,取值范围为1-50字符。 访问类型:选择“集群内访问 ClusterIP”。 端口配置: 协议:TCP或UDP,请根据业务的协议类型选择。 服务端口:容器端口映射到集群虚拟IP上的端口,用虚拟IP访问应用时使用,端口范围为1-65535,可任意指定。 容器端口:容器镜像中应用程序实际监听的端口,需用户确定。例如:nginx程序实际监听的端口为80。 图1 工作负载服务配置 设置完成后,单击“确认”。 单击“下一步:调度与差异化”,进行集群调度与差异化配置。设置完成后,单击“创建工作负载”完成创建。 获取访问地址。 单击左侧导航栏“服务与路由”,选择“服务”页签。 单击所添加的Service名称进入“服务详情”界面,获取部署集群的访问地址。