Project Operations
This section demonstrates how to use the standard Kubernetes tool for cluster operation kubectl for common cluster operations with emphasis on Gardener resources. For more information on kubectl, see kubectl on kubernetes.io.
Prerequisites
- You’re logged on to the Gardener Dashboard.
- You’ve created a cluster and its status is operational.
It's recommended that you get acquainted with the resources in the Gardener API.
Using kubeconfig for remote project operations
The kubeconfig for project operations is different from the one for cluster operations. It has a larger scope and allows a different set of operations that are applicable for a project administrator role, such as lifecycle control on clusters and managing project members.
Depending on your goal, you can create a service account suitable for automation and use it for your pipelines, or you can get a user-specific kubeconfig and use it to manage your project resources via kubectl.
Downloading your kubeconfig
Kubernetes doesn’t offer an own resource type for human users that access the API server. Instead, you either have to manage unique user strings, or use an OpenID-Connect (OIDC) compatible Identity Provider (IDP) to do the job.
Once the latter is set up, each Gardener user can use the kubelogin plugin for kubectl to authenticate against the API server:
Set up
kubeloginif you don't have it yet. More information: kubelogin setup.Open the menu at the top right of the screen, then choose MY ACCOUNT.

On the Access card, choose the arrow to see all options for the personalized command-line interface access.

