Bare metal machine controllers#

Bare metal machine controller один из набора инструментов для управления инфраструктурой bare metal с использованием DropApp Plus, реализует исполнительный механизм DropApp Cluster API.

Cluster API предоставляет декларативные API в стиле DropApp Plus для создания, настройки и управления кластерами. API является общим для нескольких облачных поставщиков. Baremetal machine controller один из поставщиков Cluster API и позволяет пользователям развертывать кластер на основе Cluster API поверх инфраструктуры bare metal.

Cluster API - подпроект DropApp Plus, ориентированный на предоставление декларативных API и инструментов для упрощения подготовки, обновления и эксплуатации нескольких кластеров DropApp Plus.

Ресурс машины определяется проектом Machine API Operator. Машина включает поле providerSpec, которое содержит данные, относящиеся к данному поставщику Cluster API.

machine-api-operator управляет жизненным циклом CRD, контроллеров и объектов RBAC специального назначения, которые расширяют Kubernetes API. Это позволяет передавать желаемое состояние машин в кластере декларативным способом.

BareMetalMachineProviderSpec#

image - включает в себя два подполя, url и checksum, состоящие из URL-адреса образа и URL-адреса контрольной суммы для этого образа.

userData - включает в себя два подполя, name и namespace, ссылающиеся на секрет, содержащий пользовательские данные в кодировке base64, которые должны быть записаны на диск конфигурации на подготовленном BareMetalHost.

hostSelector - задает критерии для сопоставления меток на объектах BareMetalHost. Это может быть использовано для ограничения набора доступных объектов BareMetalHost, выбранных для данной машины.

Пример настройки машины:

Пример манифеста
apiVersion: cluster.k8s.io/v1alpha1
kind: Machine
metadata:
  annotations:
    metal3.io/BareMetalHost: metal3/master-0
  creationTimestamp: "2019-05-13T13:00:51Z"
  finalizers:
  - machine.cluster.k8s.io
  generateName: baremetal-machine-
  generation: 2
  name: centos
  namespace: metal3
  resourceVersion: "1112"
  selfLink: /apis/cluster.k8s.io/v1alpha1/namespaces/metal3/machines/centos
  uid: 22acee54-757f-11e9-8091-280d3563c053
spec:
  metadata:
    creationTimestamp: null
  providerSpec:
    value:
      apiVersion: baremetal.cluster.k8s.io/v1alpha1
      image:
        checksum: http://NNN.NN.N.N/images/CentOS-7-x86_64-GenericCloud-1901.qcow2.md5sum
        url: http://NNN.NN.N.N/images/CentOS-7-x86_64-GenericCloud-1901.qcow2
      kind: BareMetalMachineProviderSpec
      userData:
        name: centos-user-data
        namespace: metal3
      hostSelector:
        matchLabels:
          key1: value1
        matchExpressions:
          key: key2
          operator: in
          values: {'abc', '123', 'value2'}
  versions:
    kubelet: ""

Где NNN.NN.N.N – актуальный IP адрес.

Пример секрета userData:

apiVersion: v1
data:
  userData: BASE64_ENCODED_USER_DATA
kind: Secret
metadata:
  annotations:
  creationTimestamp: 2019-05-13T13:00:51Z
  name: centos-user-data
  namespace: metal3
  resourceVersion: "1108"
  selfLink: /api/v1/namespaces/metal3/secrets/centos-user-data
  uid: 22792b3e-757f-11e9-8091-280d3563c053
type: Opaque

Поле hostSelector имеет два возможных необязательных подполя:

  • matchLabels - пары меток ключ/значение, которые должны точно совпадать;

  • matchExpressions - набор выражений, которые должны принимать значение true для меток на BareMetalHost.

Допустимые операторы включают:

  • ! - Ключ не существует. Значения игнорируются;

  • = - Ключ равен указанному значению. Должно быть указано только одно значение;

  • == - Ключ равен указанному значению. Должно быть указано только одно значение;

  • в - Значение является членом набора возможных значений;

  • != - Ключ не равен указанному значению. Должно быть указано только одно значение;

  • notin - Значение не является членом указанного набора значений;

  • exists - Ключ существует. Значения игнорируются;

  • gt - Значение больше указанного. Значение должно быть целым числом;

  • lt - Значение меньше указанного. Значение должно быть целым числом.

Пример: BareMetalHost только с ключом key1, установленным в value1, и ключом key2, установленным в value2:

spec:
  providerSpec:
    value:
      hostSelector:
        matchLabels:
          key1: value1
          key2: value2

Масштабирование MachineSet#

Для автоматической масштабируемости MachineSet до количества совпадающих BareMetalHosts, пометьте MachineSet ключом metal3.io/autoscale-to-hosts и любым значением.

При согласовании MachineSet контроллер подсчитает все узлы BareMetalHosts, которые:

  • либо соответствуют спецификации MachineSet Spec.Template.Spec.ProviderSpec.HostSelector и имеют значение ConsumerRef, равное nil;

  • либо имеют значение ConsumerRef, которое ссылается на машину, являющуюся частью MachineSet.