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

Cloud Assembly에서 Blueprint에 Kubernetes 구성 요소를 추가하려면 Blueprint를 클릭하고 새로 만들기를 선택한 다음, 왼쪽 메뉴에서 Kubernetes 옵션을 찾아서 확장합니다. 그런 다음 원하는 항목(클러스터 또는 KBS 네임스페이스 중 하나)을 캔버스로 끌어서 선택합니다.

프로젝트와 연결된 Kubernetes 클러스터를 Blueprint에 추가하는 것은 Kubernetes 리소스를 유효한 사용자가 사용할 수 있게 만드는 가장 간단한 방법입니다. 다른 Cloud Assembly 리소스와 마찬가지로 클러스터에서 태그를 사용하여 배포 위치를 제어할 수 있습니다. 클러스터 배포의 할당 단계에서 태그를 사용하여 영역 및 PKS 계획을 선택할 수 있습니다.

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

Blueprint 예시

첫 번째 Blueprint 예시는 태그 지정으로 제어되는 간단한 Kubernetes 배포에 대한 Blueprint를 보여줍니다. Kubernetes 영역은 [새 Kubernetes 영역] 페이지에서 구성된 두 가지 배포 계획으로 생성되었습니다. 이 경우, placement:tag라는 태그가 영역의 기능으로 추가되었으며 Blueprint의 유사한 제약 조건을 매칭하는 데 사용되었습니다. 태그로 구성된 영역이 둘 이상인 경우, 우선 순위 번호가 가장 낮은 영역이 선택됩니다.

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 

두 번째 Blueprint 예시는 배포를 요청할 때 사용자가 원하는 클러스터 호스트 이름을 입력할 수 있도록 $(input.hostname)이라는 변수를 사용하여 Blueprint를 설정하는 방법을 보여줍니다. 태그는 클러스터 배포의 리소스 할당 단계에서 영역과 PKS 계획을 선택하는 데 사용할 수도 있습니다.

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

네임스페이스를 사용하여 클러스터 사용량을 관리하려는 경우, 배포를 요청할 때 사용자가 입력하는 네임스페이스 이름을 대체하도록 Blueprint에 name: ${input.name}이라는 변수를 설정할 수 있습니다. 이러한 종류의 배포에는 다음 예시와 같은 Blueprint를 생성합니다.

1 formatVersion: 1
2 inputs:
3 name:
4    type: string
5    title: "Namespace name"
6 resources:
7    Cloud_KBS_Namespace_1:
8        type: Cloud.KBS.Namespace
9        properties:
10            name: ${input.name}

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

Cloud Assembly Blueprint의 감독자 네임스페이스

다음은 Cloud Assembly Blueprint의 기본 감독자 네임스페이스에 대한 스키마입니다.

{
  "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"
  ]
}

Cloud Assembly Blueprint는 감독자 네임스페이스에 제한을 사용하도록 지원합니다. 제한을 사용하면 배포된 시스템에서 네임스페이스에 허용되는 최대 포드 수뿐만 아니라 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