Создание кластеров
В этом документе приведены подробные инструкции по созданию Kubernetes кластеров на платформе DCS с использованием Cluster API. Процесс включает развертывание и настройку множества Kubernetes ресурсов, которые совместно обеспечивают создание и управление инфраструктурой кластера.
Предварительные требования
Перед созданием кластеров убедитесь, что выполнены все следующие условия:
1. Установка необходимых плагинов
Установите следующие плагины в global кластере :
- Cluster API Provider Kubeadm — обеспечивает возможности начальной загрузки Kubernetes кластера
- Cluster API Provider DCS — обеспечивает интеграцию и управление инфраструктурой DCS
Подробные инструкции по установке см. в Installation Guide.
2. Подготовка шаблона виртуальной машины
Для установки Kubernetes необходимо:
- Загрузить образ MicroOS, предоставленный , на платформу DCS
- Создать шаблон виртуальной машины на основе этого образа
- Убедиться, что шаблон содержит все необходимые компоненты Kubernetes
Подробности о компонентах Kubernetes, включённых в каждый образ ВМ, см. в OS Support Matrix.
3. Сетевое подключение
Убедитесь, что все узлы в global кластере имеют доступ к платформе DCS по следующим портам:
- Порт 7443 (DCS API)
- Порт 8443 (DCS Web Console)
Требование: Подключение к обоим портам обязательно для создания и управления кластером.
4. Учетные данные платформы DCS
Учетные данные платформы DCS, используемые для создания кластера, должны соответствовать определённым требованиям.
Требуемая конфигурация пользователя
- Тип пользователя: должен быть
Interface interconnection user (接口互联用户)
- Роль: должен быть
administrator
Требуемая политика паролей
Проверьте следующую настройку в System Management → Rights Management → Rights Management Policy:
- Политика:
Whether to modify the password of an interface interconnection user upon password resetting and first login
- Значение: должно быть установлено в
No
Влияние: Если установлено значение Yes, пароль пользователя будет принудительно изменён при первом входе, что нарушит аутентификацию и приведёт к сбоям при создании кластера.
5. Конфигурация публичного реестра
Настройте учетные данные публичного реестра на . Это включает:
- Конфигурацию адреса репозитория реестра
- Правильную настройку аутентификационных данных
Подробные шаги настройки см. в документации Alauda Container Platform: Configure → Clusters → How to → Updating Public Registry Credentials.
Обзор создания кластера
В общих чертах, вы создадите следующие ресурсы Cluster API в global кластере , чтобы обеспечить инфраструктуру и запустить рабочий Kubernetes кластер.
WARNING
Важное требование к namespace
Для корректной интеграции с в качестве бизнес-кластеров все ресурсы должны быть развернуты в namespace cpaas-system. Размещение ресурсов в других namespace может привести к проблемам интеграции.
Конфигурация Control Plane
Control plane управляет состоянием кластера, планированием и Kubernetes API. В этом разделе показано, как настроить высокодоступный control plane.
WARNING
Рекомендации по параметрам конфигурации
При настройке ресурсов будьте осторожны с изменениями параметров:
- Заменяйте только значения, заключённые в
<>, на значения, специфичные для вашей среды
- Сохраняйте все остальные параметры без изменений, так как они представляют оптимизированные или обязательные настройки
- Изменение параметров, не являющихся заполнителями, может привести к нестабильности кластера или проблемам интеграции
Порядок настройки
Выполните следующие шаги по порядку:
- Спланируйте сеть и разверните балансировщик нагрузки API
- Настройте учетные данные DCS (Secret)
- Создайте пул IP и имён хостов
- Создайте
DCSMachineTemplate для control plane
- Настройте
KubeadmControlPlane
- Настройте
DCSCluster
- Создайте ресурс
Cluster
После применения манифестов будет создан DCS Kubernetes control plane с помощью .
Планирование сети и балансировщик нагрузки
Перед созданием ресурсов control plane спланируйте сетевую архитектуру и разверните балансировщик нагрузки для обеспечения высокой доступности.
Требования
- Сегментация сети: спланируйте диапазоны IP-адресов для узлов control plane
- Балансировщик нагрузки: разверните и настройте доступ к API серверу
- Привязка IP: свяжите балансировщик нагрузки с IP из пула IP control plane
- Подключение: обеспечьте сетевое соединение между всеми компонентами
Балансировщик нагрузки распределяет трафик API сервера между узлами control plane для обеспечения доступности и отказоустойчивости.
Настройка аутентификации DCS
Информация для аутентификации DCS хранится в ресурсе Secret.
В следующем примере <auth-secret-name> — имя сохранённого Secret:
apiVersion: v1
data:
authUser: <base64-encoded-auth-user>
authKey: <base64-encoded-auth-key>
endpoint: <base64-encoded-endpoint>
kind: Secret
metadata:
name: <auth-secret-name>
namespace: cpaas-system
type: Opaque
Настройка пула IP и имён хостов
Необходимо заранее спланировать IP-адреса виртуальных машин control plane, имена хостов, DNS-серверы и другую сетевую информацию.
WARNING
Вы должны настроить информацию о машинах для количества машин, равного или превышающего количество узлов control plane.
В следующем примере <control-plane-iphostname-pool-name> — имя ресурса:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSIpHostnamePool
metadata:
name: <control-plane-iphostname-pool-name>
namespace: cpaas-system
spec:
pool:
- ip: "<control-plane-ip-1>"
mask: "<control-plane-mask>"
gateway: "<control-plane-gateway>"
dns: "<control-plane-dns>"
hostname: "<control-plane-hostname-1>"
machineName: "<control-plane-machine-name-1>"
Настройка шаблона машины (Control Plane)
Шаблон машины DCS объявляет конфигурацию для машин DCS, создаваемых последующими компонентами Cluster API. Шаблон машины указывает шаблон виртуальной машины, подключённые диски, CPU, память и другую информацию о конфигурации.
WARNING
Требования к хранилищу
Доступ к datastore между хостами
Кластеры datastore (datastoreClusterName) должны поддерживать доступ между всеми физическими машинами платформы DCS.
- Причина: если datastore доступен только на определённых хостах, создание ВМ завершится неудачей, если платформа DCS попытается запланировать ВМ на другом хосте.
Общее хранилище для Ignition
Если ваш datastore не поддерживает прямую загрузку файлов (необходимую для конфигураций Ignition), вы должны предоставить решение общего хранилища (например, NFS), поддерживающее монтирование с нескольких хостов.
Правила конфигурации дисков
Вы можете добавить пользовательские диски, но обязательно сохраняйте обязательные системные и данные диски, показанные в примере ниже (systemVolume, /var/lib/kubelet, /var/lib/containerd, /var/cpaas).
В следующем примере <cp-dcs-machine-template-name> — имя шаблона машины control plane:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSMachineTemplate
metadata:
name: <cp-dcs-machine-template-name>
namespace: cpaas-system
spec:
template:
spec:
vmTemplateName: <vm-template-name>
location:
type: folder
name: <folder-name>
resource: # Необязательно, если не указано, используются значения по умолчанию шаблона
type: cluster # cluster | host. Необязательно
name: <cluster-name> # Необязательно
vmConfig:
dvSwitchName: <dv-switch-name> # Необязательно
portGroupName: <port-group-name> # Необязательно
dcsMachineCpuSpec:
quantity: <control-plane-cpu>
dcsMachineMemorySpec: # МБ
quantity: <control-plane-memory>
dcsMachineDiskSpec: # ГБ
- quantity: 0
datastoreClusterName: <datastore-cluster-name>
systemVolume: true
- quantity: 10
datastoreClusterName: <datastore-cluster-name>
path: /var/lib/etcd
format: xfs
- quantity: 100
datastoreClusterName: <datastore-cluster-name>
path: /var/lib/kubelet
format: xfs
- quantity: 100
datastoreClusterName: <datastore-cluster-name>
path: /var/lib/containerd
format: xfs
- quantity: 100
datastoreClusterName: <datastore-cluster-name>
path: /var/cpaas
format: xfs
ipHostPoolRef:
name: <control-plane-iphostname-pool-name>
Описание ключевых параметров
Настройка KubeadmControlPlane
Текущая реализация control plane в DCS опирается на провайдер control plane kubeadm из Cluster API и требует настройки ресурса KubeadmControlPlane.
Большинство параметров в примере уже оптимизированы или обязательны, но некоторые параметры могут потребовать настройки под вашу среду.
TIP
Полная справочная конфигурация
Пример ниже сокращён для удобства чтения. Для полной конфигурации (включая политики аудита по умолчанию, admission контролы и содержимое файлов) см. раздел Complete KubeadmControlPlane Configuration в приложении.
В следующем примере <cluster-name> — имя ресурса:
Для версий компонентов (например, <dns-image-tag>, <etcd-image-tag>) см. OS Support Matrix.
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
name: <cluster-name>
namespace: cpaas-system
annotations:
controlplane.cluster.x-k8s.io/skip-kube-proxy: ""
spec:
rolloutStrategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0
kubeadmConfigSpec:
users:
- name: boot
sshAuthorizedKeys:
- "<ssh-authorized-keys>"
format: ignition
files:
- path: /etc/kubernetes/admission/psa-config.yaml
owner: "root:root"
permissions: "0644"
content: |
# ... (Admission Configuration Content) ...
- path: /etc/kubernetes/patches/kubeletconfiguration0+strategic.json
owner: "root:root"
permissions: "0644"
content: |
{
"apiVersion": "kubelet.config.k8s.io/v1beta1",
"kind": "KubeletConfiguration",
"_comment": "... (Kubelet Configuration Content) ..."
}
- path: /etc/kubernetes/encryption-provider.conf
owner: "root:root"
append: false
permissions: "0644"
content: |
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-secret>
# ... (Other files including admission config, audit policy, kubelet config) ...
# ... (preKubeadmCommands & postKubeadmCommands) ...
clusterConfiguration:
imageRepository: cloud.alauda.io/alauda
dns:
imageTag: <dns-image-tag>
etcd:
local:
imageTag: <etcd-image-tag>
# ... (apiServer, controllerManager, scheduler configurations) ...
# ... (initConfiguration & joinConfiguration) ...
machineTemplate:
nodeDrainTimeout: 1m
nodeDeletionTimeout: 5m
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSMachineTemplate
name: <cp-dcs-machine-template-name>
replicas: 3
version: <control-plane-kubernetes-version>
Описание ключевых параметров
Настройка DCSCluster
DCSCluster — это декларация инфраструктурного кластера. Поскольку платформа DCS в настоящее время не предоставляет собственный load balancer, необходимо заранее вручную настроить балансировщик нагрузки и привязать его к IP-адресу из пула IP и имён хостов, настроенного в разделе «Настройка пула IP и имён виртуальных машин».
В следующем примере <cluster-name> — имя ресурса:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSCluster
metadata:
name: "<cluster-name>"
namespace: cpaas-system
spec:
controlPlaneLoadBalancer: # Настройка HA
host: <load-balancer-ip-or-domain-name>
port: 6443
type: external
credentialSecretRef: # Ссылка на секрет аутентификации
name: <auth-secret-name>
controlPlaneEndpoint: # Спецификация Cluster API, должна совпадать с controlPlane
host: <load-balancer-ip-or-domain-name>
port: 6443
networkType: kube-ovn
site: <site> # Параметр платформы DCS, ID пула ресурсов
Описание ключевых параметров
Настройка Cluster
Ресурс Cluster в Cluster API используется для объявления кластера и должен ссылаться на соответствующий ресурс control plane и инфраструктурный ресурс кластера:
apiVersion: cluster.x-k8s.io/v1beta1
kind: Cluster
metadata:
annotations:
capi.cpaas.io/resource-group-version: infrastructure.cluster.x-k8s.io/v1beta1
capi.cpaas.io/resource-kind: DCSCluster
cpaas.io/kube-ovn-version: <kube-ovn-version>
cpaas.io/kube-ovn-join-cidr: <kube-ovn-join-cidr>
labels:
cluster-type: DCS
name: <cluster-name>
namespace: cpaas-system
spec:
clusterNetwork:
pods:
cidrBlocks:
- <pods-cidr>
services:
cidrBlocks:
- <services-cidr>
controlPlaneRef:
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
name: <cluster-name>
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSCluster
name: <cluster-name>
Описание ключевых параметров
Развёртывание узлов
Инструкции см. на странице Deploy Nodes.
Проверка кластера
После развертывания всех ресурсов кластера проверьте, что кластер успешно создан и работает.
Использование консоли
- Перейдите в представление Administrator в консоли
- Откройте Clusters → Clusters
- Найдите ваш недавно созданный кластер в списке
- Убедитесь, что статус кластера отображается как Running
- Проверьте, что все узлы control plane и worker имеют статус Ready
Использование kubectl
Альтернативно, вы можете проверить кластер с помощью команд kubectl:
# Проверка статуса кластера
kubectl get cluster -n cpaas-system <cluster-name>
# Проверка узлов control plane
kubectl get kubeadmcontrolplane -n cpaas-system <cluster-name>
# Проверка статуса машин
kubectl get machines -n cpaas-system
# Проверка статуса развертывания кластера
kubectl get clustermodule <cluster-name> -o jsonpath='{.status.base.deployStatus}'
Ожидаемые результаты
Успешно созданный кластер должен иметь:
- Статус кластера: Running или Provisioned
- Все машины control plane: Running
- Все рабочие узлы (если развернуты): Running
- Узлы Kubernetes: Ready
- Статус Cluster Module: Completed
Приложение
Полная конфигурация KubeadmControlPlane
Ниже приведена полная конфигурация KubeadmControlPlane, включая все политики аудита по умолчанию, admission контролы и содержимое файлов. Вы можете скопировать весь блок и изменить <placeholders> по необходимости.
apiVersion: controlplane.cluster.x-k8s.io/v1beta1
kind: KubeadmControlPlane
metadata:
name: <cluster-name>
namespace: cpaas-system
annotations:
controlplane.cluster.x-k8s.io/skip-kube-proxy: ""
spec:
rolloutStrategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0
kubeadmConfigSpec:
users:
- name: boot
sshAuthorizedKeys:
- "<ssh-authorized-keys>"
format: ignition
files:
- path: /etc/kubernetes/admission/psa-config.yaml
owner: "root:root"
permissions: "0644"
content: |
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
configuration:
apiVersion: pod-security.admission.config.k8s.io/v1
kind: PodSecurityConfiguration
defaults:
enforce: "privileged"
enforce-version: "latest"
audit: "baseline"
audit-version: "latest"
warn: "baseline"
warn-version: "latest"
exemptions:
usernames: []
runtimeClasses: []
namespaces:
- kube-system
- cpaas-system
- path: /etc/kubernetes/patches/kubeletconfiguration0+strategic.json
owner: "root:root"
permissions: "0644"
content: |
{
"apiVersion": "kubelet.config.k8s.io/v1beta1",
"kind": "KubeletConfiguration",
"protectKernelDefaults": true,
"tlsCertFile": "/etc/kubernetes/pki/kubelet.crt",
"tlsPrivateKeyFile": "/etc/kubernetes/pki/kubelet.key",
"streamingConnectionIdleTimeout": "5m",
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
- path: /etc/kubernetes/encryption-provider.conf
owner: "root:root"
append: false
permissions: "0644"
content: |
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-secret>
- path: /etc/kubernetes/audit/policy.yaml
owner: "root:root"
append: false
permissions: "0644"
content: |
apiVersion: audit.k8s.io/v1
kind: Policy
# Don't generate audit events for all requests in RequestReceived stage.
omitStages:
- "RequestReceived"
rules:
# The following requests were manually identified as high-volume and low-risk,
# so drop them.
- level: None
users:
- system:kube-controller-manager
- system:kube-scheduler
- system:serviceaccount:kube-system:endpoint-controller
verbs: ["get", "update"]
namespaces: ["kube-system"]
resources:
- group: "" # core
resources: ["endpoints"]
# Don't log these read-only URLs.
- level: None
nonResourceURLs:
- /healthz*
- /version
- /swagger*
# Don't log events requests.
- level: None
resources:
- group: "" # core
resources: ["events"]
# Don't log devops requests.
- level: None
resources:
- group: "devops.alauda.io"
# Don't log get list watch requests.
- level: None
verbs: ["get", "list", "watch"]
# Don't log lease operation
- level: None
resources:
- group: "coordination.k8s.io"
resources: ["leases"]
# Don't log access review and token review requests.
- level: None
resources:
- group: "authorization.k8s.io"
resources: ["subjectaccessreviews", "selfsubjectaccessreviews"]
- group: "authentication.k8s.io"
resources: ["tokenreviews"]
# Don't log imagewhitelists and namespaceoverviews operations
- level: None
resources:
- group: "app.alauda.io"
resources: ["imagewhitelists"]
- group: "k8s.io"
resources: ["namespaceoverviews"]
# Secrets, ConfigMaps can contain sensitive & binary data,
# so only log at the Metadata level.
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
# devops installmanifests and katanomis can contains huge data and sensitive data, only log at the Metadata level.
- level: Metadata
resources:
- group: "operator.connectors.alauda.io"
resources: ["installmanifests"]
- group: "operators.katanomi.dev"
resources: ["katanomis"]
# Default level for known APIs
- level: RequestResponse
resources:
- group: "" # core
- group: "aiops.alauda.io"
- group: "apps"
- group: "app.k8s.io"
- group: "authentication.istio.io"
- group: "auth.alauda.io"
- group: "autoscaling"
- group: "asm.alauda.io"
- group: "clusterregistry.k8s.io"
- group: "crd.alauda.io"
- group: "infrastructure.alauda.io"
- group: "monitoring.coreos.com"
- group: "operators.coreos.com"
- group: "networking.istio.io"
- group: "extensions.istio.io"
- group: "install.istio.io"
- group: "security.istio.io"
- group: "telemetry.istio.io"
- group: "opentelemetry.io"
- group: "networking.k8s.io"
- group: "portal.alauda.io"
- group: "rbac.authorization.k8s.io"
- group: "storage.k8s.io"
- group: "tke.cloud.tencent.com"
- group: "devopsx.alauda.io"
- group: "core.katanomi.dev"
- group: "deliveries.katanomi.dev"
- group: "integrations.katanomi.dev"
- group: "artifacts.katanomi.dev"
- group: "builds.katanomi.dev"
- group: "versioning.katanomi.dev"
- group: "sources.katanomi.dev"
- group: "tekton.dev"
- group: "operator.tekton.dev"
- group: "eventing.knative.dev"
- group: "flows.knative.dev"
- group: "messaging.knative.dev"
- group: "operator.knative.dev"
- group: "sources.knative.dev"
- group: "operator.devops.alauda.io"
- group: "flagger.app"
- group: "jaegertracing.io"
- group: "velero.io"
resources: ["deletebackuprequests"]
- group: "connectors.alauda.io"
- group: "operator.connectors.alauda.io"
resources: ["connectorscores", "connectorsgits", "connectorsocis"]
# Default level for all other requests.
- level: Metadata
preKubeadmCommands:
- while ! ip route | grep -q "default via"; do sleep 1; done; echo "NetworkManager started"
- mkdir -p /run/cluster-api && restorecon -Rv /run/cluster-api
- if [ -f /etc/disk-setup.sh ]; then bash /etc/disk-setup.sh; fi
postKubeadmCommands:
- chmod 600 /var/lib/kubelet/config.yaml
clusterConfiguration:
imageRepository: cloud.alauda.io/alauda
dns:
imageTag: <dns-image-tag>
etcd:
local:
imageTag: <etcd-image-tag>
apiServer:
extraArgs:
audit-log-format: json
audit-log-maxage: "30"
audit-log-maxbackup: "10"
audit-log-maxsize: "200"
profiling: "false"
audit-log-mode: batch
audit-log-path: /etc/kubernetes/audit/audit.log
audit-policy-file: /etc/kubernetes/audit/policy.yaml
tls-cipher-suites: "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
encryption-provider-config: /etc/kubernetes/encryption-provider.conf
admission-control-config-file: /etc/kubernetes/admission/psa-config.yaml
tls-min-version: VersionTLS12
kubelet-certificate-authority: /etc/kubernetes/pki/ca.crt
extraVolumes:
- name: vol-dir-0
hostPath: /etc/kubernetes
mountPath: /etc/kubernetes
pathType: Directory
controllerManager:
extraArgs:
bind-address: "::"
profiling: "false"
tls-min-version: VersionTLS12
flex-volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
scheduler:
extraArgs:
bind-address: "::"
tls-min-version: VersionTLS12
profiling: "false"
initConfiguration:
patches:
directory: /etc/kubernetes/patches
nodeRegistration:
kubeletExtraArgs:
node-labels: "kube-ovn/role=master"
provider-id: PROVIDER_ID
volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
protect-kernel-defaults: "true"
joinConfiguration:
patches:
directory: /etc/kubernetes/patches
nodeRegistration:
kubeletExtraArgs:
node-labels: "kube-ovn/role=master"
provider-id: PROVIDER_ID
volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
protect-kernel-defaults: "true"
machineTemplate:
nodeDrainTimeout: 1m
nodeDeletionTimeout: 5m
infrastructureRef:
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSMachineTemplate
name: <cp-dcs-machine-template-name>
replicas: 3
version: <control-plane-kubernetes-version>