При добавлении компонентов Kubernetes в облачный шаблон vRealize Automation Cloud Assembly можно добавить кластеры или разрешить пользователям создавать пространства имен в различных конфигурациях. Как правило, выбор операции зависит от требований по контролю доступа, от способа настройки компонентов Kubernetes и требований к развертыванию.

Чтобы добавить компонент Kubernetes в облачный шаблон в vRealize Automation Cloud Assembly, выберите Проектирование > Облачные шаблоны, щелкните Создать, а затем найдите и разверните параметр 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, доступных на странице Инфраструктура > Ресурсы > Кластеры Kubernetes. Найдите карточку на странице для нужного кластера и нажмите Kubeconfig.

Пространства имен управляющей программы в шаблонах VMware Cloud Templates

Ниже приведена схема для основного пространства имен управляющей программы в облачном шаблоне vRealize Automation 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"
  ]
}

Шаблоны VMware Cloud Templates поддерживают использование предельных значений для пространств имен управляющей программы. Предельные значения позволяют контролировать использование ресурсов ЦП и памяти, а также максимальное количество модулей, разрешенных в пространстве имен, в зависимости от числа развернутых компьютеров.

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