Compare languages | Cloud provider — OpenStack: FAQ

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

How do I set up LoadBalancer?

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

Note! Load Balancer must support Proxy Protocol to determine the client IP correctly.

Пример IngressNginxController

An example of IngressNginxController

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

Below is a simple example of the `IngressNginxController’ configuration:

yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: nginx inlet: LoadBalancerWithProxyProtocol loadBalancerWithProxyProtocol: annotations: loadbalancer.openstack.org/proxy-protocol: “true” loadbalancer.openstack.org/timeout-member-connect: “2000” nodeSelector: node-role.deckhouse.io/frontend: “” tolerations:

  • effect: NoExecute key: dedicated.deckhouse.io operator: Equal value: frontend

yaml apiVersion: deckhouse.io/v1 kind: IngressNginxController metadata: name: main spec: ingressClass: nginx inlet: LoadBalancerWithProxyProtocol loadBalancerWithProxyProtocol: annotations: loadbalancer.openstack.org/proxy-protocol: “true” loadbalancer.openstack.org/timeout-member-connect: “2000” nodeSelector: node-role.deckhouse.io/frontend: “” tolerations:

  • effect: NoExecute key: dedicated.deckhouse.io operator: Equal value: frontend

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

How do I set up security policies on cluster nodes?

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

There may be many reasons why you may need to restrict or expand incoming/outgoing traffic on cluster VMs in OpenStack:

  • Разрешить подключение к узлам кластера с виртуальных машин из другой подсети.
  • Разрешить подключение к портам статического узла для работы приложения.
  • Ограничить доступ к внешним ресурсам или другим ВМ в облаке по требованию службы безопасности.
  • Allow VMs on a different subnet to connect to cluster nodes.
  • Allow connecting to the ports of the static node so that the application can work.
  • Restrict access to external resources or other VMs in the cloud for security reasons.

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

For all this, additional security groups should be used. You can only use security groups that are created in the cloud tentatively.

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

Enabling additional security groups on static and master nodes

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

This parameter can be set either in an existing cluster or when creating one. In both cases, additional security groups are declared in the OpenStackClusterConfiguration:

  • для master-узлов — в секции masterNodeGroup в поле additionalSecurityGroups;
  • для статических узлов — в секции nodeGroups в конфигурации, описывающей желаемую nodeGroup, а также в поле additionalSecurityGroups.
  • for master nodes, in the additionalSecurityGroups of the masterNodeGroup section;
  • for static nodes, in the additionalSecurityGroups field of the nodeGroups subsection that corresponds to the target nodeGroup.

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

The additionalSecurityGroups field contains an array of strings with security group names.

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

Enabling additional security groups on ephemeral nodes

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

You have to set the additionalSecurityGroups parameter for all OpenStackInstanceClasses in the cluster that require additional security groups. See the parameters of the cloud-provider-openstack module.

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

How do I create a hybrid cluster?

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

A hybrid cluster combines bare metal and OpenStack nodes. To create such a cluster, you need an L2 network between all nodes of the cluster.

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

To set up a hybrid cluster, follow these steps:

  1. Удалите flannel из kube-system: kubectl -n kube-system delete ds flannel-ds.
  2. Включите и настройте модуль.
  3. Создайте один или несколько custom resource OpenStackInstanceClass.
  4. Создайте один или несколько custom resource NodeManager для управления количеством и процессом заказа машин в облаке.
  1. Delete flannel from kube-system: kubectl -n kube-system delete ds flannel-ds.
  2. Enable and configure the module.
  3. Create one or more OpenStackInstanceClass custom resources.
  4. Create one or more NodeManager custom resources for specifying the number of machines and managing the provisioning process in the cloud.

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

Caution! Cloud-controller-manager synchronizes OpenStack and Kubernetes states by deleting Kubernetes nodes that are not in OpenStack. In a hybrid cluster, such behavior does not always make sense. That is why cloud-controller-manager automatically skips Kubernetes nodes that do not have the --cloud-provider=external parameter (Deckhouse inserts static:// into nodes in .spec.providerID, and cloud-controller-manager ignores them).

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

Attaching storage devices to instances in a hybrid cluster

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

To use PersistentVolumes on OpenStack nodes, you must create StorageClass with the appropriate OpenStack volume type. The openstack volume type list command lists all available types.

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

Here is the example config for the ceph-ssd volume type:

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

yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph-ssd provisioner: csi-cinderplugin # have to be like this parameters: type: ceph-ssd volumeBindingMode: WaitForFirstConsumer

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

How do I create an image in OpenStack?

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

shell curl -L https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img –output ~/ubuntu-18-04-cloud-amd64

shell curl -L https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img –output ~/ubuntu-18-04-cloud-amd64

  1. Подготовьте OpenStack openrc-файл, который содержит credentials для обращения к API OpenStack.
  1. Prepare an OpenStack RC (openrc) file containing credentials for accessing the OpenStack API:

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

The interface for getting an openrc file may differ depending on the OpenStack provider. If the provider has a standard interface for OpenStack, you can download the openrc file using the following instruction.

  1. Либо установите OpenStack-клиента по инструкции.
  1. Otherwise, install the OpenStack client using this instruction.

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

Also, you can run the container and mount an openrc file and a downloaded Ubuntu image in it:

shell docker run -ti –rm -v ~/ubuntu-18-04-cloud-amd64:/ubuntu-18-04-cloud-amd64 -v ~/.openrc:/openrc jmcvea/openstack-client

shell docker run -ti –rm -v ~/ubuntu-18-04-cloud-amd64:/ubuntu-18-04-cloud-amd64 -v ~/.openrc:/openrc jmcvea/openstack-client

  1. Инициализируйте переменные окружения из openrc-файла:
  1. Initialize the environment variables from the openrc file:

shell source /openrc

shell source /openrc

  1. Получите список доступных типов дисков:
  1. Get a list of available disk types:

shell / # openstack volume type list +————————————–+—————+———–+ | ID | Name | Is Public | +————————————–+—————+———–+ | 8d39c9db-0293-48c0-8d44-015a2f6788ff | ko1-high-iops | True | | bf800b7c-9ae0-4cda-b9c5-fae283b3e9fd | dp1-high-iops | True | | 74101409-a462-4f03-872a-7de727a178b8 | ko1-ssd | True | | eadd8860-f5a4-45e1-ae27-8c58094257e0 | dp1-ssd | True | | 48372c05-c842-4f6e-89ca-09af3868b2c4 | ssd | True | | a75c3502-4de6-4876-a457-a6c4594c067a | ms1 | True | | ebf5922e-42af-4f97-8f23-716340290de2 | dp1 | True | | a6e853c1-78ad-4c18-93f9-2bba317a1d13 | ceph | True | +————————————–+—————+———–+

shell / # openstack volume type list +————————————–+—————+———–+ | ID | Name | Is Public | +————————————–+—————+———–+ | 8d39c9db-0293-48c0-8d44-015a2f6788ff | ko1-high-iops | True | | bf800b7c-9ae0-4cda-b9c5-fae283b3e9fd | dp1-high-iops | True | | 74101409-a462-4f03-872a-7de727a178b8 | ko1-ssd | True | | eadd8860-f5a4-45e1-ae27-8c58094257e0 | dp1-ssd | True | | 48372c05-c842-4f6e-89ca-09af3868b2c4 | ssd | True | | a75c3502-4de6-4876-a457-a6c4594c067a | ms1 | True | | ebf5922e-42af-4f97-8f23-716340290de2 | dp1 | True | | a6e853c1-78ad-4c18-93f9-2bba317a1d13 | ceph | True | +————————————–+—————+———–+

  1. Создайте образ и передайте в него в качестве свойств тип диска, который будет использоваться (если OpenStack не поддерживает локальные диски или если эти диски не подходят для работы):
  1. Create an image, pass the disk format to use (if OpenStack does not support local disks or these disks don’t fit):

shell openstack image create –private –disk-format qcow2 –container-format bare
–file /ubuntu-18-04-cloud-amd64 –property cinder_img_volume_type=dp1-high-iops ubuntu-18-04-cloud-amd64

shell openstack image create –private –disk-format qcow2 –container-format bare
–file /ubuntu-18-04-cloud-amd64 –property cinder_img_volume_type=dp1-high-iops ubuntu-18-04-cloud-amd64

  1. Проверьте, что образ успешно создан:
  1. Check that the image was created successfully:

text / # openstack image show ubuntu-18-04-cloud-amd64 +——————+——————————————————————————————————————————————————————————————————————————————————————————————-+ | Field | Value | +——————+——————————————————————————————————————————————————————————————————————————————————————————————-+ | checksum | 3443a1fd810f4af9593d56e0e144d07d | | container_format | bare | | created_at | 2020-01-10T07:23:48Z | | disk_format | qcow2 | | file | /v2/images/01998f40-57cc-4ce3-9642-c8654a6d14fc/file | | id | 01998f40-57cc-4ce3-9642-c8654a6d14fc | | min_disk | 0 | | min_ram | 0 | | name | ubuntu-18-04-cloud-amd64 | | owner | bbf506e3ece54e21b2acf1bf9db4f62c | | 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’: {}}]’ | | protected | False | | schema | /v2/schemas/image | | size | 343277568 | | status | active | | tags | | | updated_at | 2020-05-01T17:18:34Z | | virtual_size | None | | visibility | private | +——————+——————————————————————————————————————————————————————————————————————————————————————————————-+

text / # openstack image show ubuntu-18-04-cloud-amd64 +——————+——————————————————————————————————————————————————————————————————————————————————————————————-+ | Field | Value | +——————+——————————————————————————————————————————————————————————————————————————————————————————————-+ | checksum | 3443a1fd810f4af9593d56e0e144d07d | | container_format | bare | | created_at | 2020-01-10T07:23:48Z | | disk_format | qcow2 | | file | /v2/images/01998f40-57cc-4ce3-9642-c8654a6d14fc/file | | id | 01998f40-57cc-4ce3-9642-c8654a6d14fc | | min_disk | 0 | | min_ram | 0 | | name | ubuntu-18-04-cloud-amd64 | | owner | bbf506e3ece54e21b2acf1bf9db4f62c | | 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’: {}}]’ | | protected | False | | schema | /v2/schemas/image | | size | 343277568 | | status | active | | tags | | | updated_at | 2020-05-01T17:18:34Z | | virtual_size | None | | visibility | private | +——————+——————————————————————————————————————————————————————————————————————————————————————————————-+

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

How to check whether the provider supports SecurityGroups?

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

Run the following command: openstack security group list. If there are no errors in the output, then Security Groups are supported.

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

How to set up online disk resize

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

The OpenStack API states that the resize is completed successfully. However, Nova does not get any information about the resize from Cinder. As a result, the size of the disk in the guest OS remains the same.

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

To get rid of this problem, you need to insert the Nova API access parameters into the cinder.conf file, e.g., as follows:

ini [nova] interface = admin insecure = {{ keystone_service_internaluri_insecure | bool }} auth_type = {{ cinder_keystone_auth_plugin }} auth_url = {{ keystone_service_internaluri }}/v3 password = {{ nova_service_password }} project_domain_id = default project_name = service region_name = {{ nova_service_region }} user_domain_id = default username = {{ nova_service_user_name }}

ini [nova] interface = admin insecure = {{ keystone_service_internaluri_insecure | bool }} auth_type = {{ cinder_keystone_auth_plugin }} auth_url = {{ keystone_service_internaluri }}/v3 password = {{ nova_service_password }} project_domain_id = default project_name = service region_name = {{ nova_service_region }} user_domain_id = default username = {{ nova_service_user_name }}

Источник…

Source…

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

How to use rootDiskSize and when it is preferred?

Диски в OpenStack

Disks in OpenStack

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

The node disk can be local or network. A local disk in OpenStack, is an ephemeral disk, and a network disk is a persistent disk (cinder storage). The first one is deleted along with the VM, and the second one remains in the cloud when the VM is deleted.

  • Для master-узла предпочтительнее сетевой диск, чтобы узел мог мигрировать между гипервизорами.
  • Для ephemeral-узла предпочтительнее локальный диск, чтобы сэкономить на стоимости. Не все cloud-провайдеры поддерживают использование локальных дисков. Если локальные диски не поддерживаются, для ephemeral-узлов придется использовать сетевые диски.
  • A network disk is preferred for the master node so that the node can migrate between hypervisors.
  • A local disk is preffered for the ephemeral node to save on cost. Not all cloud providers support the use of local disks. If local disks are not supported, you have to use network disks for ephemeral nodes.
Локальный диск (ephemeral) Сетевой диск (persistent)
Удаляется вместе с ВМ Остается в облаке и может переиспользоваться
Дешевле Дороже
Подходит для ephemeral-узлов Подходит для master-узлов
Local disk (ephemeral) Network disk (persistent)
Is removed along with the VM Stays in the cloud and can be reused
Cheaper More expensive
Suitable for ephemeral nodes Suitable for master nodes

Параметр rootDiskSize

The rootDiskSize parameter

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

The OpenStackInstanceClass has a rootDiskSize parameter, and OpenStack flavor has a disk size parameter. Which disk will be ordered depending on the combination of parameters is shown in the table:

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

  flavor disk size = 0 flavor disk size > 0
rootDiskSize is not specified ❗️You need to set the size. Without specifying the size, there will be an error creating a VM. Local disk with size according to the flavor
rootDiskSize is specified Network disk with the rootDiskSize size ❗ Network disk (rootDiskSize) and local disk (according to the flavor). Avoid using this option, as the cloud provider will charge for both disks.
  flavor disk size = 0 flavor disk size > 0
rootDiskSize не указан ❗️Необходимо задать размер. Без указания размера будет ошибка создания ВМ. Локальный диск с размером из flavor
rootDiskSize указан Сетевой диск размером rootDiskSize ❗ Сетевой (rootDiskSize) и локальный (из flavor). Избегайте использования этого варианта, так как cloud-провайдер будет взимать плату за оба диска.

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

  • Use flavor with a zero disk size.
  • Set the rootDiskSize in the OpenStackInstanceClass.
  • Check the disk type. The disk type will be taken from the OS image if it is set. If it is not set, the disk type will be taken from volumeTypeMap.
  • Используйте flavor с нулевым размером диска.
  • Задайте rootDiskSize в OpenStackInstanceClass.
  • Проконтролируйте тип диска. Тип диска будет взят из образа ОС, если он задан. Если нет, тип диска будет взят из volumeTypeMap.

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

  • Use flavor with the specified disk size.
  • Do not use the rootDiskSize parameter in the OpenStackInstanceClass.
  • Check the disk type. The disk type will be taken from the OS image if it is set. If it is not set, the default disk type of the cloud provider will be used.
  • Используйте flavor с заданным размером диска.
  • Не используйте параметр rootDiskSize в OpenStackInstanceClass.
  • Проконтролируйте тип диска. Тип диска будет взят из образа ОС, если он задан. Если нет, будет использоваться тип диска по умолчанию cloud-провайдера.

How do I check the disk volume in a flavor?

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

shell

shell

openstack flavor show m1.medium-50g -c disk +——-+——-+ | Field | Value | +——-+——-+ | disk | 50 | +——-+——-+

openstack flavor show m1.medium-50g -c disk +——-+——-+ | Field | Value | +——-+——-+ | disk | 50 | +——-+——-+

How to override a default volume type of cloud provider?

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

If there are several types of disks in a cloud provider, you can set a default disk type for the image in order to select a specific VM’s disk type. To do this, specify the name of a disk type in the image metadata.

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

Also, you may need to create a custom OpenStack image; the “How do I create an image in OpenStack” section describes how to do it

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

Example:

Пример:

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

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

OFFLINE disk resize

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

Some cloud providers may not support ONLINE disk resizing. If you get the following error, then you need to reduce the number of StatefulSet replicas to 0, wait for disk resizing and return the number of replicas that was before the start of the operation.

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

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

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