
# 创建服务 - CreateService
#### 功能介绍
创建一个服务
#### 调试
您可以在[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/IEF/doc?api=CreateService)中调试该接口，支持自动认证鉴权。API Explorer可以自动生成SDK代码示例，并提供SDK代码示例调试功能。
#### 授权信息
账号具备所有API的调用权限，如果使用账号下的IAM用户调用当前API，该IAM用户需具备调用API所需的权限，具体权限要求请参见[权限和授权项](https://support.huaweicloud.com/api-ief/ief_02_1003.html)。
#### URI
POST /v2/{project_id}/edgemgr/services
表1路径参数 
| 参数         | 是否必选 | 参数类型   | 描述   |
|:---|:---|:---|:---|
| project_id | 是    | String | 项目ID |
#### 请求参数
表2请求Header参数 
| 参数              | 是否必选 | 参数类型   | 描述                                                        |
|:---|:---|:---|:---|
| Content-Type    | 是    | String | 消息体的类型（格式），默认取值为"application/json"。                       |
| X-Auth-Token    | 是    | String | 用户Token。 通过调用IAM服务获取用户Token接口获取（响应消息头中X-Subject-Token的值）。 |
| ief-instance-id | 是    | String | 企业版实例ID                                                   |
   
表3请求Body参数 
| 参数      | 是否必选 | 参数类型                                                                | 描述   |
|:---|:---|:---|:---|
| service | 否    | [ServiceReqDetail] object | 服务详情 |
   
 表4ServiceReqDetail 
| 参数        | 是否必选 | 参数类型                                                      | 描述      |
|:---|:---|:---|:---|
| meta_data | 是    | [SvcMetadata] object | 服务详情    |
| spec      | 是    | [SvcSpec] object         | 服务的动态属性 |
   
 表5SvcMetadata 
| 参数     | 是否必选 | 参数类型                 | 描述                                              |
|:---|:---|:---|:---|
| labels | 否    | Map\<String,String\> | 自定义标签属性列表                                       |
| name   | 是    | String               | 服务名称，只允许英文小写字母、数字、中划线，最大长度64，英文小写字母开头，数字或小写字母结尾 |
   
 表6SvcSpec 
| 参数            | 是否必选 | 参数类型                                                        | 描述                             |
|:---|:---|:---|:---|
| cluster_ip    | 否    | String                                                      | 虚拟服务IP地址                       |
| external_ips  | 否    | Array of strings                                            | 外部IP列表 --- 暂不支持                |
| external_name | 否    | String                                                      | 外部域名 --- 暂不支持                  |
| ports         | 否    | Array of [SvcPort] objects | 服务需要暴露的端口列表                    |
| selector      | 是    | Map\<String,String\>                                        | 标签选择器，将选择具有指定Label标签的Pod作为管理范围 |
| type          | 否    | String                                                      | 服务的类型，仅支持填写：ClusterIP          |
   
 表7SvcPort 
| 参数          | 是否必选 | 参数类型   | 描述                                                                                                                                                            |
|:---|:---|:---|:---|
| name        | 否    | String | 服务端口必须进行命名，而且名称只允许是{protocol}-{suffix}这种格式，其中{protocol}可以是tcp、http等，IEF根据在端口上定义的协议来提供对应的路由能力。例如"name:http-0"和"name:tcp-0"是合法的端口名，"name:http2forecast"是非法的端口号。 |
| node_port   | 否    | String | 当spec.type=NodePort时，指定映射到物理机的端口号                                                                                                                             |
| port        | 否    | String | 服务监听的端口号                                                                                                                                                      |
| protocol    | 否    | String | 具体的协议，比如TCP                                                                                                                                                   |
| target_port | 否    | String | 需要转发到后端Pod的端口号                                                                                                                                                |
   
#### 响应参数
**状态码：201**
表8响应Body参数 
| 参数      | 参数类型                                                                   | 描述   |
|:---|:---|:---|
| service | [ServiceRespDetail] object | 服务详情 |
   
 表9ServiceRespDetail 
| 参数         | 参数类型                                                       | 描述      |
|:---|:---|:---|
| created_at | String                                                     | 创建时间    |
| id         | String                                                     | 服务ID    |
| meta_data  | [SvcMetadata] object | 服务详情    |
| project_id | String                                                     | 租户ID    |
| spec       | [SvcSpec] object         | 服务的动态属性 |
| updated_at | String                                                     | 更新时间    |
   
 表10SvcMetadata 
| 参数     | 参数类型                 | 描述                                              |
|:---|:---|:---|
| labels | Map\<String,String\> | 自定义标签属性列表                                       |
| name   | String               | 服务名称，只允许英文小写字母、数字、中划线，最大长度64，英文小写字母开头，数字或小写字母结尾 |
   
 表11SvcSpec 
| 参数            | 参数类型                                                         | 描述                             |
|:---|:---|:---|
| cluster_ip    | String                                                       | 虚拟服务IP地址                       |
| external_ips  | Array of strings                                             | 外部IP列表 --- 暂不支持                |
| external_name | String                                                       | 外部域名 --- 暂不支持                  |
| ports         | Array of [SvcPort] objects | 服务需要暴露的端口列表                    |
| selector      | Map\<String,String\>                                         | 标签选择器，将选择具有指定Label标签的Pod作为管理范围 |
| type          | String                                                       | 服务的类型，仅支持填写：ClusterIP          |
   
 表12SvcPort 
| 参数          | 参数类型   | 描述                                                                                                                                                            |
|:---|:---|:---|
| name        | String | 服务端口必须进行命名，而且名称只允许是{protocol}-{suffix}这种格式，其中{protocol}可以是tcp、http等，IEF根据在端口上定义的协议来提供对应的路由能力。例如"name:http-0"和"name:tcp-0"是合法的端口名，"name:http2forecast"是非法的端口号。 |
| node_port   | String | 当spec.type=NodePort时，指定映射到物理机的端口号                                                                                                                             |
| port        | String | 服务监听的端口号                                                                                                                                                      |
| protocol    | String | 具体的协议，比如TCP                                                                                                                                                   |
| target_port | String | 需要转发到后端Pod的端口号                                                                                                                                                |
   
**状态码：400**
表13响应Body参数 
| 参数         | 参数类型   | 描述     |
|:---|:---|:---|
| error_code | String | 错误码    |
| error_msg  | String | 错误描述信息 |
   
**状态码：500**
表14响应Body参数 
| 参数         | 参数类型   | 描述     |
|:---|:---|:---|
| error_code | String | 错误码    |
| error_msg  | String | 错误描述信息 |
   
#### 请求示例
创建一个服务，服务端口名为"http-0"，服务监听的端口号为"8888"，转发到后端Pod的端口号为"80"，TCP协议。
```
{
  "service" : {
    "meta_data" : {
      "name" : "service-example",
      "labels" : { }
    },
    "spec" : {
      "cluster_ip" : "None",
      "external_ips" : [ ],
      "external_name" : "",
      "ports" : [ {
        "name" : "http-0",
        "port" : "8888",
        "target_port" : "80",
        "protocol" : "TCP",
        "node_port" : ""
      } ],
      "selector" : {
        "app" : "ief-nginx"
      },
      "type" : ""
    }
  }
}
```
#### 响应示例
**状态码：201**
创建成功
```
{
  "service" : {
    "id" : "81acf9ff-de6d-4736-8d1a-f43bb058e79d",
    "project_id" : "e78acc02d9d141eda5ca8e88fa35f6f8",
    "meta_data" : {
      "name" : "service-example"
    },
    "spec" : {
      "selector" : {
        "app" : "ief-nginx"
      },
      "ports" : [ {
        "name" : "http-0",
        "protocol" : "TCP",
        "port" : "8888",
        "target_port" : "80"
      } ],
      "cluster_ip" : "None"
    },
    "created_at" : "2020-07-08 01:23:25.845332209 +0000 UTC",
    "updated_at" : "2020-07-08 01:23:25.845332209 +0000 UTC"
  }
}
```
#### 状态码
| 状态码 | 描述   |
|:---|:---|
| 201 | 创建成功 |
| 400 | 错误响应 |
| 500 | 错误响应 |
   
#### 错误码
请参见[错误码](https://support.huaweicloud.com/api-ief/ErrorCode.html)。
