更新时间:2024-01-16 GMT+08:00

调用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

  1. 调用创建Namespace接口创建命名空间,并指定使用命名空间的类型。

    {
        "apiVersion": "v1",
        "kind": "Namespace",
        "metadata": {
            "name": "namespace-test",
            "annotations": {
                "namespace.kubernetes.io/flavor": "gpu-accelerated"
            }
        },
        "spec": {
            "finalizers": [
                "kubernetes"
            ]
        }
    }

  2. 调用创建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

  1. 调用创建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"
                        }
                    ]
                }
            }
        }
    }

  2. 调用创建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

  1. 调用创建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"
                        }
                    ]
                }
            }
        }
    }

  2. 调用创建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"
        }
    }

  3. 调用创建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
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }