Deckhouse Virtualization Platform for bare metal

Your browser cannot generate Ed25519 keys (Web Crypto API). Update your browser or generate a key pair manually with ssh-keygen -t ed25519 and substitute it for <CAPS_SSH_PUBLIC_KEY> and <CAPS_SSH_PRIVATE_KEY>.

Select the Deckhouse Virtualization Platform revision

  • Community Edition
  • Enterprise Edition

The recommended settings for a DVP Community Edition installation are generated below:

  • config.yml — a file with the configuration needed to bootstrap the cluster. Contains the installer parameters and the initial cluster parameters.

Please pay attention to:

  • Highlighted parameters can be adjusted if needed.
  • If you run the installer on Windows, ensure the configuration YAML files use UTF-8 encoding (or remove Russian comments).
  • Run the installation from a personal computer with SSH access to the node that will be the cluster master node.

Create the config.yml file.

# General cluster parameters.
# https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/api/cr.html#clusterconfiguration
apiVersion: deckhouse.io/v1
kind: ClusterConfiguration
clusterType: Static
# Address space of the cluster Pods.
# You might consider changing this. Ensure that there are no overlaps with other subnets.
podSubnetCIDR: <POD_SUBNET_CIDR>
# Address space of the cluster services.
# You might consider changing this. Ensure that there are no overlaps with other subnets.
serviceSubnetCIDR: <SERVICE_SUBNET_CIDR>
kubernetesVersion: "Automatic"
# Cluster domain (used for local routing).
clusterDomain: "internal.cluster.local"
# Default container runtime on cluster nodes (NodeGroups).
defaultCRI: "ContainerdV2"
---
# Deckhouse module settings.
# https://deckhouse.io/modules/deckhouse/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: deckhouse
spec:
  version: 1
  enabled: true
  settings:
    bundle: Default
    # Deckhouse release channel. Early Access is stable enough for test environments.
    # More info: https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/release-channels.html
    releaseChannel: EarlyAccess
    logLevel: Info
    # Settings for accessing the container registry with Deckhouse images.
    registry:
      mode: Unmanaged
      unmanaged:
        imagesRepo: registry.deckhouse.io/deckhouse/ce
---
# Global Deckhouse settings.
# https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/api/global.html#parameters
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: global
spec:
  version: 2
  settings:
    # StorageClass used for cluster PVCs when none is specified explicitly.
    defaultClusterStorageClass: nfs-storage-class
    modules:
      # Template for system application URLs in the cluster.
      # E.g., Grafana for `%s.example.com` is available at `grafana.example.com`, the DVP web interface — at `console.example.com`.
      # The domain MUST NOT match the cluster domain (`clusterDomain`).
      # You might consider changing this.
      publicDomainTemplate: "<PUBLIC_DOMAIN_TEMPLATE>"
      # The HTTPS implementation used by Deckhouse modules.
      # https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/api/global.html#parameters-modules-https
      https:
        certManager:
          # Self-signed certificates: Let's Encrypt cannot validate a domain that is not published on the internet.
          clusterIssuerName: selfsigned
---
# cert-manager module settings.
# https://deckhouse.io/modules/cert-manager/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: cert-manager
spec:
  version: 1
  enabled: true
  settings:
    # Let's Encrypt ClusterIssuers are not created: the cluster domain is not published on the internet.
    disableLetsencrypt: true
---
# user-authn module settings.
# https://deckhouse.io/modules/user-authn/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: user-authn
spec:
  version: 2
  enabled: true
  settings:
    # Enabling access to the API server through Ingress.
    # https://deckhouse.io/modules/user-authn/configuration.html#parameters-publishapi
    publishAPI:
      enabled: true
      https:
        mode: Global
        global:
          kubeconfigGeneratorMasterCA: ""
---
# cni-cilium module settings.
# https://deckhouse.io/modules/cni-cilium/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: cni-cilium
spec:
  version: 1
  # Enable cni-cilium module.
  enabled: true
  settings:
    tunnelMode: VXLAN
---
# admission-policy-engine module settings.
# https://deckhouse.io/modules/admission-policy-engine/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: admission-policy-engine
spec:
  version: 1
  enabled: true
