调用API创建负载
云容器实例原生支持Kubernetes API,相比从控制台创建负载,使用API的粒度更细一些。
Kubernetes中,运行容器的最小资源单位是Pod,一个Pod封装一个或多个容器、存储资源、一个独立的网络IP等。实际使用中很少直接创建Pod,而是使用Kubernetes中称为Controller的抽象层来管理Pod实例,例如Deployment和StatefulSet。另外在Kubernetes中使用Service定义一系列Pod以及访问这些Pod的策略的资源对象,使用Ingress管理外部访问的资源对象。 如果您对Kubernetes的资源不熟悉,请参见《云容器实例开发指南》了解各资源的关系。
对于Wordpress应用,可以按照下图调用API创建一系列资源。
- MySQL:创建一个Deployment部署mysql,创建一个Service定义mysql的访问策略。
- Wordpress:创建一个Deployment部署wordpress,创建Service和Ingress定义wordpress的访问策略。
Namespace
- 调用创建Namespace接口创建命名空间,并指定使用命名空间的类型。
{ "apiVersion": "v1", "kind": "Namespace", "metadata": { "name": "namespace-test", "annotations": { "namespace.kubernetes.io/flavor": "gpu-accelerated" } }, "spec": { "finalizers": [ "kubernetes" ] } }
- 调用创建Network接口创建网络,与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
- 调用创建Deployment接口部署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" } ] } } } }
- 调用创建Service接口创建一个Service,定义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
- 调用创建Deployment接口部署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" } ] } } } }
- 调用创建Service接口创建一个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" } }
- 调用创建Ingress接口创建一个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 } } ] } } ] } }