Как настроить LoadBalancer?

Внимание! Для корректного определения клиентского IP-адреса необходимо использовать LoadBalancer с поддержкой Proxy Protocol.

Пример IngressNginxController

Ниже представлен простой пример конфигурации IngressNginxController:

1apiVersion: deckhouse.io/v1
2kind: IngressNginxController
3metadata:
4  name: main
5spec:
6  ingressClass: nginx
7  inlet: LoadBalancerWithProxyProtocol
8  loadBalancerWithProxyProtocol:
9    annotations:
10      loadbalancer.openstack.org/proxy-protocol: "true"
11      loadbalancer.openstack.org/timeout-member-connect: "2000"
12  nodeSelector:
13    node-role.deckhouse.io/frontend: ""
14  tolerations:
15  - effect: NoExecute
16    key: dedicated.deckhouse.io
17    operator: Equal
18    value: frontend

Как настроить политики безопасности на узлах кластера?

Вариантов, зачем может понадобиться ограничить или, наоборот, расширить входящий или исходящий трафик на виртуальных машинах кластера, может быть множество. Например:

  • Разрешить подключение к узлам кластера с виртуальных машин из другой подсети.
  • Разрешить подключение к портам статического узла для работы приложения.
  • Ограничить доступ к внешним ресурсам или другим ВМ в облаке по требованию службы безопасности.

Для всего этого следует применять дополнительные группы безопасности (security groups). Можно использовать только группы безопасности, предварительно созданные в облаке.

Установка дополнительных групп безопасности (security groups) на статических и master-узлах

Данный параметр можно задать либо при создании кластера, либо в уже существующем кластере. В обоих случаях дополнительные группы безопасности указываются в OpenStackClusterConfiguration:

  • для master-узлов — в секции masterNodeGroup в поле additionalSecurityGroups;
  • для статических узлов — в секции nodeGroups в конфигурации, описывающей желаемую nodeGroup, а также в поле additionalSecurityGroups.

Поле additionalSecurityGroups представляет собой массив строк с именами групп безопасности.

Установка дополнительных групп безопасности (security groups) на ephemeral-узлах

Необходимо прописать параметр additionalSecurityGroups для всех OpenStackInstanceClass в кластере, которым нужны дополнительные групп безопасности. Подробнее — параметры модуля cloud-provider-openstack.

Как поднять гибридный кластер?

Гибридный кластер представляет собой кластер, в котором могут быть как узлы bare metal, так и узлы OpenStack. Для создания такого кластера необходимо наличие L2-сети между всеми узлами кластера.

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

  1. Удалите flannel из kube-system: kubectl -n kube-system delete ds flannel-ds.
  2. Включите и настройте модуль.
  3. Создайте один или несколько custom resource OpenStackInstanceClass.
  4. Создайте один или несколько custom resource NodeManager для управления количеством и процессом заказа машин в облаке.

