Перейти к содержимому

Предисловие ​

Иногда нет возможности разместить серверы внутри одного broadcast домена, тогда можно добавить машину самостоятельно, без механизма auto discovery.

Для выполнения этой инструкции понадобится:

  • openssl
  • base64
  • kubectl
  • kubeconfig администратора
  • Адрес (K8SCPIP) и CA controlplane

Подготовка сервера ​

Подробно процесс подготовки описан в разделе Требования к подготовке инфраструктуры. Выполните все шаги из той инструкции.

Генерация конфигурации для host-agent ​

Генерация нового приватного ключа ​

bash
openssl genrsa -out {++HOSTNAME++}.key 2048

Генерация CSR и кодирование его в base64 ​

Внимание!

При генерации CSR очень важно заполнить поля Organization name (O) и Common Name (CN).

Organization Name всегда должен быть равен byoh:hosts

Common Name заполните по следующему паттерну byoh:host:HOSTNAME

Запустите генерацию CSR:

bash
openssl req -new -key {++HOSTNAME++}.key -out {++HOSTNAME++}.csr

Появится помощник с интерактивными вопросами. Для регистрации сервера в кластере заполните их без ошибок.

Ответы на интерактивные вопросы

Organization Name (eg, company) [Internet Widgits Pty Ltd]: byoh:hosts

Common Name (e.g. server or YOUR name) []: byoh:host:HOSTNAME

Получите содержимое запроса сертификата в base64:

bash
cat {++HOSTNAME++}.csr | base64 | tr -d '\n'

Получившуюся строку сохраните, она понадобится позже. В месте её использования будет переменная <mark>CSR_BASE64</mark>.

Создайте CertificateSigningRequest

yaml
---
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: byoh-csr-{++HOSTNAME++}
spec:
  request: {++CSR_BASE64++}
  signerName: kubernetes.io/kube-apiserver-client
  usages:
    - client auth
  expirationSeconds: 31536000

Примените его в менеджмент кластере с помощью kubectl apply.

Проверьте его статус:

bash
kubectl get csr byoh-csr-{++HOSTNAME++}

В правой колонке должно быть Approved, Issued.

Получите сертификат ​

bash
kubectl get csr byoh-csr-{++HOSTNAME++} -o jsonpath='{.status.certificate}'

Получившуюся строку сохраните, она понадобится далее. В месте её использования будет переменная CERT_BASE64.

Закодируйте ключ в base64

bash
cat {++HOSTNAME++}.key | base64| tr -d '\n'

Получившуюся строку сохраните, она понадобится далее. В месте её использования будет переменная KEY_BASE64.

Создаем kubeconfig для машины ​

Переменные API_SERVER_ADDRESS и API_SERVER_CA можно скопировать с уже зарегистрированных машин или в cluster-admin kubeconfig, который хранится на любом мастере по пути /etc/kubernetes/admin.conf

Заметка

kubeconfig из веб-интерфейса rancher не подойдёт.

yaml
---
apiVersion: v1
clusters:
  - cluster:
      certificate-authority-data: {++API_SERVER_CA++}
      server: {++API_SERVER_ADDRESS++}
    name: default-cluster
contexts:
  - context:
      cluster: default-cluster
      namespace: default
      user: default-auth
    name: default-context
current-context: default-context
kind: Config
preferences: {}
users:
  - name: default-auth
    user:
      client-certificate-data: {++CERT_BASE64++} # можно получить с помощью kubectl get csr {++byoh-csr-$hostname++} -o jsonpath='{.status.certificate}'
      client-key-data: {++KEY_BASE64++} # можно получить с помощью cat {++$hostname++}.key | base64 | tr -d '\n'

Сохраните этот конфиг на машине, которую планируете завести в кластер по пути /root/.byoh/config.

Владелец и группа файла должны быть root, права 0600(rw-------).

Запустите агент с помощью systemctl start host-agent. Проверьте в менеджмент кластере появление машины с помощью

bash
kubectl get byoh {++HOSTNAME++}

Ручное удаление узлов из кластера ​

Предисловие ​

Боцман в стандартном исполнении реализует подход cattle для управления инфраструктурой. Это значит, что он относится к серверам, на которых он работает, как к стаду. При запуске процесса уменьшения количества серверов (ScaleDown) он выберет рандомный сервер и удалит его из кластера.

Но иногда требуется контролировать, какой именно сервер будет удалён из кластера. Такой подход называется pet. С этой инструкцией вы сможете самостоятельно управлять процессом удаления машин из кластера.

Подготовка к удалению ​

Рекомендуется использовать мягкий способ удаления, особенно в высоконагруженных кластерах. для этого выполните действия:

  • Отправить машину в cordon
  • Отправить машину в drain
  • Перевезти с неё реплики Longhorn

Внимание!

Жесткий способ подразумевает, удаление без ручного переноса реплик и приложений. Что может привести к простоям, особенно в нагруженных средах.

Удаление ​

Есть две опции удаления:
1. Удалить узел и получить новый взамен
2. Удалить узел, уменьшая число узлов в WorkerPool (Узел в взамен удаленного создан не будет)

Заметка

При удалении с уменьшение числа узлов, удостоверьтесь, что сумма реплик WorkerPool целевого кластера после уменьшения будет все еще больше 3

Удаление с помощью UI ​

Войдите в Web-интерфейс bootsman и на главной выберете "Manage"

Manage Clusters

Выберите интересующий кластер и нажмите на его имя. Управления узлами для управляющего и подчиненного идентично.

Choose Clusters

Для удаления узла и получение нового используйте опцию "Delete" в панели управления узлом. ​

Recreate Node

Для удаления узла с уменьшением общего числа узлов. ​

Delete Node

Удаление с помощью изменения Yaml-манифестов ​

Пример работы с объектами Kubernetes будет производитсяс помощью kubectl, но вы можете использовать и другие способы.

Получите список всех узлов и найдите интересующий вас узел

bash
kubectl get machine.cluster.x-k8s.io

Интересующий узел далее будет указан как NODE_NAME

Для удаления и создание нового узла взамен ​

bash
kubectl delete machine.cluster.x-k8s.io {++NODE_NAME++}

Для удаления с уменьшением общего числа узлов. ​

Проставьте аннотацию для удаления. Это шаг еще не запустит удаление.

bash
kubectl annotate machine.cluster.x-k8s.io {++NODE_NAME++} cluster.x-k8s.io/delete-machine="true"

Уменьшите число реплик в Workerpool, к которому принадлежит NODE_NAME

bash
kubectl patch workerpool.provisioning.bootsman.tech  --type=merge -p="{\"spec\": {\"replicas\": {++NEW_REPLICA_COUNT++} }}" \
$(kubectl get machinedeployment.cluster.x-k8s.io -o jsonpath='{.metadata.labels.provisioning\.bootsman\.tech/workerpool}' \
$(kubectl get machine.cluster.x-k8s.io {++NODE_NAME++} -o jsonpath='{.metadata.labels.cluster\.x-k8s\.io/deployment-name}'))

Где: - <mark>NEW_REPLICA_COUNT</mark> - Уменьшенное число реплик на 1

Команда Боцман