---
# multitenancy-manager module settings (projects, quotas).
# https://deckhouse.io/modules/multitenancy-manager/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: multitenancy-manager
spec:
  version: 1
  enabled: true
---
# Static cluster settings (internal node networks).
# https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/api/cr.html#staticclusterconfiguration
apiVersion: deckhouse.io/v1
kind: StaticClusterConfiguration
# Internal node networks for Kubernetes components (kube-apiserver, kubelet, etc.).
# Required for static clusters with virtualization and when nodes use multiple interfaces.
# Must include master and worker node IP addresses.
internalNetworkCIDRs:
  # You might consider changing this. Ensure that there are no overlaps with other subnets.
  - <INTERNAL_NETWORK_CIDRS>
---
# Worker NodeGroup for static machines.
# https://deckhouse.io/modules/node-manager/cr.html#nodegroup
apiVersion: deckhouse.io/v1
kind: NodeGroup
metadata:
  name: worker
spec:
  nodeType: Static
  staticInstances:
    # Single worker StaticInstance in this quick start.
    count: 1
    labelSelector:
      matchLabels:
        role: worker
  # Labels applied to every node of this group.
  nodeTemplate:
    labels:
      storage: "true"
---
# SSH credentials for Cluster API Provider Static (CAPS) to connect to the worker node (private key is generated in the browser on step 2).
# https://deckhouse.io/modules/node-manager/cr.html#sshcredentials
apiVersion: deckhouse.io/v1alpha2
kind: SSHCredentials
metadata:
  name: caps
spec:
  user: caps
  privateSSHKey: <CAPS_SSH_PRIVATE_KEY_BASE64>
---
# Static worker instance for CAPS (address from step 2 cluster parameters).
# https://deckhouse.io/modules/node-manager/cr.html#staticinstance
apiVersion: deckhouse.io/v1alpha2
kind: StaticInstance
metadata:
  name: dvp-worker-1
  labels:
    role: worker
spec:
  address: "<WORKER_NODE_IP>"
  credentialsRef:
    kind: SSHCredentials
    name: caps
---
# csi-nfs module settings.
# https://deckhouse.io/modules/csi-nfs/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: csi-nfs
spec:
  version: 1
  enabled: true
---
# virtualization module settings (Deckhouse Virtualization Container Registry (DVCR), VM networks).
# https://deckhouse.io/modules/virtualization/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: virtualization
spec:
  version: 1
  enabled: true
  settings:
    dvcr:
      storage:
        persistentVolumeClaim:
          # Size of the DVCR image storage.
          size: 50Gi
        type: PersistentVolumeClaim
    # CIDRs for virtual machine traffic (must not overlap with pod/service subnets).
    virtualMachineCIDRs:
      # You might consider changing this. Ensure that there are no overlaps with other subnets.
      - <VIRTUAL_MACHINE_CIDRS>
---
# NFS StorageClass for cluster and virtualization storage.
# https://deckhouse.io/modules/csi-nfs/cr.html#nfsstorageclass
apiVersion: storage.deckhouse.io/v1alpha1
kind: NFSStorageClass
metadata:
  name: nfs-storage-class
spec:
  connection:
    # You might consider changing this.
    host: <NFS_HOST>
    # You might consider changing this.
    share: <NFS_SHARE>
    nfsVersion: "4.1"
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer
  # Nodes allowed to mount volumes of this StorageClass.
  workloadNodes:
    nodeSelector:
      matchLabels:
        storage: "true"
---
# ingress-nginx module settings.
# https://deckhouse.io/modules/ingress-nginx/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: ingress-nginx
spec:
  version: 1
  enabled: true
---
# Ingress NGINX Controller (HostPort on control-plane / master for this quick start).
# https://deckhouse.io/modules/ingress-nginx/cr.html
apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
  name: nginx
spec:
  ingressClass: nginx
  # HostPort exposes HTTP/HTTPS on the master node (ports 80 and 443).
  inlet: HostPort
  hostPort:
    httpPort: 80
    httpsPort: 443
  # You might consider changing this. How long NGINX waits for worker processes to finish on a configuration reload.
  config:
    worker-shutdown-timeout: 300s
  nodeSelector:
    node-role.kubernetes.io/control-plane: ""
  tolerations:
    - effect: NoSchedule
      key: node-role.kubernetes.io/control-plane
      operator: Exists
