Создание кластеров в Huawei Cloud Stack
В этом документе приведены подробные инструкции по созданию Kubernetes-кластеров на платформе Huawei Cloud Stack с использованием Cluster API.
Содержание
Предварительные требования1. Установка необходимых плагинов2. Подготовка входных данных инфраструктуры HCSОбзор создания кластераКонфигурация control planeНастройка аутентификации HCSНастройка пула конфигурации машинПоведение hostname на узлеНастройка шаблона машиныНастройка KubeadmControlPlaneНастройка HCSClusterНастройка ClusterПроверка кластераИспользование kubectlПроверка Control Plane HAОжидаемый результатДобавление worker-нодОбновление кластеровУстранение неполадокПредварительные требования
Перед созданием кластеров убедитесь, что выполнены все следующие предварительные требования:
1. Установка необходимых плагинов
Установите следующие плагины в кластер global :
- Alauda Container Platform Kubeadm Provider
- Alauda Container Platform HCS Infrastructure Provider
Подробные инструкции по установке см. в Руководстве по установке.
2. Подготовка входных данных инфраструктуры HCS
Подготовьте все входные данные, специфичные для HCS, до того, как писать любой YAML в этом документе:
- значения Secret с учетными данными HCS
- распознаваемые провайдером значения вычислительных ресурсов, такие как
imageName,flavorNameиavailabilityZone - инвентаризацию сетей кластера, включая подсети и свободные диапазоны IP-адресов, используемые кластером
- планирование адресов ELB для control plane, включая
vipAddress,vipSubnetNameи фиксированные IP L4 и L7 - планирование пула статических IP для control plane и worker-нод
Полный контрольный список, исходные данные и ограничения см. в разделе Ресурсы инфраструктуры для Huawei Cloud Stack.
Обзор создания кластера
На высоком уровне вы создадите следующие ресурсы Cluster API в кластере global , чтобы подготовить инфраструктуру и выполнить bootstrap функционального Kubernetes-кластера.
Перед тем как писать любой YAML на этой странице, завершите контрольный список подготовки в разделе Ресурсы инфраструктуры для Huawei Cloud Stack. Этот контрольный список охватывает значения, которые ожидает провайдер, источники их получения и значения, которые необходимо спланировать до заполнения манифестов.
Важное требование к namespace
Чтобы обеспечить корректную интеграцию с как business cluster, все ресурсы должны быть развернуты в namespace cpaas-system. Развертывание ресурсов в других namespace может привести к проблемам интеграции.
Именование workload cluster
Имя workload cluster-name не должно быть global. Это имя зарезервировано для кластера global, и повторное использование приведет к пересечению ресурсов workload-кластера с ресурсами кластера global в cpaas-system. Префикс global- зарезервирован для ресурсов, принадлежащих workflow DR кластера global; см. Общие предварительные требования. Не используйте global- для ресурсов workload-кластера, поскольку операции failover могут выбрать эти ресурсы так, как будто они принадлежат кластеру global.
В качестве соглашения называйте ресурс CAPI Cluster и ресурс кластера провайдера (HCSCluster) точно как <cluster-name>, а ресурсы CAPI и ресурсы провайдера, не являющиеся корневыми (KubeadmControlPlane, KubeadmConfigTemplate, MachineDeployment, шаблоны машин, пул конфигураций машин и т. д.), префиксируйте <cluster-name>- — например, в примерах манифестов используется <cluster-name>-kcp. Это рекомендация, а не правило, enforced контроллером, но она предотвращает конфликты в одном namespace, когда в cpaas-system одновременно существует несколько workload-кластеров, и делает владение ресурсами очевидным при выполнении операций.
Процесс создания кластера выполняется в следующем порядке:
- Настроить аутентификацию HCS (Secret)
- Создать пул конфигурации машин (HCSMachineConfigPool)
- Настроить шаблон машины (HCSMachineTemplate)
- Настроить KubeadmControlPlane
- Настроить HCSCluster
- Создать Cluster
Конфигурация control plane
Control plane управляет состоянием кластера, планированием и Kubernetes API. В этом разделе показано, как настроить высокодоступный control plane.
Рекомендации по параметрам конфигурации
При настройке ресурсов осторожно вносите изменения в параметры:
- Заменяйте только значения, заключенные в
<>на значения, соответствующие вашей среде - Сохраняйте все остальные параметры без изменений, поскольку они представляют собой оптимизированные или обязательные конфигурации
- Изменение параметров, не являющихся заполнителями, может привести к нестабильности кластера или проблемам интеграции
Настройка аутентификации HCS
Информация аутентификации HCS хранится в ресурсе Secret.
Существующие Secret с учетными данными, созданные без schema, продолжают работать без изменений. Указывайте schema только если ваш endpoint HCS IAM использует http вместо https по умолчанию.
Вы можете повторно использовать существующий Secret с учетными данными HCS. Его имя не обязано совпадать с именем кластера, но HCSCluster.spec.identityRef.name должен ссылаться на этот Secret.
Настройка пула конфигурации машин
HCSMachineConfigPool задает предварительно настроенные имена хостов, статические IP-адреса и любые управляемые пулом постоянные диски для ВМ.
Требование к размеру пула
Пул конфигурации должен содержать как минимум столько записей, сколько вы планируете развернуть узлов control plane.
Используйте один селектор подсети для каждой записи networks[]. Для новых манифестов задавайте либо subnetName, либо subnetId, но не оба сразу. В существующих манифестах можно оставить устаревшее поле subenetName; если вы также добавляете subnetName при обновлении такого манифеста, его значение должно точно совпадать с subenetName. Не задавайте конфликтующие значения в subenetName, subnetName и subnetId.
Если вы используете subnetName в пуле конфигурации машин, укажите то же имя подсети в HCSCluster.spec.network.subnets.
Для начального сценария создания кластера достаточно указать существующую подсеть по имени, поскольку контроллер разрешает метаданные подсети до того, как кластер станет Ready. Если позже вы добавляете еще одну подсеть в существующий Ready HCSCluster, не добавляйте только name. Обновляйте запись HCSCluster.spec.network.subnets родительского ресурса, включая полный объект подсети, чтобы последующие операции с машинами или ELB могли повторно использовать разрешенные метаданные подсети.
*Для новых манифестов задавайте либо subnetName, либо subnetId. В существующих манифестах можно продолжать использовать subenetName, а subnetName можно добавлять только если оба поля используют одно и то же значение. Не задавайте конфликтующие значения селектора подсети.
Поля постоянного диска обязательны, если указан persistentDisks.
Используйте persistentDisks[] для node-local состояния, которое должно пережить замену ВМ. Не объявляйте тот же путь монтирования в HCSMachineTemplate.spec.template.spec.dataVolumes[].
Примечание: Схема CRD перечисляет subnetName, subenetName и subnetId как необязательные поля и не выражает допустимые комбинации между ними. При написании манифестов следуйте правилам провайдера, приведенным выше.
Примечание: Чтобы подключить к одному узлу несколько NIC, добавьте несколько записей networks[]. Провайдер использует эти записи только для подключения NIC и назначения селекторов подсети и статических IP. Он не поддерживает указание ролей для отдельных NIC, шлюзов по умолчанию, статических маршрутов или настроек DNS для каждого NIC.
Поведение hostname на узле
Провайдер получает POSIX hostname и FQDN узла из hostname следующим образом:
Форма с точкой подходит для настройки приложений, зависящих от разрешения FQDN (hostname -f, сертификаты с SAN-записями, метки журналов). Провайдер задает prefer_fqdn_over_hostname: false и включает cloud-init manage_etc_hosts только если указан hostname с точкой, поэтому POSIX-инструменты по-прежнему видят короткое имя, а hostname -f возвращает полный FQDN.
Недопустимые hostname (начальная точка, конечная точка, строки, состоящие только из точек, прописные буквы или любые значения, нарушающие ограничение поля) отклоняются до запуска ВМ. Ошибка устанавливается в Machine.status владельца и отображается в Cluster.status.conditions, чтобы она была видна в kubectl describe cluster <name> и kubectl get machines -n cpaas-system -o wide.
Настройка шаблона машины
HCSMachineTemplate задает спецификацию ВМ для узлов control plane.
Требования к хранилищу
Для узлов control plane рекомендуются следующие точки монтирования data disk:
/var/lib/etcd- данные etcd (10GB+)/var/lib/kubelet- данные kubelet (100GB+)/var/lib/containerd- данные container runtime (100GB+)
Путь /var/cpaas хранит состояние платформы и журналы. Определяйте его в HCSMachineConfigPool.spec.configs[].persistentDisks[], когда он должен пережить замену ВМ.
*Обязательно, если указан dataVolumes.
dataVolumes[] пересоздаются вместе с ECS. Не используйте их для /var/cpaas или любого другого пути, который должен пережить rolling replacement. Размещайте такие пути в HCSMachineConfigPool.spec.configs[].persistentDisks[].
Примечание: Не задавайте в манифестах HCSMachineTemplate поля runtime identity, такие как providerID или serverId. Провайдер назначает эти значения при создании экземпляров HCS.
Примечание: Администраторы арендатора не могут получить из UI HCS значения flavorName и availabilityZone, распознаваемые провайдером. Получите точные значения у администратора HCS перед применением манифеста.
Настройка KubeadmControlPlane
KubeadmControlPlane определяет конфигурацию control plane Kubernetes.
Контроллер HCS также внедряет файлы при разрешении cloud-init data. Он записывает /etc/kubernetes/pki/kubelet.crt, /etc/kubernetes/pki/kubelet.key и /etc/kubernetes/encryption-provider.conf для машин control plane. Для первой машины control plane контроллер генерирует конфигурацию encryption provider. После инициализации control plane он пытается повторно использовать существующую конфигурацию encryption provider kube-apiserver. Если вы включаете bootstrap-файл в /etc/kubernetes/encryption-provider.conf, рассматривайте его как заполнитель, поскольку приоритет имеет файл, сгенерированный или синхронизированный контроллером.
Примечание: Настраивайте apiServer.extraArgs и apiServer.extraVolumes вместе. Если том не смонтирован, kube-apiserver не сможет прочитать файлы, записанные в /etc/kubernetes.
Примечание: Пример rolloutStrategy.rollingUpdate.maxSurge: 0 выше предназначен для высокодоступных control plane со статическими IP. Сохраняйте эту настройку для пулов control plane фиксированного размера с не менее чем тремя replicas, чтобы замены выполнялись в порядке scale-down, а затем scale-up. Если вы создаете HCS-кластер с одним control plane (spec.replicas: 1), не копируйте блок rolloutStrategy в манифест создания. Валидация KubeadmControlPlane отклоняет такую конфигурацию rollout в стиле scale-in для одной replica.
Примечание: HCS также поддерживает создание кластера с одним control plane, если задать spec.replicas: 1 и подготовить одну запись конфигурации control plane в ссылочном HCSMachineConfigPool. Рассматривайте это как топологию только для создания и не задавайте strategy rollout в этом манифесте создания. Процесс upgrade в этой документации не поддерживает HCS-кластеры с одним control plane.
Используйте Матрицу поддержки ОС только для тех версий компонентов, которые она явно перечисляет, например для image tags coredns и etcd для поддерживаемых образов Alauda OS. Это не полный источник всех значений манифеста HCS. Перед применением этого YAML также используйте утвержденную базовую версию релиза для таких значений, как imageRepository, репозиторий образов DNS, версия Kube-OVN, join CIDR Kube-OVN, Pod CIDR и Service CIDR.
Настройка HCSCluster
Ресурс HCSCluster определяет конфигурацию инфраструктуры HCS.
Провайдер HCS создает Elastic Load Balance (ELB) на платформе HCS для Kubernetes API server. Для этого ELB должен быть включен в режиме Hybrid Load Balancing, чтобы узлы кластера также могли обращаться к API server через адрес ELB.
Для описанного workflow HCS укажите vipAddress, elbVirsubnetL4Ips и elbVirsubnetL7Ips. Каждая запись elbVirsubnetL4Ips[].ips и elbVirsubnetL7Ips[].ips должна содержать два IP-адреса.
Если вы задаете vipDomainName, настройте HCS Cloud DNS Private Zones так, чтобы домен разрешался в vipAddress.
Перечислите каждую подсеть кластера в spec.network.subnets до того, как будете ссылаться на нее где-либо еще. Значения vipSubnetName, elbVirsubnetL4Ips[].subnetName, elbVirsubnetL7Ips[].subnetName и значения subnetName, используемые HCSMachineConfigPool, должны присутствовать в spec.network.subnets.
Для начального сценария создания кластера контроллер может разрешить метаданные существующей подсети по name. Для существующего Ready-кластера добавляйте полный объект подсети, а не только name. Включайте id, а также neutronSubnetId для любой подсети, которую будет использовать ELB control plane. Также сохраняйте в инвентаре подсети cidr, gatewayIp, primaryDNS и secondaryDNS.
Не отключайте Hybrid Load Balancing на ELB, созданном провайдером, после создания кластера. Кластер зависит от этого режима ELB, чтобы узлы могли обращаться к API server через адрес ELB.
Не включайте spec.controlPlaneEndpoint в манифест создания. В HCS create flow контроллер вычисляет и заполняет это поле на основе spec.controlPlaneLoadBalancer после создания HCSCluster. Не задавайте controlPlaneEndpoint вручную и не добавляйте пустой объект controlPlaneEndpoint. Если controlPlaneEndpoint явно присутствует в манифесте, он должен включать и host, и port.
controlPlaneHA является необязательным. Если вы включаете его, обязательны и enabled, и policy. Используйте anti-affinity для строгого разделения по хостам. Используйте soft-anti-affinity, когда вы предпочитаете распределение по хостам, но не хотите, чтобы создание ECS завершалось ошибкой только потому, что HCS не может удовлетворить жесткому правилу размещения. Рекомендации по планированию, включая требование к rolling replacement при включении функции на существующем кластере, см. в Плане размещения Control Plane HA.
Настройка Cluster
Ресурс Cluster в Cluster API объявляет кластер и ссылается на ресурсы control plane и инфраструктуры.
Проверка кластера
После развертывания всех ресурсов кластера убедитесь, что кластер успешно создан.
Использование kubectl
Проверка Control Plane HA
Если вы включили HCSCluster.spec.controlPlaneHA, сначала проверьте condition HCSCluster:
Интерпретируйте condition следующим образом:
Проверьте фактическую server group и snapshot членства:
Для anti-affinity HCS рассматривает политику server group как жесткое ограничение планирования. Если емкости недостаточно, создание ECS может завершиться ошибкой, и сообщение condition следует использовать как первый диагностический сигнал. Для soft-anti-affinity HCS пытается распределять членов, но все же может размещать несколько экземпляров ECS на одном и том же хосте.
Ожидаемый результат
Успешно созданный кластер должен отображать:
- Статус кластера: Running или Provisioned
- Все машины control plane: Running
- Узлы Kubernetes: Ready
- Статус модуля кластера: Completed
Добавление worker-нод
Инструкции по добавлению worker-нод в кластер см. в разделе Управление узлами.
Обновление кластеров
Инструкции по обновлению компонентов кластера см. в разделе Обновление кластеров.
Устранение неполадок
Если кластер достигает состояния Provisioned, но так и не становится Ready — например, workload-узлы остаются в состоянии NotReady, потому что CNI не развернут, — начните с независимого от провайдера раздела Устранение неполадок: workload cluster застрял в состоянии Provisioned.
Для характерных сбоев HCS (например, когда kubeadm init никогда не завершается из-за того, что hostname в HCSMachineConfigPool с точкой привел к POSIX hostname, содержащему точки), см. Устранение неполадок workload cluster Huawei Cloud Stack.