The personal bearer token that is also offered here only provides access for a limited amount of time for one time operations, for example, in
curlcommands. Thekubeconfigprovided for the personalized access is used bykubeloginto grant access to the Gardener API for the user permanently by using a refresh token.Check that the right Project is chosen and keep the settings otherwise. Download the
kubeconfigfile and add its path to theKUBECONFIGenvironment variable.
You can now execute kubectl commands on the garden cluster using the identity of your user.
Note: You can also manage your Gardener project resources automatically using a Gardener service account. For more information, see Automating Project Resource Management.
List Gardener API resources
Using a
kubeconfigfor project operations, you can list the Gardner API resources using the following command:bashkubectl api-resources | grep gardenThe response looks like this:
bashbackupbuckets bbc core.gardener.cloud false BackupBucket backupentries bec core.gardener.cloud true BackupEntry cloudprofiles cprofile,cpfl core.gardener.cloud false CloudProfile controllerinstallations ctrlinst core.gardener.cloud false ControllerInstallation controllerregistrations ctrlreg core.gardener.cloud false ControllerRegistration plants pl core.gardener.cloud true Plant projects core.gardener.cloud false Project quotas squota core.gardener.cloud true Quota secretbindings sb core.gardener.cloud true SecretBinding seeds core.gardener.cloud false Seed shoots core.gardener.cloud true Shoot shootstates core.gardener.cloud true ShootState terminals dashboard.gardener.cloud true Terminal clusteropenidconnectpresets coidcps settings.gardener.cloud false ClusterOpenIDConnectPreset openidconnectpresets oidcps settings.gardener.cloud true OpenIDConnectPresetEnter the following command to view the Gardener API versions:
bashkubectl api-versions | grep gardenThe response looks like this:
bashcore.gardener.cloud/v1alpha1 core.gardener.cloud/v1beta1 dashboard.gardener.cloud/v1alpha1 settings.gardener.cloud/v1alpha1
Check your permissions
The operations on project resources are limited by the role of the identity that tries to perform them. To get an overview over your permissions, use the following command:
bashkubectl auth can-i --list | grep gardenThe response looks like this:
bashplants.core.gardener.cloud [] [] [create delete deletecollection get list patch update watch] quotas.core.gardener.cloud [] [] [create delete deletecollection get list patch update watch] secretbindings.core.gardener.cloud [] [] [create delete deletecollection get list patch update watch] shoots.core.gardener.cloud [] [] [create delete deletecollection get list patch update watch] terminals.dashboard.gardener.cloud [] [] [create delete deletecollection get list patch update watch] openidconnectpresets.settings.gardener.cloud [] [] [create delete deletecollection get list patch update watch] cloudprofiles.core.gardener.cloud [] [] [get list watch] projects.core.gardener.cloud [] [flowering] [get patch update delete] namespaces [] [garden-flowering] [get]Try to execute an operation that you aren’t allowed, for example:
bashkubectl get projectsYou receive an error message like this:
bashError from server (Forbidden): projects.core.gardener.cloud is forbidden: User "system:serviceaccount:garden-flowering:robot" cannot list resource "projects" in API group "core.gardener.cloud" at the cluster scope
Working with projects
You can get the details for a project, where you (or the service account) is a member.
bashkubectl get project floweringThe response looks like this:
bashNAME NAMESPACE STATUS OWNER CREATOR AGE flowering garden-flowering Ready [PROJECT-ADMIN]@domain [PROJECT-ADMIN]@domain system 45mFor more information, see Project in the API reference.
To query the names of the members of a project, use the following command:
bashkubectl get project docu -o jsonpath='{.spec.members[*].name }'The response looks like this:
bash[PROJECT-ADMIN]@domain system:serviceaccount:garden-flowering:robotFor more information, see members in the API reference.
Working with clusters
The Gardener domain object for a managed cluster is called Shoot.
List project clusters
To query the clusters in a project:
kubectl get shootsThe output looks like this:
NAME CLOUDPROFILE VERSION SEED DOMAIN HIBERNATION OPERATION PROGRESS APISERVER CONTROL NODES SYSTEM AGE
geranium aws 1.18.3 aws-eu1 geranium.flowering.shoot.<truncated> Awake Succeeded 100 True True True True 74mCreate a new cluster
To create a new cluster using the command line, you need a YAML definition of the Shoot resource.
To get started, copy the following YAML definition to a new file, for example,
daffodil.yaml(or copy file shoot.yaml todaffodil.yaml) and adapt it to your needs.yamlapiVersion: core.gardener.cloud/v1beta1 kind: Shoot metadata: name: daffodil namespace: garden-flowering spec: secretBindingName: trial-secretbinding-gcp cloudProfile: kind: CloudProfile name: gcp region: europe-west1 purpose: evaluation provider: type: gcp infrastructureConfig: kind: InfrastructureConfig apiVersion: gcp.provider.extensions.gardener.cloud/v1alpha1 networks: workers: 10.250.0.0/16 controlPlaneConfig: apiVersion: gcp.provider.extensions.gardener.cloud/v1alpha1 zone: europe-west1-c kind: ControlPlaneConfig workers: - name: cpu-worker maximum: 2 minimum: 1 maxSurge: 1 maxUnavailable: 0 machine: type: n1-standard-2 image: name: gardenlinux volume: type: pd-standard size: 50Gi zones: - europe-west1-c networking: type: calico pods: 100.96.0.0/11 nodes: 10.250.0.0/16 services: 100.64.0.0/13 maintenance: timeWindow: begin: 220000+0100 end: 230000+0100 autoUpdate: kubernetesVersion: true machineImageVersion: true hibernation: enabled: true schedules: - start: '00 17 * * 1,2,3,4,5' location: Europe/Kiev kubernetes: allowPrivilegedContainers: true kubeControllerManager: nodeCIDRMaskSize: 24 kubeProxy: mode: IPTables version: 1.18.3 addons: nginxIngress: enabled: false kubernetesDashboard: enabled: falseIn your new YAML definition file, replace the value of field
metadata.namespacewith your namespace following the conventiongarden-[YOUR-PROJECTNAME].Create a cluster using this manifest (with flag
--wait=falsethe command returns immediately, otherwise it doesn't return until the process is finished):bashkubectl apply -f daffodil.yaml --wait=falseThe response looks like this:
bashshoot.core.gardener.cloud/daffodil createdIt takes 5–10 minutes until the cluster is created. To watch the progress, get all shoots and use the
-wflag.bashkubectl get shoots -w
For a more extended example, see Gardener example shoot manifest.
Delete cluster
To delete a shoot cluster, you must first annotate the shoot resource to confirm the operation with confirmation.gardener.cloud/deletion: "true":
Add the annotation to your manifest (
daffodil.yamlin the previous example):yamlapiVersion: core.gardener.cloud/v1beta1 kind: Shoot metadata: name: daffodil namespace: garden-flowering annotations: confirmation.gardener.cloud/deletion: "true" spec: addons: ...Apply your changes of
daffodil.yaml.bashkubectl apply -f daffodil.yamlThe response looks like this:
bashshoot.core.gardener.cloud/daffodil configuredTrigger the deletion.
bashkubectl delete shoot daffodil --wait=falseThe response looks like this:
bashshoot.core.gardener.cloud "daffodil" deletedIt takes 5–10 minutes to delete the cluster. To watch the progress, get all shoots and use the
-wflag.bashkubectl get shoots -w
Get kubeconfig for a Shoot Cluster
To get the kubeconfig for a shoot cluster in Gardener from the command line, use one of the following methods:
Using
shoots/admin/kubeconfigSubresource:- You can obtain a temporary admin
kubeconfigby using theshoots/admin/kubeconfigsubresource. Detailed instructions can be found in the Gardener documentation here.
- You can obtain a temporary admin
Using
gardenctlandgardenlogin:gardenctlsimplifies targeting Shoot clusters. It automatically downloads akubeconfigthat uses thegardenloginkubectl auth plugin. This plugin transparently managesShootcluster authentication and certificate renewal without embedding any credentials in the kubeconfig file.- When installing
gardenctlvia Homebrew or Chocolatey,gardenloginwill be installed as a dependency. Refer to the installation instructions here. - Both tools can share the same configuration. To set up the tools, refer to the documentation here.
- To get the
kubeconfig, use either thetargetorkubeconfigcommand:Target Command: This command targets the specified Shoot cluster and automatically downloads the
kubeconfig.bashgardenctl target --garden landscape-dev --project my-project --shoot my-shootTo set the
KUBECONFIGenvironment variable to point to the downloadedkubeconfigfile, use the following command (for bash):basheval $(gardenctl kubectl-env bash)Detailed instructions can be found here.
Kubeconfig Command: This command directly downloads the
kubeconfigfor the specified Shoot cluster and outputs it in raw format.bashgardenctl kubeconfig --garden landscape-dev --project my-project --shoot my-shoot --raw
- When installing