将 Kubernetes 组件添加到 Cloud Assembly 云模板时,可以选择添加集群或允许用户在各种配置中创建命名空间。通常,此选择取决于您的访问控制要求、Kubernetes 组件的配置方式以及您的部署要求。
要在 Cloud Assembly 中将 Kubernetes 组件添加到云模板,请选择 ,单击新建,然后在左侧菜单中找到并展开 Kubernetes 选项。然后,通过将所需选项(集群或 KBS 命名空间)拖动到画布做出选择。
将与项目关联的 Kubernetes 集群添加到云模板是使 Kubernetes 资源可供有效用户使用的最简单方法。您可以在集群上使用标记来控制其部署位置,就像处理其他 Cloud Assembly 资源一样。在集群部署的分配阶段,可以使用标记选择区域和 VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) 计划。
通过这种方式添加集群后,该集群将自动可供所有有效用户使用。
云模板示例
第一个云模板示例显示了通过标记控制的简单 Kubernetes 部署的模板。创建的 Kubernetes 区域包含两个部署计划,并在“新建 Kubernetes 区域”页面上进行配置。在此示例中,一个名为 placement:tag
的标记添加为该区域中的一个功能,并用于匹配云模板上的类似限制。如果有多个区域配置了此标记,将选择具有最低优先级编号的区域。
formatVersion: 1 inputs: {} resources: Cluster_provisioned_from_tag: type: Cloud.K8S.Cluster properties: hostname: 109.129.209.125 constraints: -tag: 'placement tag' port: 7003 workers: 1 connectBy: hostname
第二个云模板示例显示了如何使用名为 $(input.hostname) 的变量设置模板,以便用户可以在请求部署时输入所需的集群主机名。在集群部署的资源分配阶段,也可以使用标记选择区域和 TKGI 计划。
formatVersion: 1 inputs: hostname: type: string title: Cluster hostname resources: Cloud_K8S_Cluster_1: type: Cloud.K8S.Cluster properties: hostname: ${input.hostname} port: 8443 connectBy: hostname workers: 1
如果要使用命名空间管理集群使用情况,可以在云模板中设置一个名为 name: ${input.name} 的变量来替代用户在请求部署时输入的命名空间名称。对于此类部署,您需要创建一个如以下示例所示的模板:
1 formatVersion: 1 2 inputs: 3 name: 4 type: string 5 title: "Namespace name" 6 resources: 7 Cloud_KBS_Namespace_1: 8 type: Cloud.K8S.Namespace 9 properties: 10 name: ${input.name}
用户可以通过 kubeconfig 文件管理部署的集群,这些文件可从Kubeconfig。
页面访问。在页面上找到所需集群对应的卡视图,然后单击VMware Cloud Templates 中的主管命名空间
以下是 Cloud Assembly 云模板中基本主管命名空间的结构定义。
{ "title": "Supervisor namespace schema", "description": "Request schema for provisioning of Supervisor namespace resource", "type": "object", "properties": { "name": { "title": "Name", "description": "Alphabetic (a-z and 0-9) string with maximum length of 63 characters. The character ‘-’ is allowed anywhere except the first or last position of the identifier.", "type": "string", "pattern": "^.*\\$\\{.*\\}.*$|^((?!-)[a-z0-9-]{1,63}(?<!-))$", "ignoreOnUpdate": true }, "description": { "title": "Description", "description": "An optional description of this Supervisor namespace.", "type": "string", "ignoreOnUpdate": true }, "content": { "title": "Content", "description": "Kubernetes Yaml Content", "type": "string", "maxLength": 65000 }, "constraints": { "title": "Constraints", "description": "To target the correct resources, blueprint constraints are matched against infrastructure capability tags. Constraints must include the key name. Options include value, negative [!], and hard or soft requirement.", "type": "array", "recreateOnUpdate": true, "items": { "type": "object", "properties": { "tag": { "title": "Tag", "description": "Constraint definition in syntax `[!]tag_key[:tag_value][:hard|:soft]` \nExamples:\n```\n!location:eu:hard\n location:us:soft\n!pci\n```", "type": "string", "recreateOnUpdate": true } } } }, "limits": { "title": "Limits", "description": "Defines namespace resource limits such as pods, services, etc.", "type": "object", "properties": { "stateful_set_count": { "title": "stateful_set_count", "description": "This represents the new value for 'statefulSetCount' option which is the maximum number of StatefulSets in the namespace.", "type": "integer", "recreateOnUpdate": false }, "deployment_count": { "title": "deployment_count", "description": "This represents the new value for 'deploymentCount' option which is the maximum number of deployments in the namespace.", "type": "integer", "recreateOnUpdate": false }, "cpu_limit_default": { "title": "cpu_limit_default", "description": "This represents the new value for the default CPU limit (in Mhz) for containers in the pod. If specified, this limit should be at least 10 MHz.", "type": "integer", "recreateOnUpdate": false }, "config_map_count": { "title": "config_map_count", "description": "This represents the new value for 'configMapCount' option which is the maximum number of ConfigMaps in the namespace.", "type": "integer", "recreateOnUpdate": false }, "pod_count": { "title": "pod_count", "description": "This represents the new value for 'podCount' option which is the maximum number of pods in the namespace.", "type": "integer", "recreateOnUpdate": false }, "job_count": { "title": "job_count", "description": "This represents the new value for 'jobCount' option which is the maximum number of jobs in the namespace.", "type": "integer", "recreateOnUpdate": false }, "secret_count": { "title": "secret_count", "description": "This represents the new value for 'secretCount' option which is the maximum number of secrets in the namespace.", "type": "integer", "recreateOnUpdate": false }, "cpu_limit": { "title": "cpu_limit", "description": "This represents the new value for 'limits.cpu' option which is equivalent to the maximum CPU limit (in MHz) across all pods in the namespace.", "type": "integer", "recreateOnUpdate": false }, "cpu_request_default": { "title": "cpu_request_default", "description": "This represents the new value for the default CPU request (in Mhz) for containers in the pod. If specified, this field should be at least 10 MHz.", "type": "integer", "recreateOnUpdate": false }, "memory_limit_default": { "title": "memory_limit_default", "description": "This represents the new value for the default memory limit (in mebibytes) for containers in the pod.", "type": "integer", "recreateOnUpdate": false }, "memory_limit": { "title": "memory_limit", "description": "This represents the new value for 'limits.memory' option which is equivalent to the maximum memory limit (in mebibytes) across all pods in the namespace.", "type": "integer", "recreateOnUpdate": false }, "memory_request_default": { "title": "memory_request_default", "description": "This represents the new value for the default memory request (in mebibytes) for containers in the pod.", "type": "integer", "recreateOnUpdate": false }, "service_count": { "title": "service_count", "description": "This represents the new value for 'serviceCount' option which is the maximum number of services in the namespace.", "type": "integer", "recreateOnUpdate": false }, "replica_set_count": { "title": "replica_set_count", "description": "This represents the new value for 'replicaSetCount' option which is the maximum number of ReplicaSets in the namespace.", "type": "integer", "recreateOnUpdate": false }, "replication_controller_count": { "title": "replication_controller_count", "description": "This represents the new value for 'replicationControllerCount' option which is the maximum number of ReplicationControllers in the namespace.", "type": "integer", "recreateOnUpdate": false }, "storage_request_limit": { "title": "storage_request_limit", "description": "This represents the new value for 'requests.storage' which is the limit on storage requests (in mebibytes) across all persistent volume claims from pods in the namespace.", "type": "integer", "recreateOnUpdate": false }, "persistent_volume_claim_count": { "title": "persistent_volume_claim_count", "description": "This represents the new value for 'persistentVolumeClaimCount' option which is the maximum number of PersistentVolumeClaims in the namespace.", "type": "integer", "recreateOnUpdate": false }, "daemon_set_count": { "title": "daemon_set_count", "description": "This represents the new value for 'daemonSetCount' option which is the maximum number of DaemonSets in the namespace.", "type": "integer", "recreateOnUpdate": false } }, "additionalProperties": false }, "vm_classes": { "title": "VM classes", "description": "Defines set of Virtual Machine classes to be assigned to the namespace", "type": "array", "recreateOnUpdate": false, "items": { "type": "object", "properties": { "name": { "title": "Name", "description": "Name of the Virtual Machine class.", "type": "string", "recreateOnUpdate": false } } } }, "storage": { "title": "Storage policies", "description": "Defines set of storage profiles to be used to assign storage policies to the namespace.", "type": "array", "recreateOnUpdate": false, "items": { "type": "object", "properties": { "profile": { "type": "object", "title": "Storage profile", "description": "Defines storage policies to be assigned to the namespace", "recreateOnUpdate": false, "properties": { "constraints": { "title": "Constraints", "description": "To target the correct storage profiles, blueprint constraints are matched against storage profile capability tags.", "type": "array", "recreateOnUpdate": false, "items": { "type": "object", "properties": { "tag": { "title": "Tag", "description": "Constraint definition in syntax `[!]tag_key[:tag_value][:hard|:soft]` \nExamples:\n```\nlocation:eu:hard\n location:us:soft\n```", "type": "string", "recreateOnUpdate": false } } }, "minItems":1 }, "limitMb": { "title": "Limit", "description": "The maximum amount of storage (in mebibytes) which can be utilized by the namespace for this storage policy. Optional. If unset, no limits are placed.", "type": "integer" } }, "required": [ "constraints" ] } } } } }, "required": [ "name" ] }
VMware Cloud Templates 支持对主管命名空间使用限制。通过使用限制,可以控制 CPU 和内存资源的使用,以及已部署计算机在命名空间中允许的最大 pod 数。
formatVersion: 1 inputs: {} resources: Cloud_SV_Namespace_1: type: Cloud.SV.Namespace properties: name: '${env.deploymentName}' limits: - cpu_limit: 1000 cpu_request_default: 800 memory_limit: 2000 memory_limit_default: 1500 pod_count: 200
以下示例显示了如何使用标记指定存储策略。
formatVersion: 1 inputs: {} resources: Cloud_SV_Namespace_1: type: Cloud.SV.Namespace properties: name: 'ns-with-storage-policy' description: 'sample' storage: - profile: limitMb: 1000 constraints: - tag: 'storage:fast' - profile: constraints: - tag: 'storage:cheap'
对自助命名空间或集群 VCT 使用任意 YAML
在集群或命名空间创建过程中,用户通常希望执行其他自定义。例如,您可能希望添加用户(角色/角色绑定),或者创建 pod 安全策略,或者安装代理。通过使用 YAML content
属性,用户可以定义要在该集群/命名空间/主管命名空间上置备的自定义内容包。
与 content
属性关联的每个 YAML 内容包都必须使用三连短划线 (---) 分隔。此外,内容信息必须是多行字符串。请参阅以下 YAML 示例,了解如何配置内容包。
formatVersion: 1 inputs: {} resources: Cloud_Tanzu_Cluster_1: type: Cloud.Tanzu.Cluster properties: name: ddonchev-tkc plan: small content: |- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: psp:authenticated-from-yaml subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: system:authenticated roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: psp:vmware-system-privileged --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: # name must match the spec fields below, and be in the form: <plural>.<group> name: crontabs.stable.example.com spec: # group name to use for REST API: /apis/<group>/<version> group: stable.example.com # list of versions supported by this CustomResourceDefinition versions: - name: v1 # Each version can be enabled/disabled by Served flag. served: true # One and only one version must be marked as the storage version. storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: cronSpec: type: string image: type: string replicas: type: integer # either Namespaced or Cluster scope: Namespaced names: # plural name to be used in the URL: /apis/<group>/<version>/<plural> plural: crontabs # singular name to be used as an alias on the CLI and for display singular: crontab # kind is normally the CamelCased singular type. Your resource manifests use this. kind: CronTab # shortNames allow shorter string to match your resource on the CLI shortNames: - ct
内容属性中定义的 YAML 也会显示在部署的“属性”选项卡上。
Cloud Assembly 只能在部署的资源范围内创建内容资源。例如:如果置备 kubernetes 命名空间,则 Cloud Assembly 无法在其他命名空间中创建部署。用户拥有的权限就像他们在 kubectl 中使用 kubeconfig 时一样。
置备虚拟机后,将开始安装 content
属性中的 kubernetes 对象。如果 YAML 内容属性中引用的某个资源无法置备,Cloud Assembly 将回滚并从资源中删除所有以前的 kubernetes 对象,并且部署的状态为“失败”。该资源仍将进行置备且可见。此外,您仍然可以使用实施后操作,包括尝试再次应用内容。
可以使用云模板中的输入增强 content
属性,如以下示例中所示。
formatVersion: 1 inputs: {} resources: Cloud_SV_Namespace_1: type: Cloud.SV.Namespace properties: name: sv-namespace-with-vm-classes vm_classes: - name: best-effort-2xlarge - name: best-effort-4xlarge - name: best-effort-8xlarge
此外,还可以置备自定义资源,例如 TanzuKubernetesCluster
。此操作作为实施中操作将会失败,因为主管命名空间将不包含所需的虚拟机类和存储类。当虚拟机类和存储类绑定到主管命名空间时,可以使用实施后操作创建 TanzuKubernetesCluster
(或其他资源)。
注意:可以置备不含内容的资源,并且仍可以通过实施后操作以 YAML 的形式添加 kubernetes 对象。
YAML 属性中显示的内容定义了在资源上置备的内容。编辑此内容时,下表显示了可能的结果:
操作 | 结果 |
---|---|
如果添加 kubernetes 对象并提交。 | 在资源上创建指定的对象。 |
如果移除 Kubernetes 对象并提交。 | 从资源中删除指定的对象。 |
如果修改并提交 Kubernetes 对象。 | 在资源上修补指定的对象。 |
请务必澄清哪些操作视为对当前对象的修改。例如:如果修改对象的命名空间字段,则会创建一个新对象,而不是要修补的旧对象。
资源的唯一性由以下字段定义:apiVersion
、kind
、metadata.name
、metadata.namespace