---
# snapshot-controller module settings.
# https://deckhouse.io/modules/snapshot-controller/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: snapshot-controller
spec:
  version: 1
  enabled: true
---
# console module settings.
# https://deckhouse.io/modules/console/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: console
spec:
  version: 2
  enabled: true
---
# prometheus module settings (metrics, Grafana).
# https://deckhouse.io/modules/prometheus/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: prometheus
spec:
  version: 2
  enabled: true
  settings:
    # Long-term metric storage is not started; the main Prometheus keeps metrics for 15 days.
    longtermRetentionDays: 0
---
# upmeter module settings (availability metrics, status page).
# https://deckhouse.io/modules/upmeter/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: upmeter
spec:
  enabled: true
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: local-path-provisioner
spec:
  enabled: false
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: pod-reloader
spec:
  enabled: false
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: secret-copier
spec:
  enabled: false
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: namespace-configurator
spec:
  enabled: false
---
# Project for multitenancy-manager (resource quota and admins).
# https://deckhouse.io/modules/multitenancy-manager/cr.html#project
apiVersion: deckhouse.io/v1alpha2
kind: Project
metadata:
  name: test-project
spec:
  description: test-project
  projectTemplateName: default
  parameters:
    resourceQuota:
      requests:
        cpu: 20
        memory: 20Gi
      limits:
        cpu: 20
        memory: 20Gi
    # You might consider changing this. With `Isolated` (the template default) VM images cannot be downloaded over HTTP and VMs get no internet access.
    networkPolicy: NotRestricted
    administrators:
      - subject: User
        name: admin@deckhouse.io
---
# Cluster-wide admin access for Dex / web interfaces (required for the DVP web interface).
# https://deckhouse.io/modules/user-authz/cr.html#clusterauthorizationrule
apiVersion: deckhouse.io/v1
kind: ClusterAuthorizationRule
metadata:
  name: admin
spec:
  # Kubernetes RBAC accounts list.
  subjects:
    - kind: User
      name: admin@deckhouse.io
  # Pre-defined access template.
  accessLevel: SuperAdmin
  # Allow kubectl port-forward.
  portForwarding: true
---
# Static user for Dex sign-in (DVP web interface and other web UIs).
# https://deckhouse.io/modules/user-authn/cr.html#user
apiVersion: deckhouse.io/v1
kind: User
metadata:
  name: admin
spec:
  # User e-mail (login).
  email: admin@deckhouse.io
  # You might consider changing this. Generated automatically.
  # Password hash for `<GENERATED_PASSWORD>`.
  # echo -n '<GENERATED_PASSWORD>' | htpasswd -BinC 10 "" | cut -d: -f2 | tr -d '\n' | base64 -w0; echo
  password: '<GENERATED_PASSWORD_HASH>'

When uploading large VM images (especially over a slow link), if the upload is interrupted when the Ingress controller reloads configuration, replace the worker-shutdown-timeout value in config.yml (IngressNginxController / nginx) with 1800s or more:

  config:
    worker-shutdown-timeout: 1800s  # 30 minutes or more if needed

Otherwise the default applies — 300s (5 minutes).

Enter license key

Enter

Have no key?

The recommended settings for a DVP Enterprise Edition installation are generated below:

  • config.yml — a file with the configuration needed to bootstrap the cluster. Contains the installer parameters and the initial cluster parameters.

Please pay attention to:

  • Highlighted parameters can be adjusted if needed.
  • If you run the installer on Windows, ensure the configuration YAML files use UTF-8 encoding (or remove Russian comments).
  • Run the installation from a personal computer with SSH access to the node that will be the cluster master node.

Create the config.yml file.

