Yandex Cloud
Search
Discuss with expertTry it for free
  • Customer Stories
  • Documentation
  • Blog
  • All Services
    • Cloud Interconnect
    • Cloud Backup
    • Cloud Registry
    • Yandex AI Studio
    • Compute Cloud
    • Object Storage
    • Managed Service for Kubernetes®
    • Yandex BareMetal
    • Smart Web Security
    • Security Deck
    • Managed Service for PostgreSQL
    • Managed Service for ClickHouse®
    • Monium
    • Cloud CDN
    • Network Load Balancer
    • Virtual Private Cloud
    • Cloud DNS
    • Application Load Balancer
    • Yandex Cloud Video
    • Stackland
    • Yandex Cloud Router
    • Yandex Managed Service for Trino
    • Managed Service for MySQL®
    • Managed Service for Valkey™
    • Managed Service for Apache Spark™
    • Yandex StoreDoc
    • Managed Service for OpenSearch
    • Managed Service for Apache Kafka®
    • Data Transfer
    • Yandex MPP Analytics Engine for PostgreSQL
    • Yandex Managed Service for Apache Airflow®
    • Data Processing
    • Yandex MetaData Hub
    • Managed Service for YDB
    • Managed Service for Sharded PostgreSQL
    • Managed Service for YTsaurus
    • Yandex WebSQL
    • DataLens
    • Yandex Search API
    • SpeechSense
    • SpeechKit
    • DataSphere
    • Vision OCR
    • Translate
    • Yandex Identity Hub
    • Key Management Service
    • Certificate Manager
    • Yandex Lockbox
    • Audit Trails
    • SmartCaptcha
    • Cloud Desktop
    • Yandex SIEM
    • SourceCraft Code Assistant
    • Container Registry
    • Managed Service for GitLab
    • Managed Service for Prometheus®
    • Cloud Functions
    • API Gateway
    • Yandex Cloud Postbox
    • Message Queue
    • Serverless Integrations
    • IoT Core
    • Data Streams
    • Serverless Containers
    • Cloud Notification Service
    • Yandex Query
    • Identity and Access Management
    • Yandex Cloud Console
    • Resource Manager
    • Yandex Cloud Billing
    • Yandex Cloud Quota Manager
    • Cloud Apps
  • System Status
  • Marketplace
    • Featured
    • Infrastructure & Network
    • Data Platform
    • AI for business
    • Security
    • DevOps tools
    • Serverless
    • Monitoring & Resources
  • All Solutions
    • By industry
    • By use case
    • Economics and Pricing
    • Security
    • Technical Support
    • Start testing with double trial credits
    • Cloud credits to scale your IT product
    • Gateway to Russia
    • Cloud for Startups
    • Center for Technologies and Society
    • Yandex Cloud Partner program
    • Price calculator
    • Pricing plans
  • Customer Stories
  • Documentation
  • Blog
© 2026 Direct Cursus Technology L.L.C.
Yandex Cloud Stackland
  • What's new
  • Installation
    • All tutorials
    • Installing Stackland on Yandex BareMetal
    • Installing Stackland on Yandex BareMetal via PXE
    • Installing Stackland on Yandex Cloud VMs
    • Setting up external access to a pod in a cluster
    • All guides
      • Upgrading a cluster
      • Scaling a cluster
    • Projects
    • Resource model
    • Scaling a cluster
    • Licensing
  • Access management
  • Pricing policy
  • Diagnostics and troubleshooting

In this article:

  • Getting started
  • Selecting the release channel
  • Before upgrading to 27.x
  • Checking custom Ingress resources
  • Testing the application before the upgrade
  • Disabling the legacy Ingress implementation
  • Cluster with internet access
  • Air-gapped cluster
  • Checking the upgrade status
  • Getting detailed information
  • Viewing upgrade logs
  1. Step-by-step guides
  2. Managing a cluster
  3. Upgrading a cluster

Upgrading a cluster

Written by
Yandex Cloud
Updated at August 31, 2026
View in Markdown
  • Getting started
  • Selecting the release channel
  • Before upgrading to 27.x
    • Checking custom Ingress resources
    • Testing the application before the upgrade
    • Disabling the legacy Ingress implementation
    • Cluster with internet access
    • Air-gapped cluster
  • Checking the upgrade status
  • Getting detailed information
  • Viewing upgrade logs

Upgrade your Stackland cluster version using the TargetInstallationState Kubernetes resource. Perform a rolling update with incremental load evacuation and node reboot.

Getting startedGetting started

  1. Make sure you have admin access to the cluster.

  2. Check the current version of your cluster:

    kubectl get targetinstallationstate main -o jsonpath='{.status.currentVersion}'
    
  3. Find out which versions you can upgrade to. The available versions vary based on whether your cluster has internet access:

    • Cluster with internet access: Available versions are pulled automatically from the Stackland container registry.
    • Air-gapped cluster: Available versions are limited to the images manually imported into your local registry.

