Создание изолированного окружения
Выполните следующие шаги для создания изолированного окружения в кластере Kubernetes:
-
Создайте двух статических пользователей с доступом до изолированного окружения.
Создайте файл
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
-
Создайте шаблон окружения с помощью ресурса 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
- в .spec.subjects опишите роли, которые нужно выдать пользователям/группам/
-
Создайте окружение с помощью ресурса 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
-
Проверьте ресурсы, созданные в рамках изолированного окружения.
Примеры команд и результатов их работы:
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
-
Сгенерируйте kubeconfig для доступа созданных пользователей к API-серверу.
-
Проверьте наличие доступа у созданных пользователей с помощью сгенерированного 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