# General cluster parameters.
# https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/api/cr.html#clusterconfiguration
apiVersion: deckhouse.io/v1
kind: ClusterConfiguration
clusterType: Static
# Address space of the cluster Pods.
# You might consider changing this. Ensure that there are no overlaps with other subnets.
podSubnetCIDR: <POD_SUBNET_CIDR>
# Address space of the cluster services.
# You might consider changing this. Ensure that there are no overlaps with other subnets.
serviceSubnetCIDR: <SERVICE_SUBNET_CIDR>
kubernetesVersion: "Automatic"
# Cluster domain (used for local routing).
clusterDomain: "internal.cluster.local"
# Default container runtime on cluster nodes (NodeGroups).
defaultCRI: "ContainerdV2"
---
# Deckhouse module settings.
# https://deckhouse.io/modules/deckhouse/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: deckhouse
spec:
  version: 1
  enabled: true
  settings:
    bundle: Default
    # Deckhouse release channel.
    # More info: https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/release-channels.html
    releaseChannel: Stable
    logLevel: Info
    # Settings for accessing the container registry with Deckhouse images.
    registry:
      mode: Unmanaged
      unmanaged:
        imagesRepo: registry.deckhouse.io/deckhouse/ee
        license: <YOUR_ACCESS_STRING_IS_HERE>
---
# Global Deckhouse settings.
# https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/api/global.html#parameters
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: global
spec:
  version: 2
  settings:
    # StorageClass used for cluster PVCs when none is specified explicitly.
    defaultClusterStorageClass: nfs-storage-class
    modules:
      # Template for system application URLs in the cluster.
      # E.g., Grafana for `%s.example.com` is available at `grafana.example.com`, the DVP web interface — at `console.example.com`.
      # The domain MUST NOT match the cluster domain (`clusterDomain`).
      # You might consider changing this.
      publicDomainTemplate: "<PUBLIC_DOMAIN_TEMPLATE>"
      # The HTTPS implementation used by Deckhouse modules.
      # https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/api/global.html#parameters-modules-https
      https:
        certManager:
          # Self-signed certificates: Let's Encrypt cannot validate a domain that is not published on the internet.
          clusterIssuerName: selfsigned
---
# cert-manager module settings.
# https://deckhouse.io/modules/cert-manager/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: cert-manager
spec:
  version: 1
  enabled: true
  settings:
    # Let's Encrypt ClusterIssuers are not created: the cluster domain is not published on the internet.
    disableLetsencrypt: true
---
# user-authn module settings.
# https://deckhouse.io/modules/user-authn/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: user-authn
spec:
  version: 2
  enabled: true
  settings:
    # Enabling access to the API server through Ingress.
    # https://deckhouse.io/modules/user-authn/configuration.html#parameters-publishapi
    publishAPI:
      enabled: true
      https:
        mode: Global
        global:
          kubeconfigGeneratorMasterCA: ""
---
# cni-cilium module settings.
# https://deckhouse.io/modules/cni-cilium/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: cni-cilium
spec:
  version: 1
  # Enable cni-cilium module.
  enabled: true
  settings:
    tunnelMode: VXLAN
---
# admission-policy-engine module settings.
# https://deckhouse.io/modules/admission-policy-engine/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: admission-policy-engine
spec:
  version: 1
  enabled: true
---
# multitenancy-manager module settings (projects, quotas).
# https://deckhouse.io/modules/multitenancy-manager/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: multitenancy-manager
spec:
  version: 1
  enabled: true
---
# Static cluster settings (internal node networks).
# https://deckhouse.io/products/kubernetes-platform/documentation/v1/reference/api/cr.html#staticclusterconfiguration
apiVersion: deckhouse.io/v1
kind: StaticClusterConfiguration
# Internal node networks for Kubernetes components (kube-apiserver, kubelet, etc.).
# Required for static clusters with virtualization and when nodes use multiple interfaces.
# Must include master and worker node IP addresses.
internalNetworkCIDRs:
  # You might consider changing this. Ensure that there are no overlaps with other subnets.
  - <INTERNAL_NETWORK_CIDRS>
---
# Worker NodeGroup for static machines.
# https://deckhouse.io/modules/node-manager/cr.html#nodegroup
apiVersion: deckhouse.io/v1
kind: NodeGroup
metadata:
  name: worker
spec:
  nodeType: Static
  staticInstances:
    # Single worker StaticInstance in this quick start.
    count: 1
    labelSelector:
      matchLabels:
        role: worker
  # Labels applied to every node of this group.
  nodeTemplate:
    labels:
      storage: "true"
