Wanneer u Kubernetes-onderdelen toevoegt aan een Cloud Assembly-cloudsjabloon, kunt u ervoor kiezen om clusters toe te voegen of gebruikers in staat te stellen om naamruimten in verschillende configuraties te maken. Deze keuze is doorgaans afhankelijk van uw vereisten voor toegangscontrole, hoe u uw Kubernetes-onderdelen hebt geconfigureerd en uw implementatievereisten.

Om een Kubernetes-onderdeel toe te voegen aan een cloudsjabloon in Cloud Assembly, selecteert u Ontwerp > Cloudsjablonen, klikt u op Nieuw en zoekt u de optie Kubernetes in het linkermenu en vouwt u deze uit. Vervolgens selecteert u de gewenste optie, ofwel Cluster of KBS-naamruimte, door deze naar het canvas te slepen.

Het aan een cloudsjabloon toevoegen van een Kubernetes-cluster dat aan een project is gekoppeld, is de eenvoudigste methode om Kubernetes-resources beschikbaar te maken voor geldige gebruikers. U kunt tags in clusters gebruiken om te bepalen waar deze worden geïmplementeerd, net zoals u met andere Cloud Assembly-resources werkt. U kunt tags gebruiken om een zone en een VMware Tanzu Kubernetes Grid Integrated Edition-plan (TKGI) te selecteren tijdens de toewijzingsfase van de clusterimplementatie.

Nadat u een cluster op deze manier hebt toegevoegd, is het automatisch beschikbaar voor alle geldige gebruikers.

Voorbeelden van cloudsjablonen

In het eerste cloudsjabloonvoorbeeld ziet u een sjabloon voor een eenvoudige Kubernetes-implementatie die wordt beheerd door tagging. Een Kubernetes-zone is gemaakt met twee implementatieplannen die zijn geconfigureerd op de pagina Nieuwe Kubernetes-zone. In dit geval is een tag met de naam placement:tag toegevoegd als mogelijkheid voor de zone en deze is gebruikt om overeen te komen met de analoge beperking in de cloudsjabloon. Als er meer dan één zone is geconfigureerd met de tag, wordt de zone met het laagste prioriteitsnummer geselecteerd.

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 

In het tweede cloudsjabloonvoorbeeld ziet u hoe u een sjabloon instelt met een variabele met de naam $(input.hostname) zodat gebruikers de gewenste clusterhostnaam kunnen invoeren bij het aanvragen van een implementatie. Tags kunnen ook worden gebruikt om een zone en een TKGI-plan te selecteren tijdens de resourcetoewijzingsfase van de clusterimplementatie.

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

Als u naamruimten wilt gebruiken om het clustergebruik te beheren, kunt u een variabele instellen in de cloudsjabloon met de naam name: ${input.name} om de naam van de naamruimte te vervangen die een gebruiker invoert wanneer een implementatie wordt aangevraagd. Voor dit soort implementatie maakt u een sjabloon zoals in het volgende voorbeeld:

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}

Gebruikers kunnen geïmplementeerde clusters beheren via kubeconfig-bestanden die toegankelijk zijn via de pagina Infrastructuur > Resources > Kubernetes-clusters. Zoek de kaart op de pagina voor het gewenste cluster en klik op Kubeconfig.

Supervisornaamruimten in VMware Cloud Templates

Het volgende is het schema voor een algemene supervisornaamruimte in een Cloud Assembly-cloudsjabloon.

{
  "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 ondersteunen het gebruik van limieten met supervisornaamruimten. Met limieten kunt u het gebruik van resources voor CPU's en geheugen beheren, evenals het maximum aantal pods dat is toegestaan in de naamruimte door geïmplementeerde machines.

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

In het volgende voorbeeld ziet u hoe u een opslagbeleid kunt opgeven met tags.

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'

Willekeurige YAML's gebruiken met selfservicenaamruimte of cluster-VCT's

Tijdens het maken van een cluster of naamruimte willen gebruikers vaak aanvullende aanpassingen uitvoeren. U kunt bijvoorbeeld gebruikers (rol/rolbinding) toevoegen, een podbeveiligingsbeleid maken of agents installeren. Met de YAML-eigenschap content kunnen gebruikers aangepaste pakketten definiëren die ze op die cluster/naamruimte/supervisornaamruimte willen inrichten.

Elk YAML-inhoudspakket dat is gekoppeld aan de eigenschap content, moet worden gescheiden met een drievoudig streepje (---). Ook de inhoudsinformatie moet een tekenreeks van meerdere regels zijn. Raadpleeg het volgende YAML-voorbeeld om te zien hoe inhoudspakketten kunnen worden geconfigureerd.

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

De YAML die is gedefinieerd in de inhoudseigenschap wordt ook weergegeven op het tabblad Eigenschappen voor de implementatie.

Cloud Assembly kan alleen inhoudsresources maken binnen het bereik van de resource die wordt geïmplementeerd. Bijvoorbeeld: als u een Kubernetes-naamruimte inricht, kan Cloud Assembly geen implementatie binnen een andere naamruimte maken. Gebruikers hebben dezelfde rechten alsof ze de kubeconfig met kubectl gebruikten.

Nadat de virtuele machine is ingericht, begint een installatie van de Kubernetes-objecten in de eigenschap content. Als een van de resources waarnaar in de YAML-inhoudseigenschap wordt verwezen niet kan worden ingericht, wordt Cloud Assembly teruggedraaid en worden alle eerdere Kubernetes-objecten van de resource verwijderd en heeft de implementatie de status Mislukt. De resource is nog steeds ingericht en zichtbaar. Bovendien kunt u nog steeds acties voor dag 2 gebruiken, waaronder een poging om de inhoud opnieuw toe te passen.

U kunt de eigenschap content verbeteren met invoer van de cloudsjabloon, zoals in het volgende voorbeeld wordt weergegeven.

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

Daarnaast kunt u aangepaste resources zoals TanzuKubernetesCluster inrichten. Dit zal mislukken als een bewerking voor dag 1, omdat de supervisornaamruimte niet de vereiste VM-klassen en opslagklassen bevat. Wanneer de VM-klassen en opslagklassen aan de supervisornaamruimte zijn gebonden, kunt u TanzuKubernetesCluster (of een andere resource) maken met de actie voor dag 2.

Opmerking: u kunt een resource zonder inhoud inrichten en u kunt nog steeds Kubernetes-objecten als YAML toevoegen met de actie voor dag 2.

De inhoud die wordt weergegeven in de YAML-eigenschap definieert wat wordt ingericht op de resource. Wanneer u deze inhoud bewerkt, ziet u in de volgende tabel de mogelijke resultaten:

Actie Resultaat
Als u een Kubernetes-object toevoegt en verzendt. Het opgegeven object wordt op de resource gemaakt.
Als u een Kubernetes-object verwijdert en verzendt. Het opgegeven object wordt van de resource verwijderd.
Als u een Kubernetes-object wijzigt en verzendt. Er wordt een patch voor het opgegeven object op de resource toegepast.

Het is belangrijk om duidelijk te maken welke acties als wijziging in het huidige object worden beschouwd. Bijvoorbeeld: als u het naamruimteveld van een object wijzigt, wordt een nieuw object gemaakt, en wordt geen patch toegepast op het oude object.

De uniekheid van een resource wordt gedefinieerd door de volgende velden: apiVersion, kind, metadata.name, metadata.namespace