Важно! Cloud-controller-manager синхронизирует состояние между OpenStack и Kubernetes, удаляя из Kubernetes те узлы, которых нет в OpenStack. В гибридном кластере такое поведение не всегда соответствует потребности, поэтому, если узел Kubernetes запущен не с параметром --cloud-provider=external, он автоматически игнорируется (Deckhouse прописывает static:// на узлы в .spec.providerID, а cloud-controller-manager такие узлы игнорирует).

Подключение storage в гибридном кластере

Если вам требуются PersistentVolumes на узлах, подключаемых к кластеру из OpenStack, необходимо создать StorageClass с нужным OpenStack volume type. Получить список типов можно с помощью команды openstack volume type list.

Например, для volume type ceph-ssd:

1apiVersion: storage.k8s.io/v1
2kind: StorageClass
3metadata:
4  name: ceph-ssd
5provisioner: csi-cinderplugin # Обязательно должно быть так.
6parameters:
7  type: ceph-ssd
8volumeBindingMode: WaitForFirstConsumer

Как загрузить образ в OpenStack?

  1. Скачайте последний стабильный образ Ubuntu 18.04:

    1curl -L https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img --output ~/ubuntu-18-04-cloud-amd64
    
  2. Подготовьте OpenStack openrc-файл, который содержит credentials для обращения к API OpenStack.

    Интерфейс получения openrc-файла может отличаться в зависимости от провайдера OpenStack. Если провайдер предоставляет стандартный интерфейс для OpenStack, скачать openrc-файл можно по инструкции.

  3. Либо установите OpenStack-клиента по инструкции.

    Также можно запустить контейнер, смонтировать в него openrc-файл и скачанный локально образ Ubuntu:

    1docker run -ti --rm -v ~/ubuntu-18-04-cloud-amd64:/ubuntu-18-04-cloud-amd64 -v ~/.openrc:/openrc jmcvea/openstack-client
    
  4. Инициализируйте переменные окружения из openrc-файла:

    1source /openrc
    
  5. Получите список доступных типов дисков:

    1/ # openstack volume type list
    2+--------------------------------------+---------------+-----------+
    3| ID                                   | Name          | Is Public |
    4+--------------------------------------+---------------+-----------+
    5| 8d39c9db-0293-48c0-8d44-015a2f6788ff | ko1-high-iops | True      |
    6| bf800b7c-9ae0-4cda-b9c5-fae283b3e9fd | dp1-high-iops | True      |
    7| 74101409-a462-4f03-872a-7de727a178b8 | ko1-ssd       | True      |
    8| eadd8860-f5a4-45e1-ae27-8c58094257e0 | dp1-ssd       | True      |
    9| 48372c05-c842-4f6e-89ca-09af3868b2c4 | ssd           | True      |
    10| a75c3502-4de6-4876-a457-a6c4594c067a | ms1           | True      |
    11| ebf5922e-42af-4f97-8f23-716340290de2 | dp1           | True      |
    12| a6e853c1-78ad-4c18-93f9-2bba317a1d13 | ceph          | True      |
    13+--------------------------------------+---------------+-----------+
    
  6. Создайте образ и передайте в него в качестве свойств тип диска, который будет использоваться (если OpenStack не поддерживает локальные диски или если эти диски не подходят для работы):

    1openstack image create --private --disk-format qcow2 --container-format bare \
    2  --file /ubuntu-18-04-cloud-amd64 --property cinder_img_volume_type=dp1-high-iops ubuntu-18-04-cloud-amd64
    
  7. Проверьте, что образ успешно создан:

    1/ # openstack image show ubuntu-18-04-cloud-amd64
    2+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    3| Field            | Value                                                                                                                                                                                                                                                                                     |
    4+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    5| checksum         | 3443a1fd810f4af9593d56e0e144d07d                                                                                                                                                                                                                                                          |
    6| container_format | bare                                                                                                                                                                                                                                                                                      |
    7| created_at       | 2020-01-10T07:23:48Z                                                                                                                                                                                                                                                                      |
    8| disk_format      | qcow2                                                                                                                                                                                                                                                                                     |
    9| file             | /v2/images/01998f40-57cc-4ce3-9642-c8654a6d14fc/file                                                                                                                                                                                                                                      |
    10| id               | 01998f40-57cc-4ce3-9642-c8654a6d14fc                                                                                                                                                                                                                                                      |
    11| min_disk         | 0                                                                                                                                                                                                                                                                                         |
    12| min_ram          | 0                                                                                                                                                                                                                                                                                         |
    13| name             | ubuntu-18-04-cloud-amd64                                                                                                                                                                                                                                                                  |
    14| owner            | bbf506e3ece54e21b2acf1bf9db4f62c                                                                                                                                                                                                                                                          |
    15| properties       | cinder_img_volume_type='dp1-high-iops', direct_url='rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/01998f40-57cc-4ce3-9642-c8654a6d14fc/snap', locations='[{u'url': u'rbd://b0e441fc-c317-4acf-a606-cf74683978d2/images/01998f40-57cc-4ce3-9642-c8654a6d14fc/snap', u'metadata': {}}]' |
    16| protected        | False                                                                                                                                                                                                                                                                                     |
    17| schema           | /v2/schemas/image                                                                                                                                                                                                                                                                         |
    18| size             | 343277568                                                                                                                                                                                                                                                                                 |
    19| status           | active                                                                                                                                                                                                                                                                                    |
    20| tags             |                                                                                                                                                                                                                                                                                           |
    21| updated_at       | 2020-05-01T17:18:34Z                                                                                                                                                                                                                                                                      |
    22| virtual_size     | None                                                                                                                                                                                                                                                                                      |
    23| visibility       | private                                                                                                                                                                                                                                                                                   |
    24+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    

Как проверить, поддерживает ли провайдер группы безопасности (security groups)?

Достаточно выполнить команду openstack security group list. Если в ответ вы не получите ошибок, это значит, что группы безопасности поддерживаются.

Как настроить работу онлайн-изменения размера дисков?

OpenStack API успешно рапортует об изменении размера диска, но Cinder никак не оповещает Nova о том, что диск изменился, поэтому диск внутри гостевой ОС остается старого размера.

Для устранения проблемы необходимо прописать в cinder.conf параметры доступа к Nova API. Например, так:

1[nova]
2interface = admin
3insecure = {{ keystone_service_internaluri_insecure | bool }}
4auth_type = {{ cinder_keystone_auth_plugin }}
5auth_url = {{ keystone_service_internaluri }}/v3
6password = {{ nova_service_password }}
7project_domain_id = default
8project_name = service
9region_name = {{ nova_service_region }}
10user_domain_id = default
11username = {{ nova_service_user_name }}

Источник…

Как использовать rootDiskSize и когда он предпочтителен?

Диски в OpenStack

Диск узла может быть локальным или сетевым. В терминологии OpenStack локальный диск — это ephemeral disk, а сетевой — persistent disk (cinder storage). Узлы с локальными дисками не могут мигрировать между гипервизорами.

  • Для master-узла предпочтительнее сетевой диск, чтобы узел мог мигрировать между гипервизорами.
  • Для ephemeral-узла предпочтительнее локальный диск, чтобы сэкономить на стоимости. Не все cloud-провайдеры поддерживают использование локальных дисков. Если локальные диски не поддерживаются, для ephemeral-узлов придется использовать сетевые диски.
Локальный диск (ephemeral) Сетевой диск (persistent)
Дешевле Дороже
Подходит для ephemeral-узлов Подходит для master-узлов

Параметр rootDiskSize

В OpenStackInstanceClass есть параметр rootDiskSize, и в OpenStack flavor есть параметр размера диска.

Какой диск закажется в зависимости от комбинации параметров, указано в таблице:

  flavor disk size = 0 flavor disk size > 0
rootDiskSize не указан ❗️Необходимо задать размер. Без указания размера будет ошибка создания ВМ. Локальный диск с размером из flavor
rootDiskSize указан Сетевой диск размером rootDiskSize ❗ Сетевой (rootDiskSize) и локальный (из flavor). Избегайте использования этого варианта, так как cloud-провайдер будет взимать плату за оба диска.

Обратите внимание, что при создании узлов с типом CloudEphemeral в облаке Selectel, для создания узла в зоне отличной от зоны A, необходимо заранее создать flavor с диском необходимого размера. Параметр rootDiskSize в этом случае указывать не нужно.

Рекомендация для master-узлов и бастиона — сетевой диск

  • Используйте flavor с нулевым размером диска.
  • Задайте rootDiskSize в OpenStackInstanceClass.
  • Проконтролируйте тип диска. Тип диска будет взят из образа ОС, если он задан. Если нет, тип диска будет взят из volumeTypeMap.

Рекомендация для ephemeral-узлов — локальный диск

  • Используйте flavor с заданным размером диска.
  • Не используйте параметр rootDiskSize в OpenStackInstanceClass.
  • Проконтролируйте тип диска. Тип диска будет взят из образа ОС, если он задан. Если нет, будет использоваться тип диска по умолчанию cloud-провайдера.

Как проверить объем диска в flavor?

1# openstack flavor show m1.medium-50g -c disk
2+-------+-------+
3| Field | Value |
4+-------+-------+
5| disk  | 50    |
6+-------+-------+

Как переопределить тип диска по умолчанию cloud-провайдера?

Если у cloud-провайдера доступно несколько типов, вы можете указать тип диска по умолчанию для образа. Для этого необходимо указать название типа диска в метаданных образа. Тогда все ВМ, создаваемые из этого образа, будут использовать указанный тип сетевого диска.

Также вы можете создать новый образ OpenStack следующим образом.

Пример:

1openstack volume type list
2openstack image set ubuntu-18-04-cloud-amd64 --property cinder_img_volume_type=VOLUME_NAME

Оффлайн-изменение размера диска

Некоторые облачные провайдеры (например, VK Cloud) могут не поддерживать онлайн-изменение дисков. Если при изменении размера диска вы получаете следующую ошибку, необходимо уменьшить количество реплик StatefulSet до 0, подождать изменения размера дисков и вернуть обратно количество реплик, которое было до начала операции.

1Warning  VolumeResizeFailed     5s (x11 over 41s)  external-resizer cinder.csi.openstack.org                                   
2resize volume "pvc-555555-ab66-4f8d-947c-296520bae4c1" by resizer "cinder.csi.openstack.org" failed: 
3rpc error: code = Internal desc = Could not resize volume "bb5a275b-3f30-4916-9480-9efe4b6dfba5" to size 2: 
4Expected HTTP response code [202] when accessing 
5[POST https://public.infra.myfavourite-cloud-provider.ru:8776/v3/555555555555/volumes/bb5a275b-3f30-4916-9480-9efe4b6dfba5/action], but got 406 instead
6{"computeFault": {"message": "Version 3.42 is not supported by the API. Minimum is 3.0 and maximum is 3.27.", "code": 406}}