Al agregar componentes de Kubernetes a una plantilla de nube de Cloud Assembly, puede optar por agregar clústeres o permitir que los usuarios creen espacios de nombres en diversas configuraciones. Por lo general, esta opción depende de los requisitos de control de acceso, de cómo se configuran los componentes de Kubernetes y de los requisitos de implementación.

Para agregar un componente de Kubernetes a una plantilla de nube en Cloud Assembly, seleccione Diseño > Plantillas de nube, haga clic en Nueva y, a continuación, busque y expanda la opción Kubernetes en el menú de la izquierda. A continuación, elija la opción que desee, ya sea Clúster o Espacio de nombres KBS, arrastrándola al lienzo.

Agregar un clúster de Kubernetes asociado con un proyecto a una plantilla de nube es el método más sencillo de hacer que los recursos de Kubernetes estén disponibles para los usuarios válidos. Puede utilizar etiquetas en los clústeres para controlar dónde se implementan, como lo haría con otros recursos de Cloud Assembly. Puede usar etiquetas para seleccionar una zona y un plan de VMware Tanzu Kubernetes Grid Integrated Edition (TKGI) durante la fase de asignación de la implementación de un clúster.

Una vez que se agrega un clúster de esta manera, queda automáticamente disponible para todos los usuarios válidos.

Ejemplos de plantillas de nube

El primer ejemplo de plantilla de nube muestra una plantilla para una implementación de Kubernetes simple controlada mediante el etiquetado. Se creó una zona de Kubernetes con dos planes de implementación, configurados en la página Nueva zona de Kubernetes. En este caso, se agregó una etiqueta denominada placement:tag como una capacidad en la zona, que se usó para que coincida con la restricción análoga de la plantilla de nube. Si hubiera más de una zona configurada con la etiqueta, se seleccionará la que tenga el número de prioridad más bajo.

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 

El segundo ejemplo de plantilla de nube muestra cómo configurar una plantilla con una variable denominada $(input.hostname) para que los usuarios puedan introducir el nombre de host del clúster deseado al solicitar una implementación. Las etiquetas también se pueden utilizar para seleccionar una zona y un plan de TKGI durante la fase de asignación de recursos de la implementación del clúster.

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

Si desea utilizar espacios de nombres a fin de administrar el uso de clústeres, puede configurar una variable en la plantilla de nube denominada name: ${input.name} para sustituir el nombre del espacio de nombres que el usuario introduce al solicitar una implementación. Para este tipo de implementaciones, se crea una plantilla similar al siguiente ejemplo:

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}

Los usuarios pueden administrar los clústeres implementados a través de archivos kubeconfig a los que se puede acceder desde la página Infraestructura > Recursos > Clústeres de Kubernetes. Busque la tarjeta en la página del clúster deseado y haga clic en Kubeconfig.

Espacios de nombres de supervisor en VMware Cloud Templates

A continuación, se muestra el esquema de un espacio de nombres de supervisor básico en una plantilla de nube de 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
    },
    "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": "array",
      "recreateOnUpdate": false,
      "items": {
        "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
      }
    }
  },
  "required": [
    "name"
  ]
}

Las VMware Cloud Templates admiten el uso de límites en los espacios de nombres de supervisor. Los límites permiten controlar el uso de recursos de CPU y memoria, así como el número máximo de pods que permiten las máquinas implementadas en el espacio de nombres.

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