---
# SSH credentials for Cluster API Provider Static (CAPS) to connect to the worker node (private key is generated in the browser on step 2).
# https://deckhouse.io/modules/node-manager/cr.html#sshcredentials
apiVersion: deckhouse.io/v1alpha2
kind: SSHCredentials
metadata:
  name: caps
spec:
  user: caps
  privateSSHKey: <CAPS_SSH_PRIVATE_KEY_BASE64>
---
# Static worker instance for CAPS (address from step 2 cluster parameters).
# https://deckhouse.io/modules/node-manager/cr.html#staticinstance
apiVersion: deckhouse.io/v1alpha2
kind: StaticInstance
metadata:
  name: dvp-worker-1
  labels:
    role: worker
spec:
  address: "<WORKER_NODE_IP>"
  credentialsRef:
    kind: SSHCredentials
    name: caps
---
# csi-nfs module settings.
# https://deckhouse.io/modules/csi-nfs/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: csi-nfs
spec:
  version: 1
  enabled: true
---
# virtualization module settings (Deckhouse Virtualization Container Registry (DVCR), VM networks).
# https://deckhouse.io/modules/virtualization/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: virtualization
spec:
  version: 1
  enabled: true
  settings:
    dvcr:
      storage:
        persistentVolumeClaim:
          # Size of the DVCR image storage.
          size: 50Gi
        type: PersistentVolumeClaim
    # CIDRs for virtual machine traffic (must not overlap with pod/service subnets).
    virtualMachineCIDRs:
      # You might consider changing this. Ensure that there are no overlaps with other subnets.
      - <VIRTUAL_MACHINE_CIDRS>
---
# NFS StorageClass for cluster and virtualization storage.
# https://deckhouse.io/modules/csi-nfs/cr.html#nfsstorageclass
apiVersion: storage.deckhouse.io/v1alpha1
kind: NFSStorageClass
metadata:
  name: nfs-storage-class
spec:
  connection:
    # You might consider changing this.
    host: <NFS_HOST>
    # You might consider changing this.
    share: <NFS_SHARE>
    nfsVersion: "4.1"
  reclaimPolicy: Delete
  volumeBindingMode: WaitForFirstConsumer
  # Nodes allowed to mount volumes of this StorageClass.
  workloadNodes:
    nodeSelector:
      matchLabels:
        storage: "true"
---
# ingress-nginx module settings.
# https://deckhouse.io/modules/ingress-nginx/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: ingress-nginx
spec:
  version: 1
  enabled: true
---
# Ingress NGINX Controller (HostPort on control-plane / master for this quick start).
# https://deckhouse.io/modules/ingress-nginx/cr.html
apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
  name: nginx
spec:
  ingressClass: nginx
  # HostPort exposes HTTP/HTTPS on the master node (ports 80 and 443).
  inlet: HostPort
  hostPort:
    httpPort: 80
    httpsPort: 443
  # You might consider changing this. How long NGINX waits for worker processes to finish on a configuration reload.
  config:
    worker-shutdown-timeout: 300s
  nodeSelector:
    node-role.kubernetes.io/control-plane: ""
  tolerations:
    - effect: NoSchedule
      key: node-role.kubernetes.io/control-plane
      operator: Exists
---
# snapshot-controller module settings.
# https://deckhouse.io/modules/snapshot-controller/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: snapshot-controller
spec:
  version: 1
  enabled: true
---
# console module settings.
# https://deckhouse.io/modules/console/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: console
spec:
  version: 2
  enabled: true
---
# prometheus module settings (metrics, Grafana).
# https://deckhouse.io/modules/prometheus/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: prometheus
spec:
  version: 2
  enabled: true
  settings:
    # Long-term metric storage is not started; the main Prometheus keeps metrics for 15 days.
    longtermRetentionDays: 0
---
# upmeter module settings (availability metrics, status page).
# https://deckhouse.io/modules/upmeter/configuration.html
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: upmeter
spec:
  enabled: true
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: local-path-provisioner
spec:
  enabled: false
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: pod-reloader
spec:
  enabled: false
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: secret-copier
spec:
  enabled: false
