Создание кластеров в Huawei DCS
Этот документ содержит инструкции по созданию кластеров Kubernetes на платформе Huawei DCS. Создание кластеров на основе YAML доступно через manifests. Если установлен Fleet Essentials и версия Alauda Container Platform DCS Infrastructure Provider — 1.0.13 или более поздняя, кластеры также можно создавать через веб-интерфейс.
INFO
Веб-интерфейс предоставляет пошаговый сценарий с проверкой параметров, а YAML — больше гибкости для автоматизации.
Предварительные требования
Перед созданием кластеров убедитесь, что выполнены все следующие предварительные требования:
1. Ресурсы инфраструктуры
Перед созданием кластера настройте следующие ресурсы инфраструктуры:
Подробные инструкции по настройке см. в разделе Ресурсы инфраструктуры для Huawei DCS.
2. Установка необходимых плагинов
Установите следующие плагины на кластер global:
- Alauda Container Platform Kubeadm Provider
- Alauda Container Platform DCS Infrastructure Provider
Подробные инструкции по установке см. в Руководстве по установке.
3. Подготовка шаблона виртуальной машины
Для установки Kubernetes необходимо:
- Загрузить образ MicroOS на платформу DCS
- Создать шаблон виртуальной машины на основе этого образа
- Убедиться, что шаблон содержит все необходимые компоненты Kubernetes
Сведения о компонентах Kubernetes, включенных в каждый образ VM, см. в Матрице поддержки ОС.
4. Сетевое подключение
Убедитесь, что все узлы в кластере global могут подключаться к платформе DCS через:
- Порт 7443 (DCS API)
- Порт 8443 (DCS Web Console)
Требование: подключение к обоим портам обязательно для создания и управления кластером.
5. Настройка LoadBalancer
Перед созданием кластера настройте LoadBalancer для Kubernetes API Server. LoadBalancer распределяет трафик API server между узлами control plane, обеспечивая высокую доступность.
6. Настройка публичного registry
Настройте учетные данные публичного registry. Это включает:
- Настройку адреса репозитория registry
- Корректную настройку учетных данных для аутентификации
Использование веб-интерфейса
Требование к версии: для этого сценария требуются Fleet Essentials и Alauda Container Platform DCS Infrastructure Provider версии 1.0.13 или более поздней. Если версия provider ниже 1.0.13, используйте YAML manifests.
Сценарий создания
Создание кластера выполняется через мастер из 5 шагов:
Step 1: Basic Info
↓
Step 2: Control Plane Node Pool
↓
Step 3: Worker Node Pools
↓
Step 4: Networking
↓
Step 5: Review
Навигация: Clusters → Clusters → Create Cluster → Select Huawei DCS
Шаг 1: Основная информация
Проверка предварительных условий:
Перед созданием кластера убедитесь, что:
- В платформе DCS существуют шаблоны DCS VM Templates, а версия MicroOS соответствует версии Kubernetes
- Для Kubernetes API Server настроен LoadBalancer
Ограничение по версии: можно создать только последнюю версию Kubernetes, поддерживаемую платформой.
Шаг 2: Пул узлов control plane
Пул узлов control plane фиксирован на 3 реплики для обеспечения высокой доступности.
Проверка: связанный IP Pool должен иметь достаточное количество доступных IP-адресов (≥ 3).
Шаг 3: Пулы worker-узлов
Можно добавить несколько пулов worker-узлов. Каждый пул имеет следующую конфигурацию:
Правила проверки:
- Имена пулов должны быть уникальны в пределах кластера
- IP Pool должен иметь достаточное количество доступных IP-адресов (≥ Replicas)
- maxSurge и maxUnavailable должны удовлетворять ограничению: если maxSurge = 0, то maxUnavailable > 0
Совет: добавляйте к имени пула префикс с именем кластера, за которым следует дефис (например, mycluster-worker-1), чтобы избежать конфликтов имен между разными кластерами.
Шаг 4: Сеть
Проверка: Pods CIDR и Services CIDR не должны пересекаться.
Шаг 5: Проверка
Перед созданием кластера проверьте все параметры конфигурации:
Основная информация:
- Name, Display Name, Infrastructure Credential
- Distribution Version, Kubernetes Version
- Cluster API Address
Пул узлов control plane:
- Machine Template с именем VM Template, версией ОС, версией Kubernetes
- CPU, Memory, Replicas, SSH Keys
Пулы worker-узлов (представление списка):
- Pool Name, Machine Template, Replicas
- Max Surge, Max Unavailable, SSH Keys
Сеть:
- Pods CIDR, Services CIDR, Join CIDR
Нажмите Create, чтобы начать процесс создания кластера.
Использование YAML
Сценарий создания кластера
При использовании YAML вы создаете ресурсы Cluster API в кластере global, чтобы подготовить инфраструктуру и развернуть рабочий кластер Kubernetes.
WARNING
Важное требование к namespace
Чтобы обеспечить корректную интеграцию в качестве бизнес-кластеров, все ресурсы должны быть развернуты в namespace cpaas-system. Развертывание ресурсов в других namespace может привести к проблемам интеграции.
Сценарий конфигурации
Выполните следующие шаги по порядку:
- Настройте KubeadmControlPlane
- Настройте DCSCluster
- Создайте ресурс Cluster
Примечание: инфраструктурные ресурсы (Secret, DCSIpHostnamePool, DCSMachineTemplate) следует настраивать отдельно. Инструкции см. в разделе Ресурсы инфраструктуры для Huawei DCS.
Планирование сети и LoadBalancer
Перед созданием ресурсов control plane спланируйте сетевую архитектуру и разверните load balancer для обеспечения высокой доступности.
Требования:
- Сегментация сети: спланируйте диапазоны IP-адресов для узлов control plane
- Load balancer: разверните и настройте доступ к API server
- Адрес API server: подготовьте стабильный VIP или адрес load balancer для Kubernetes API Server
- Подключение: обеспечьте сетевое соединение между всеми компонентами
Настройка KubeadmControlPlane
Ресурс KubeadmControlPlane определяет конфигурацию control plane, включая версию Kubernetes, характеристики узлов и параметры bootstrap.
TIP
Полная справка по конфигурации
В приведенном ниже примере длинные файлы конфигурации сокращены для удобства чтения. Полную конфигурацию, включая политики аудита по умолчанию, controls admission и содержимое файлов, см. в Полной конфигурации KubeadmControlPlane в приложении.
kubeadmcontrolplane.yaml
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) ..."
}
# ... (other files) ...
clusterConfiguration:
imageRepository: cloud.alauda.io/alauda
dns:
imageTag: <dns-image-tag>
etcd:
local:
imageTag: <etcd-image-tag>
# ... (apiServer, controllerManager, scheduler) ...
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>
Описание параметров:
Для версий компонентов (например, <dns-image-tag>, <etcd-image-tag>) см. Матрицу поддержки ОС.
Настройка DCSCluster
DCSCluster — это декларация инфраструктурного кластера, которая ссылается на load balancer и учетные данные платформы DCS.
dcscluster.yaml
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: DCSCluster
metadata:
name: "<cluster-name>"
namespace: cpaas-system
spec:
controlPlaneLoadBalancer:
host: <load-balancer-ip-or-domain-name>
port: 6443
type: external
credentialSecretRef:
name: <auth-secret-name>
controlPlaneEndpoint:
host: <load-balancer-ip-or-domain-name>
port: 6443
networkType: kube-ovn
site: <site>
Описание параметров:
Настройка Cluster
Ресурс Cluster объявляет кластер и ссылается на ресурсы control plane и инфраструктуры.
cluster.yaml
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>
Описание параметров:
Развертывание узлов
Инструкции по развертыванию worker-узлов см. в разделе Управление узлами в Huawei DCS.
Проверка кластера
После развертывания всех ресурсов кластера убедитесь, что кластер успешно создан и работает.
Через Console
- Перейдите в Clusters → Clusters
- Найдите только что созданный кластер в списке кластеров
- Убедитесь, что состояние кластера отображается как Running
- Проверьте, что все узлы control plane и worker находятся в состоянии Ready
Через kubectl
В качестве альтернативы проверьте кластер с помощью команд kubectl:
# Check cluster status
kubectl get cluster -n cpaas-system <cluster-name>
# Verify control plane
kubectl get kubeadmcontrolplane -n cpaas-system <cluster-name>
# Check machine status
kubectl get machines -n cpaas-system
# Verify cluster deployment
kubectl get clustermodule <cluster-name> -o jsonpath='{.status.base.deployStatus}'
Ожидаемые результаты
Успешно созданный кластер должен отображать:
- Состояние кластера: Running или Provisioned
- Все машины control plane: Running
- Все worker-узлы (если развернуты): Running
- Узлы Kubernetes: Ready
- Состояние Cluster Module: Completed
Приложение
Полная конфигурация KubeadmControlPlane
Ниже приведена полная конфигурация KubeadmControlPlane, включая все политики аудита по умолчанию, controls admission и содержимое файлов.
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
omitStages:
- "RequestReceived"
rules:
- level: None
users:
- system:kube-controller-manager
- system:kube-scheduler
- system:serviceaccount:kube-system:endpoint-controller
verbs: ["get", "update"]
namespaces: ["kube-system"]
resources:
- group: ""
resources: ["endpoints"]
- level: None
nonResourceURLs:
- /healthz*
- /version
- /swagger*
- level: None
resources:
- group: ""
resources: ["events"]
- level: None
resources:
- group: "devops.alauda.io"
- level: None
verbs: ["get", "list", "watch"]
- level: None
resources:
- group: "coordination.k8s.io"
resources: ["leases"]
- level: None
resources:
- group: "authorization.k8s.io"
resources: ["subjectaccessreviews", "selfsubjectaccessreviews"]
- group: "authentication.k8s.io"
resources: ["tokenreviews"]
- level: None
resources:
- group: "app.alauda.io"
resources: ["imagewhitelists"]
- group: "k8s.io"
resources: ["namespaceoverviews"]
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
- level: Metadata
resources:
- group: "operator.connectors.alauda.io"
resources: ["installmanifests"]
- group: "operators.katanomi.dev"
resources: ["katanomis"]
- level: RequestResponse
resources:
- group: ""
- 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"]
- 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>
Следующие шаги
После создания кластера: