Доступно только в Enterprise Edition.
Находится в процессе активного развития. Функциональность может существенно измениться.

Создание изолированного окружения

Выполните следующие шаги для создания изолированного окружения в кластере Kubernetes:

  1. Создайте двух статических пользователей с доступом до изолированного окружения.

    Создайте файл users.yaml со следующим содержимым (описание ресурсов User):

    1# users.yaml
    2---
    3apiVersion: deckhouse.io/v1
    4kind: User
    5metadata:
    6  name: user
    7spec:
    8  email: user@cluster
    9  # passwordUser
    10  password: $2a$10$yROPLTTMTI.AkkAskKGiUuQW3asoGosGgppj1NYXUboHx/onpGE7q
    11---
    12apiVersion: deckhouse.io/v1
    13kind: User
    14metadata:
    15  name: admin
    16spec:
    17  email: admin@cluster
    18  # passwordAdmin
    19  password: $2a$10$UpCxQCpMqJoVm53BvUyPluprS/mUtJ/yUoSuM8i3Z0TlbiBxGiB1q
    

    Выполните следующую команду, чтобы создать пользователей:

    1kubectl create -f users.yaml
    

    Проверьте, что пользователи успешно создались, выполнив следующую команду:

    1kubectl get users.deckhouse.io
    

    Пример вывода:

    1NAME    EMAIL           GROUPS   EXPIRE_AT
    2admin   admin@cluster
    3user    user@cluster
    
  2. Создайте шаблон окружения с помощью ресурса ProjectType:

    • в .spec.subjects опишите роли, которые нужно выдать пользователям/группам/ServiceAccount‘ам;
    • в .spec.resourcesTemplate опишите шаблоны ресурсов, которые требуется создать при настройке изолированных окружений;
    • в .spec.openAPI опишите спецификацию OpenAPI для значений (values), которые используются в описанных шаблонах (.spec.resourcesTemplate);
    • в .spec.namespaceMetadata опишите лейблы и аннотации, которые необходимо проставить на namespace при настройке окружения.

    В примере ниже в параметре .spec.subjects шаблона описаны роли, которые требуется выдать созданным выше пользователям для новых окружений. В параметре .spec.resourcesTemplate шаблона описываются три ресурса: NetworkPolicy (ограничивает сетевую доступность подов вне создаваемого namespace, кроме kube-dns), LimitRange и ResourceQuota. В шаблоне реурсов используются параметры, описанные в .spec.openAPI (requests.cpu, requests.memory, requests.storage, limits.cpu, limit.memory).

    Создайте файл project-type.yaml со следующим содержимым (описание ресурсов ProjectType):

    1# project-type.yaml
    2---
    3apiVersion: deckhouse.io/v1alpha1
    4kind: ProjectType
    5metadata:
    6  name: test-project-type
    7spec:
    8  subjects:
    9    - kind: User
    10      name: admin@cluster
    11      role: Admin
    12    - kind: User
    13      name: user@cluster
    14      role: User
    15  namespaceMetadata:
    16    annotations:
    17      extended-monitoring.deckhouse.io/enabled: ""
    18    labels:
    19      created-from-project-type: test-project-type
    20  openAPI:
    21    requests:
    22      type: object
    23      properties:
    24        cpu:
    25          oneOf:
    26            - type: number
    27              format: int
    28            - type: string
    29          pattern: "^[0-9]+m?$"
    30        memory:
    31          oneOf:
    32            - type: number
    33              format: int
    34            - type: string
    35          pattern: '^[0-9]+(\.[0-9]+)?(E|P|T|G|M|k|Ei|Pi|Ti|Gi|Mi|Ki)?$'
    36        storage:
    37          type: string
    38          pattern: '^[0-9]+(\.[0-9]+)?(E|P|T|G|M|k|Ei|Pi|Ti|Gi|Mi|Ki)?$'
    39    limits:
    40      type: object
    41      properties:
    42        cpu:
    43          oneOf:
    44            - type: number
    45              format: int
    46            - type: string
    47          pattern: "^[0-9]+m?$"
    48        memory:
    49          oneOf:
    50            - type: number
    51              format: int
    52            - type: string
    53          pattern: '^[0-9]+(\.[0-9]+)?(E|P|T|G|M|k|Ei|Pi|Ti|Gi|Mi|Ki)?$'
    54  resourcesTemplate: |
    55    ---
    56    # Max requests and limits for resource and storage consumption for all pods in a namespace.
    57    # Refer to https://kubernetes.io/docs/concepts/policy/resource-quotas/
    58    apiVersion: v1
    59    kind: ResourceQuota
    60    metadata:
    61      name: all-pods
    62    spec:
    63      hard:
    64        {{ with .params.requests.cpu }}requests.cpu: {{ . }}{{ end }}
    65        {{ with .params.requests.memory }}requests.memory: {{ . }}{{ end }}
    66        {{ with .params.requests.storage }}requests.storage: {{ . }}{{ end }}
    67        {{ with .params.limits.cpu }}limits.cpu: {{ . }}{{ end }}
    68        {{ with .params.limits.memory }}limits.memory: {{ . }}{{ end }}
    69    ---
    70    # Max requests and limits for resource consumption per pod in a namespace.
    71    # All the containers in a namespace must have requests and limits specified.
    72    # Refer to https://kubernetes.io/docs/concepts/policy/limit-range/
    73    apiVersion: v1
    74    kind: LimitRange
    75    metadata:
    76      name: all-containers
    77    spec:
    78      limits:
    79        - max:
    80            {{ with .params.limits.cpu }}cpu: {{ . }}{{ end }}
    81            {{ with .params.limits.memory }}memory: {{ . }}{{ end }}
    82          maxLimitRequestRatio:
    83            cpu: 1
    84            memory: 1
    85          type: Container
    86    ---
    87    # Deny all network traffic by default except namespaced traffic and dns.
    88    # Refer to https://kubernetes.io/docs/concepts/services-networking/network-policies/
    89    kind: NetworkPolicy
    90    apiVersion: networking.k8s.io/v1
    91    metadata:
    92      name: deny-all-except-current-namespace
    93    spec:
    94      podSelector:
    95        matchLabels: {}
    96      policyTypes:
    97        - Ingress
    98        - Egress
    99      ingress:
    100        - from:
    101            - namespaceSelector:
    102                matchLabels:
    103                  kubernetes.io/metadata.name: "{{ .projectName }}"
    104      egress:
    105        - to:
    106            - namespaceSelector:
    107                matchLabels:
    108                  kubernetes.io/metadata.name: "{{ .projectName }}"
    109        - to:
    110            - namespaceSelector:
    111                matchLabels:
    112                  kubernetes.io/metadata.name: kube-system
    113          ports:
    114            - protocol: UDP
    115              port: 53
    

    Чтобы создать шаблон окружения, выполните следующую команду:

    1kubectl create -f project-type.yaml
    

    Проверьте, что шаблон окружения успешно создался, выполнив следующую команду:

    1kubectl get projecttypes.deckhouse.io
    

    Пример вывода:

    1NAME                READY
    2test-project-type   true
    
  3. Создайте окружение с помощью ресурса Project, указав в поле .spec.projectTypeName имя созданного ранее шаблона окружения. Поле .spec.template заполните значениями, которые подходят для .spec.openAPI ProjectType.

    Сохраните следующее содержимое (описание ресурса Project) в файл project.yaml:

    1# project.yaml
    2---
    3apiVersion: deckhouse.io/v1alpha1
    4kind: Project
    5metadata:
    6  name: test-project
    7spec:
    8  description: Test case from Deckhouse documentation
    9  projectTypeName: test-project-type
    10  template:
    11    requests:
    12      cpu: 5
    13      memory: 5Gi
    14      storage: 1Gi
    15    limits:
    16      cpu: 5
    17      memory: 5Gi
    

    С помощью команды ниже создайте окружение:

    1kubectl create -f project.yaml
    

    Проверьте, что окружение успешно создалось, выполнив следующую команду:

    1kubectl get projects.deckhouse.io
    

    Пример вывода:

    1NAME           READY   DESCRIPTION
    2test-project   true    Test case from Deckhouse documentation
    
  4. Проверьте ресурсы, созданные в рамках изолированного окружения.

    Примеры команд и результатов их работы:

    1$ kubectl get -n test-project namespaces test-project
    2NAME           STATUS   AGE
    3test-project   Active   5m
    4$ kubectl get authorizationrules.deckhouse.io -n test-project
    5NAME                                    AGE
    6test-project-admin-user-admin-cluster   5m
    7test-project-user-user-user-cluster     5m
    8$ kubectl get -n test-project resourcequotas
    9NAME                    AGE   REQUEST                                                              LIMIT
    10test-project-all-pods   5m   requests.cpu: 0/5, requests.memory: 0/5Gi, requests.storage: 0/1Gi   limits.cpu: 0/5, limits.memory: 0/5Gi
    11$ kubectl get -n test-project limitranges
    12NAME                          CREATED AT
    13test-project-all-containers   2023-06-01T14:37:42Z
    14$ kubectl get -n test-project networkpolicies.networking.k8s.io
    15NAME                                             POD-SELECTOR   AGE
    16test-project-deny-all-except-current-namespace   <none>         5m
    
  5. Сгенерируйте kubeconfig для доступа созданных пользователей к API-серверу.

  6. Проверьте наличие доступа у созданных пользователей с помощью сгенерированного kubeconfig.

    Примеры команд и результатов их работы:

    1$ kubectl get limitranges -n test-project --kubeconfig admin-kubeconfig.yaml
    2NAME                          CREATED AT
    3test-project-all-containers   2023-06-01T14:37:42Z
    4$ kubectl get limitranges -n test-project --kubeconfig user-kubeconfig.yaml
    5NAME                          CREATED AT
    6test-project-all-containers   2023-06-01T14:37:42Z