---
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: namespace-configurator
spec:
  enabled: false
---
# Project for multitenancy-manager (resource quota and admins).
# https://deckhouse.io/modules/multitenancy-manager/cr.html#project
apiVersion: deckhouse.io/v1alpha2
kind: Project
metadata:
  name: test-project
spec:
  description: test-project
  projectTemplateName: default
  parameters:
    resourceQuota:
      requests:
        cpu: 20
        memory: 20Gi
      limits:
        cpu: 20
        memory: 20Gi
    # You might consider changing this. With `Isolated` (the template default) VM images cannot be downloaded over HTTP and VMs get no internet access.
    networkPolicy: NotRestricted
    administrators:
      - subject: User
        name: admin@deckhouse.io
---
# Cluster-wide admin access for Dex / web interfaces (required for the DVP web interface).
# https://deckhouse.io/modules/user-authz/cr.html#clusterauthorizationrule
apiVersion: deckhouse.io/v1
kind: ClusterAuthorizationRule
metadata:
  name: admin
spec:
  # Kubernetes RBAC accounts list.
  subjects:
    - kind: User
      name: admin@deckhouse.io
  # Pre-defined access template.
  accessLevel: SuperAdmin
  # Allow kubectl port-forward.
  portForwarding: true
---
# Static user for Dex sign-in (DVP web interface and other web UIs).
# https://deckhouse.io/modules/user-authn/cr.html#user
apiVersion: deckhouse.io/v1
kind: User
metadata:
  name: admin
spec:
  # User e-mail (login).
  email: admin@deckhouse.io
  # You might consider changing this. Generated automatically.
  # Password hash for `<GENERATED_PASSWORD>`.
  # echo -n '<GENERATED_PASSWORD>' | htpasswd -BinC 10 "" | cut -d: -f2 | tr -d '\n' | base64 -w0; echo
  password: '<GENERATED_PASSWORD_HASH>'

When uploading large VM images (especially over a slow link), if the upload is interrupted when the Ingress controller reloads configuration, replace the worker-shutdown-timeout value in config.yml (IngressNginxController / nginx) with 1800s or more:

  config:
    worker-shutdown-timeout: 1800s  # 30 minutes or more if needed

Otherwise the default applies — 300s (5 minutes).

Use a Docker image to install DVP. Transfer the configuration file and the Ed25519 SSH key for the master node (~/.ssh/id_ed25519).

Run the installer on the personal computer.

  • Linux / macOS
  • Windows

If, with VPN enabled, the container with the installer cannot access the network, use the instructions.

Run a container with the installer:

docker run --pull=always -it -v "$PWD/config.yml:/config.yml" -v "$HOME/.ssh/:/tmp/.ssh/" registry.deckhouse.io/deckhouse/ce/install:stable bash -c "chmod 400 /tmp/.ssh/id_ed25519; bash"

Run a container with the installer:

docker run --pull=always -it -v "%cd%\config.yml:/config.yml" -v "%userprofile%\.ssh\:/tmp/.ssh/" registry.deckhouse.io/deckhouse/ce/install:stable bash -c "chmod 400 /tmp/.ssh/id_ed25519; bash"

Inside the container, run:

dhctl bootstrap --ssh-user=ubuntu --ssh-host=<MASTER_IP> --ssh-agent-private-keys=/tmp/.ssh/id_ed25519 \
  --config=/config.yml \
  --ask-become-pass

Where:

  • <MASTER_IP>master node IP address for SSH.
  • --ssh-user=ubuntu — user name on the master node (defaults to ubuntu; change it if your master uses another account).
  • --ssh-agent-private-keys=/tmp/.ssh/id_ed25519 — Ed25519 private key: the id_ed25519 file from ~/.ssh/ on your computer (mounted in the container as /tmp/.ssh/id_ed25519).
  • --ask-become-pass — add this flag if sudo on the server asks for a password; enter the password when prompted with [sudo] Password:.

The installation process may take from 5 to 30 minutes, depending on the connection between the master node and the image registry.

Example output upon successful completion:

