
# 调用API创建负载
云容器实例原生支持Kubernetes API，相比从控制台创建负载，使用API的粒度更细一些。
Kubernetes中，运行容器的最小资源单位是Pod，一个Pod封装一个或多个容器、存储资源、一个独立的网络IP等。实际使用中很少直接创建Pod，而是使用Kubernetes中称为Controller的抽象层来管理Pod实例，例如Deployment和StatefulSet。另外在Kubernetes中使用Service定义一系列Pod以及访问这些Pod的策略的资源对象，使用Ingress管理外部访问的资源对象。 如果您对Kubernetes的资源不熟悉，请参见《[云容器实例开发指南](https://support.huaweicloud.com/devg-cci/cci_05_0001.html)》了解各资源的关系。
对于Wordpress应用，可以按照下图调用API创建一系列资源。
- MySQL：创建一个Deployment部署mysql，创建一个Service定义mysql的访问策略。
- Wordpress：创建一个Deployment部署wordpress，创建Service和Ingress定义wordpress的访问策略。
![](https://support.huaweicloud.com/bestpractice-cci/zh-cn_image_0201410223.png "点击放大")
#### Namespace
1. 调用[创建Namespace](https://support.huaweicloud.com/api-cci/createCoreV1Namespace.html)接口创建命名空间，并指定使用命名空间的类型。
   
   ```
   {
       "apiVersion": "v1",
       "kind": "Namespace",
       "metadata": {
           "name": "namespace-test",
           "annotations": {
               "namespace.kubernetes.io/flavor": "gpu-accelerated"
           }
       },
       "spec": {
           "finalizers": [
               "kubernetes"
           ]
       }
   }
   ```
   
   
2. 调用[创建Network](https://support.huaweicloud.com/api-cci/createNetworkingCciIoV1beta1NamespacedNetwork.html)接口创建网络，与VPC与子网关联。
   
   ```
   {
       "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": "test-network"
       },
       "spec": {
           "availableZone": "{{zone}}",
           "cidr": "192.168.0.0/24",
           "attachedVPC": "{{vpc-id}}",
           "networkID": "{{network-id}}",
           "networkType": "underlay_neutron",
           "subnetID": "{{subnet-id}}"
       }
   }
   ```
   
   
 
#### MySQL
1. 调用[创建Deployment](https://support.huaweicloud.com/api-cci/createAppsV1NamespacedDeployment.html)接口部署MySQL。
   
   - Deployment名称为mysql。
   
   - 设置Pod的标签为app:mysql。
   
   - 使用mysql:5.7镜像。
   
   - 设置容器环境变量MYSQL_ROOT_PASSWORD为"\*\*\*\*\*\*\*\*"，请替换为您设置的密码。
   
   
   ```
   {
       "apiVersion": "apps/v1",
       "kind": "Deployment",
       "metadata": {
           "name": "mysql"
       },
       "spec": {
           "replicas": 1,
           "selector": {
               "matchLabels": {
                   "app": "mysql"
               }
           },
           "template": {
               "metadata": {
                   "labels": {
                       "app": "mysql"
                   }
               },
               "spec": {
                   "containers": [
                       {
                           "image": "mysql:5.7",
                           "name": "container-0",
                           "resources": {
                               "limits": {
                                   "cpu": "500m",
                                   "memory": "1024Mi"
                               },
                               "requests": {
                                   "cpu": "500m",
                                   "memory": "1024Mi"
                               }
                           },
                           "env": [
                               {
                                   "name": "MYSQL_ROOT_PASSWORD",
                                   "value": "********"
                               }
                           ]
                       }
                   ],
                   "imagePullSecrets": [
                       {
                           "name": "imagepull-secret"
                       }
                   ]
               }
           }
       }
   }
   ```
   
   
2. 调用[创建Service接口](https://support.huaweicloud.com/api-cci/createCoreV1NamespacedService.html)，定义[1]中创建的Pod的访问策略。
   
   - Service名称为mysql。
   
   - 选择标签为app:mysql的Pod，即关联[1]中创建的Pod。
   
   - 负载访问端口3306映射到容器的3306端口。
   
   - Service的访问类型为ClusterIP，即使用ClusterIP在内部访问Service。
   
   
   ```
   {
       "apiVersion": "v1",
       "kind": "Service",
       "metadata": {
           "name": "mysql",
           "labels": {
               "app": "mysql"
           }
       },
       "spec": {
           "selector": {
               "app": "mysql"
           },
           "ports": [
               {
                   "name": "service0",
                   "targetPort": 3306,
                   "port": 3306,
                   "protocol": "TCP"
               }
           ],
           "type": "ClusterIP"
       }
   }
   ```
   
   
 
#### Wordpress
1. 调用[创建Deployment](https://support.huaweicloud.com/api-cci/createAppsV1NamespacedDeployment.html)接口部署Wordpress。
   
   - Deployment名称为wordpress。
   
   - replicas值为2，表示创建2个pod。
   
   - 设置Pod的标签为app:wordpress。
   
   - 使用wordpress:latest镜像。
   
   - 设置容器环境变量WORDPRESS_DB_PASSWORD为"\*\*\*\*\*\*\*\*"，请替换为您设置的密码。此处的密码必须与MySQL的MYSQL_ROOT_PASSWORD一致。
   
   
   ```
   {
       "apiVersion": "apps/v1",
       "kind": "Deployment",
       "metadata": {
           "name": "wordpress"
       },
       "spec": {
           "replicas": 2,
           "selector": {
               "matchLabels": {
                   "app": "wordpress"
               }
           },
           "template": {
               "metadata": {
                   "labels": {
                       "app": "wordpress"
                   }
               },
               "spec": {
                   "containers": [
                       {
                           "image": "wordpress:latest",
                           "name": "container-0",
                           "resources": {
                               "limits": {
                                   "cpu": "500m",
                                   "memory": "1024Mi"
                               },
                               "requests": {
                                   "cpu": "500m",
                                   "memory": "1024Mi"
                               }
                           },
                           "env": [
                               {
                                   "name": "WORDPRESS_DB_PASSWORD",
                                   "value": "********"
                               }
                           ]
                       }
                   ],
                   "imagePullSecrets": [
                       {
                           "name": "imagepull-secret"
                       }
                   ]
               }
           }
       }
   }
   ```
   
   
2. 调用[创建Service接口](https://support.huaweicloud.com/api-cci/createCoreV1NamespacedService.html)创建一个Service，定义[1]中创建的Pod的访问策略。
   
   - Service名称为wordpress。
   
   - 选择标签为app:wordpress的Pod，即关联[1]中创建的Pod。
   
   - 负载访问端口8080映射到容器的80端口，80端口为wordpress镜像的默认对外暴露的端口。
   
   - Service的访问类型为ClusterIP，即使用ClusterIP在内部访问Service。
   
   
   ```
   {
       "apiVersion": "v1",
       "kind": "Service",
       "metadata": {
           "name": "wordpress",
           "labels": {
               "app": "wordpress"
           }
       },
       "spec": {
           "selector": {
               "app": "wordpress"
           },
           "ports": [
               {
                   "name": "service0",
                   "targetPort": 80,
                   "port": 8080,
                   "protocol": "TCP"
               }
           ],
           "type": "ClusterIP"
       }
   }
   ```
   
   
3. 调用[创建Ingress](https://support.huaweicloud.com/api-cci/createExtensionsV1beta1NamespacedIngress.html)接口创建一个Ingress，定义wordpress的外部访问策略，即关联ELB实例（ELB实例需要与Wordpress负载在同一个VPC内）。
   
   - metadata.annotations.kubernetes.io/elb.id：ELB实例的ID。
   
   - metadata.annotations.kubernetes.io/elb.ip：ELB实例的IP地址。
   
   - metadata.annotations.kubernetes.io/elb.port：ELB实例的端口。
   
   - spec.rules：访问服务的规则集合。path列表，每个path（比如：/）都关联一个backend（比如"wordpress:8080"）。backend是一个service:port的组合。Ingress的流量被转发到它所匹配的backend。
   
   
   这里配置完后，访问ELB的IP:端口的流量就会流向wordpress:8080这个Service，由于Service是关联了wordpress的Pod，所以最终访问的就是[1]中部署的wordpress容器。
   ```
   {
       "apiVersion": "extensions/v1beta1",
       "kind": "Ingress",
       "metadata": {
           "name": "wordpress",
           "labels": {
               "app": "wordpress",
               "isExternal": "true",
               "zone": "data"
           },
           "annotations": {
               "kubernetes.io/elb.id": "2d48d034-6046-48db-8bb2-53c67e8148b5",
               "kubernetes.io/elb.ip": "10.10.10.10",
               "kubernetes.io/elb.port": "9012"
           }
       },
       "spec": {
           "rules": [
               {
                   "http": {
                       "paths": [
                           {
                               "path": "/",
                               "backend": {
                                   "serviceName": "wordpress",
                                   "servicePort": 8080
                               }
                           }
                       ]
                   }
               }
           ]
       }
   }
   ```
   
   
 
