Kubernetes 구성 요소를 Automation Assembler 클라우드 템플릿에 추가할 때 클러스터를 추가하거나 사용자가 다양한 구성으로 네임스페이스를 생성하도록 선택할 수 있습니다. 일반적으로 이러한 선택은 액세스 제어 요구 사항, Kubernetes 구성 요소 구성 방법 및 배포 요구 사항에 따라 결정됩니다.

Kubernetes 구성 요소를 Automation Assembler의 클라우드 템플릿에 추가하려면 설계 > 클라우드 템플릿을 선택하고 새로 만들기를 클릭한 다음 왼쪽 메뉴에서 Kubernetes 옵션을 찾아서 확장합니다. 그런 다음 원하는 항목(클러스터 또는 KBS 네임스페이스 중 하나)을 캔버스로 끌어서 선택합니다.

프로젝트와 연결된 Kubernetes 클러스터를 클라우드 템플릿에 추가하는 것은 Kubernetes 리소스를 유효한 사용자가 사용할 수 있게 만드는 가장 간단한 방법입니다. 다른 Automation Assembler 리소스와 마찬가지로 클러스터에서 태그를 사용하여 배포 위치를 제어할 수 있습니다. 클러스터 배포의 할당 단계에서 태그를 사용하여 영역 및 VMware TKGI(Tanzu Kubernetes Grid Integrated Edition) 계획을 선택할 수 있습니다.

이러한 방식으로 클러스터를 추가하면 유효한 모든 사용자가 자동으로 사용할 수 있게 됩니다.

클라우드 템플릿 예

첫 번째 클라우드 템플릿 예는 태그 지정으로 제어되는 간단한 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}

사용자는 인프라 > 리소스 > Kubernetes 클러스터 페이지에서 액세스할 수 있는 kubeconfig 파일을 통해 배포된 클러스터를 관리할 수 있습니다. 원하는 클러스터의 페이지에서 카드를 찾은 후 Kubeconfig를 클릭합니다.

VMware Cloud Templates의 감독자 네임 스페이스

다음은 Automation Assembler 클라우드 템플릿의 기본 감독자 네임스페이스에 대한 스키마입니다.

{
  "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 및 메모리의 리소스 사용량을 제어할 수 있습니다.

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 사용

클러스터 또는 네임스페이스 생성의 일환으로 추가 사용자 지정을 실행하려고 할 수 있습니다. 예를 들어 사용자(역할/역할 바인딩)를 추가하거나 포드 보안 정책을 생성하거나 에이전트를 설치하려고 할 수 있습니다. 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은 배포에 대한 [속성] 탭에도 표시됩니다.

Automation Assembler는 배포되는 리소스의 범위 내에서만 컨텐츠 리소스를 생성할 수 있습니다. 예를 들어 kubernetes 네임스페이스를 프로비저닝하는 경우 Automation Assembler는 다른 네임스페이스 내에 배포를 생성할 수 없습니다. 사용자는 kubectl과 함께 kubeconfig를 사용하는 것과 동일한 권한을 갖습니다.

가상 시스템이 프로비저닝된 후 content 속성 내에 kubernetes 개체 설치가 시작됩니다. YAML 컨텐츠 속성에서 참조된 리소스 중 하나가 프로비저닝에 실패하면 Automation Assembler는 리소스에서 이전 kubernetes 개체를 모두 롤백하고 삭제하며 배포는 실패 상태가 됩니다. 리소스는 계속 프로비저닝되고 표시됩니다. 또한 컨텐츠를 다시 적용하려는 시도를 비롯한 2일차 작업을 계속 사용할 수 있습니다.

다음 예와 같이 클라우드 템플릿의 입력을 사용하여 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와 같은 사용자 지정 리소스를 프로비저닝할 수 있습니다. 이 작업은 1일차 작업으로 실패합니다. 감독자 네임스페이스에는 필요한 가상 시스템 클래스 및 스토리지 클래스가 포함되어 있지 않기 때문입니다. 가상 시스템 클래스 및 스토리지 클래스가 감독자 네임스페이스에 바인딩되면 2일차 작업을 사용하여 TanzuKubernetesCluster(또는 다른 리소스)를 생성할 수 있습니다.

참고: 컨텐츠 없이 리소스를 프로비저닝할 수 있으며 2일차 작업을 통해 kubernetes 개체를 YAML로 추가할 수 있습니다.

YAML 속성에 표시되는 컨텐츠는 리소스에 프로비저닝되는 항목을 정의합니다. 이 컨텐츠를 편집하면 다음 표에 가능한 결과가 표시됩니다.

작업 결과
kubernetes 개체를 추가하고 제출하면, 지정된 개체가 리소스에 생성됩니다.
kubernetes 개체를 제거하고 제출하면, 지정된 개체가 리소스에서 삭제됩니다.
kubernetes 개체를 수정하고 제출하면, 지정된 개체가 리소스에 패치됩니다.

현재 개체에 대해 어떤 작업이 수정으로 간주되는지 명확히 하는 것이 중요합니다. 예를 들어 개체의 네임스페이스 필드를 수정하면 이전 개체에 패치가 적용되는 대신 새 개체가 생성됩니다.

리소스의 고유성은 apiVersion, kind, metadata.name, metadata.namespace 필드로 정의됩니다.