Selecting the release channelSelecting the release channel

The release channel determines which Stackland versions are available for the upgrade. The default channel is stable.

Available channels:

  • stable: Stable releases for use in production environments. This channel is available to all customers by default.
  • alpha: Channel with early releases for testing new features. You can access it upon request.

To switch channels, update the PlatformConfig resource:

kubectl edit platformconfig main

Indicate your preferred channel in the specification:

spec:
  releaseChannel: "stable"  # or "alpha"

Before upgrading to 27.xBefore upgrading to 27.x

Stackland 26.2 introduced a new Contour-based Ingress controller deprecating the legacy implementation based on ingress-nginx. Stackland 27 will completely remove ingress-nginx from the distribution, and this serves as prior notice of these plans. In Stackland 26 releases, ingress-nginx remains available for custom workloads, but you must migrate to the new controller before upgrading to Stackland 27.

In most cases, custom Ingress manifests with the stackland-default class will remain operational, but the new controller does not support nginx.ingress.kubernetes.io/* annotations, which are specific to ingress-nginx. Make sure to remove or replace them. For more information, see Checking custom Ingress resources.

Also note that operator action is required: the upgrade to version >= 27.0.0 will fail to initialize unless you explicitly disable the legacy Ingress controller.

Checking custom Ingress resourcesChecking custom Ingress resources

If your cluster contains custom Ingress resources:

  1. Locate custom Ingress resources:

    kubectl get ingress -A
    
  2. Check that they specify spec.ingressClassName: stackland-default or have no such field. In the latter case, the default class is used.

  3. Make sure resource annotations do not contain nginx-specific nginx.ingress.kubernetes.io/* keys. If you find any such annotations, remove or replace them with the new Ingress controller alternatives, or the rules will fail to apply after the upgrade.

Testing the application before the upgradeTesting the application before the upgrade

While your cluster is still on version 26.x, you can proactively verify that your custom Ingress is compatible with the new Ingress controller.

Warning

When changing spec.ingressClassName to stackland-system, remember that stackland-system has its own external IP address that does not match the legacy Ingress controller IP address. If the DNS zone is delegated to the platform, the domain record will update automatically to point to the new LoadBalancer. However, during the standard DNS propagation delay, some client traffic will still be routed to the legacy Ingress controller IP address. A similar delay occurs after you change the class back to stackland-default.

Perform this test within a maintenance window or on a non-critical host.

  1. In a temporary copy of the manifest, replace spec.ingressClassName: stackland-default with spec.ingressClassName: stackland-system and apply the manifest:

    kubectl apply -f <file_name>.yaml
    
  2. Check application availability. There are two ways to do this:

    • Direct IP verification without DNS. This method works independently of DNS propagation or your application domain's DNS zone hosting.

      1. Get the external IP of the LoadBalancer serving the stackland-system class:

        kubectl get svc -A \
          -l app.kubernetes.io/name=contour,app.kubernetes.io/component=envoy
        

        If the selector does not work for your setup, manually locate the LoadBalancer service within your Contour namespace.

      2. Send a request to the application using the retrieved IP:

        curl --resolve <domain>:443:<Envoy_external_IP> https://<domain>/
        
    • Domain-based verification. You can only use this method if your DNS zone is delegated: the domain record will automatically migrate to the stackland-system LoadBalancer. Keep in mind there is a DNS propagation delay. If you manage a custom DNS, the domain will continue to point to the legacy LoadBalancer, i.e., you will get a false negative result. Use curl --resolve instead.

  3. After verification, change the spec.ingressClassName value back to stackland-default or remove this field.

You can skip this step on version 27.x: the new Ingress controller serves the stackland-default class by default.

Warning

stackland-system: Service class. Do not use it for production Ingress resources: this is a temporary class designed exclusively for compatibility tests prior to the upgrade.

Disabling the legacy Ingress implementationDisabling the legacy Ingress implementation

  1. Disable the legacy Ingress implementation within the IngressConfig resource:

    kubectl patch ingressconfig main --type=merge \
      -p '{"spec":{"settings":{"nginx":{"enabled":false}}}}'
    

Disabling ingress-nginx automatically restarts existing Ingress controllers on top of Contour.

  1. Wait until the platform migrates to a single Ingress Controller. Check the current state:

    kubectl get ingressconfig main -o jsonpath='{.status.ingress.observedIngress}'
    
Management console
CLI

If the cluster has no internet access, you must first pull the new version images to your local registry using the CLI.

  1. In the left-hand menu, select Settings.

  2. In the submenu, select Upgrade.

  3. Click the Upgrade link to open the cluster upgrade page.

  4. On the Cluster update page, check the Current upgrade status:

    • Target version: Version to upgrade to.
    • Phase: Upgrade stage.
    • Message: Current state message.
  5. Under Available updates, specify the version to upgrade to.

  6. Click Start update.

The CLI steps depend on whether your cluster has internet access.

Cluster with internet accessCluster with internet access

For clusters with internet access, new version images are automatically pulled from the Stackland container registry.

Setting up an upgradeSetting up an upgrade

Wait for the new release to appear in the AvailableReleases resource. To check for available releases, run this command:

kubectl get availablereleases main -o yaml

Here is an example of the command output:

apiVersion: stackland.yandex.cloud/v1alpha1
kind: AvailableReleases
metadata:
  name: main
status:
  releases:
    - version: "26.1.0"
      ready: true
    - version: "26.1.1"
      ready: true

As soon as the list displays the target version with the ready: true status, you can start the upgrade.

Starting the upgradeStarting the upgrade

  1. Create the manifest file, e.g., using the touch upgrade.yaml command.

  2. Open the file and paste the configuration:

    apiVersion: stackland.yandex.cloud/v1alpha1
    kind: TargetInstallationState
    metadata:
      name: main
    spec:
      targetVersion: "<version>"
      installationTimeout: "2h"
    

    Where:

    • targetVersion: Target version for the upgrade. Specify the value from availablereleases[main].status.releases[<preferred_release>].version.
    • installationTimeout: Upgrade timeout.
  3. Apply the manifest:

    kubectl apply -f upgrade.yaml
    

Air-gapped clusterAir-gapped cluster

If the cluster has no internet access, you must first pull the new version images to your local registry.

Downloading SLADMDownloading SLADM

On an internet-connected machine, download the latest sladm version in the same way as during its initial installation.

Pulling images on an internet-connected machinePulling images on an internet-connected machine

On an internet-connected machine, run this command:

sladm pull --image-bundle full

Where:

  • --image-bundle: Image bundle type, full to get all images.

Note

To upgrade images of separately licensed components, such as SpeechSense, run the command again with --image-bundle speechsense. For more information, see Uploading SpeechSense images.

Transferring artifacts into the internal infrastructureTransferring artifacts into the internal infrastructure

Transfer the following to a machine with access to the local cluster registry:

  • sladm binary file
  • release.yaml
  • <release_name>-oci folder

Pushing images to the local registryPushing images to the local registry

On a machine with cluster access, run this command:

sladm push --local-registry --kubeconfig=<kubeconfig_path> --image-bundle-folder <directory_name>-oci

Where:

  • --local-registry: Indicates the use of the cluster's local registry.
  • --kubeconfig: Path to the kubeconfig file for access to the cluster.
  • --image-bundle-folder: Path to the folder with images.

Verifying release availabilityVerifying release availability

After pushing the images, wait until the new release appears in the AvailableReleases resource.

kubectl get availablereleases main -o yaml

As soon as the list displays the target version with the ready: true status, you can start the upgrade.

Starting the upgradeStarting the upgrade

  1. Create the manifest file, e.g., using the touch upgrade.yaml command.

  2. Open the file and paste the configuration:

    apiVersion: stackland.yandex.cloud/v1alpha1
    kind: TargetInstallationState
    metadata:
      name: main
    spec:
      targetVersion: "<version>"
      installationTimeout: "2h"
    

    Where:

    • targetVersion: Target version for the upgrade. Specify the value from availablereleases[main].status.releases[<preferred_release>].version.
    • installationTimeout: Upgrade timeout.
  3. Apply the manifest:

    kubectl apply -f upgrade.yaml
    

Checking the upgrade statusChecking the upgrade status

After applying the manifest, you can monitor the upgrade status:

kubectl get targetinstallationstate main

Here is an example of the command output:

NAME   TARGET VERSION   CURRENT VERSION   PHASE     MESSAGE                           AGE
main   26.1.1           26.1.0            Running   Running upgrade to version 26.1.1 5m

Getting detailed informationGetting detailed information

Run this command:

kubectl describe targetinstallationstate main

The status field displays:

  • currentVersion: Currently installed version.
  • phase: Upgrade stage:
    • Pending: Upgrade awaiting start.
    • Running: Upgrade in progress.
    • Completed: Upgrade completed.
    • Failed: Upgrade failed.
  • message: Current state message.
  • jobName: Name of the Kubernetes upgrade job.
  • lastUpdateTime: Status last update time.

Viewing upgrade logsViewing upgrade logs

To read logs of the upgrade job, run this command:

kubectl logs -n stackland-install job/<job_name>

You can get the job name from the status.jobName field in the TargetInstallationState resource.

Was the article helpful?

Previous
Switching storage class of a component
Next
Scaling a cluster
© 2026 Direct Cursus Technology L.L.C.