...
│ │ No more converge tasks found in Deckhouse queue.
│ │ Deckhouse pod is Ready!
│ └ Waiting for Deckhouse to become Ready (157.34 seconds)
└ ⛵ ~ Bootstrap: Install Deckhouse (158.47 seconds)

┌ ⛵ ~ Bootstrap: Create Resources
│ ...
│ 🎉 Succeeded!
└ ⛵ ~ Bootstrap: Create Resources (420.15 seconds)

┌ ⛵ ~ Bootstrap: Run post bootstrap actions
│ ...
│ │ 🎉 Succeeded!
│ └ Set release channel to deckhouse module config (25.35 seconds)
└ ⛵ ~ Bootstrap: Run post bootstrap actions (25.35 seconds)

┌ ⛵ ~ Bootstrap: Clear cache
│ ❗ ~ Next run of "dhctl bootstrap" will create a new Kubernetes cluster.
└ ⛵ ~ Bootstrap: Clear cache (0.00 seconds)

🎉 Deckhouse cluster was created successfully!

The cluster with the worker node is ready. Proceed to the next step to configure access to DVP web interfaces.

Use a Docker image to install DVP. Transfer the configuration file and the Ed25519 SSH key for the master node (~/.ssh/id_ed25519).

Run the installer on the personal computer.

  • Linux / macOS
  • Windows

Log in on the personal computer to the container image registry:

echo <LICENSE_TOKEN> | docker login -u license-token --password-stdin registry.deckhouse.io

Run a container with the installer:

If, with VPN enabled, the container with the installer cannot access the network, use the instructions.

docker run --pull=always -it -v "$PWD/config.yml:/config.yml" -v "$HOME/.ssh/:/tmp/.ssh/" registry.deckhouse.io/deckhouse/ee/install:stable bash -c "chmod 400 /tmp/.ssh/id_ed25519; bash"

Log in on the personal computer to the container image registry by providing the license key as a password:

docker login -u license-token registry.deckhouse.io

Run a container with the installer:

docker run --pull=always -it -v "%cd%\config.yml:/config.yml" -v "%userprofile%\.ssh\:/tmp/.ssh/" registry.deckhouse.io/deckhouse/ee/install:stable bash -c "chmod 400 /tmp/.ssh/id_ed25519; bash"

Inside the container, run:

dhctl bootstrap --ssh-user=ubuntu --ssh-host=<MASTER_IP> --ssh-agent-private-keys=/tmp/.ssh/id_ed25519 \
  --config=/config.yml \
  --ask-become-pass

Where:

  • <MASTER_IP>master node IP address for SSH.
  • --ssh-user=ubuntu — user name on the master node (defaults to ubuntu; change it if your master uses another account).
  • --ssh-agent-private-keys=/tmp/.ssh/id_ed25519 — Ed25519 private key: the id_ed25519 file from ~/.ssh/ on your computer (mounted in the container as /tmp/.ssh/id_ed25519).
  • --ask-become-pass — add this flag if sudo on the server asks for a password; enter the password when prompted with [sudo] Password:.

The installation process may take from 5 to 30 minutes, depending on the connection between the master node and the image registry.

Example output upon successful completion:

...
│ │ No more converge tasks found in Deckhouse queue.
│ │ Deckhouse pod is Ready!
│ └ Waiting for Deckhouse to become Ready (157.34 seconds)
└ ⛵ ~ Bootstrap: Install Deckhouse (158.47 seconds)

┌ ⛵ ~ Bootstrap: Create Resources
│ ...
│ 🎉 Succeeded!
└ ⛵ ~ Bootstrap: Create Resources (420.15 seconds)

┌ ⛵ ~ Bootstrap: Run post bootstrap actions
│ ...
│ │ 🎉 Succeeded!
│ └ Set release channel to deckhouse module config (25.35 seconds)
└ ⛵ ~ Bootstrap: Run post bootstrap actions (25.35 seconds)

┌ ⛵ ~ Bootstrap: Clear cache
│ ❗ ~ Next run of "dhctl bootstrap" will create a new Kubernetes cluster.
└ ⛵ ~ Bootstrap: Clear cache (0.00 seconds)

🎉 Deckhouse cluster was created successfully!

The cluster with the worker node is ready. Proceed to the next step to configure access to DVP web interfaces.