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 , 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 Kubeconfig.
. Zoek de kaart op de pagina voor het gewenste cluster en klik opSupervisornaamruimten 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