Gardener

getting-started
https://gardener.cloud/docs/getting-started/

Releases
https://github.com/gardener/gardener/releases

Introduction
https://www.youtube.com/watch?v=PQMVVeYRzYU

Get vGarden cluster credentials

export KUBECONFIG=~/.kube/api.v.gardener.stage.example.com.yaml
kubectl get shoots -A

Create shoot
https://github.com/gardener/gardener/blob/master/example/90-shoot.yaml

# cat my-botany1.yaml
apiVersion: core.gardener.cloud/v1beta1
kind: Shoot
metadata:
  name: my-botany1
  namespace: garden-dev
spec:
  secretBindingName: gardenshoot1
  cloudProfileName: ch-zh1
  region: ch-zh1
  purpose: production
  provider:
    type: openstack
    infrastructureConfig:
      apiVersion: openstack.provider.extensions.gardener.cloud/v1alpha1
      kind: InfrastructureConfig
      floatingPoolName: public
      networks:
        workers: 10.250.10.0/16
    controlPlaneConfig:
      apiVersion: openstack.provider.extensions.gardener.cloud/v1alpha1
      kind: ControlPlaneConfig
      loadBalancerProvider: amphora
    workers:
    - name: worker
      cri:
        name: containerd
      minimum: 2
      maximum: 5
      machine:
        type: e1.xlarge
        image:
          name: ubuntu
          version: 22.04.20231101
      zones:
        - ch-zh1-az1
        - ch-zh1-az2
  kubernetes:
    version: 1.29.4
  dns:
    domain: my-botany1.dev.gardener.example.com
  extensions: []
  networking:
    type: calico # {calico,cilium}
    ipFamilies:
    - IPv4
    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
  monitoring:
    alerting:
      emailReceivers:
      - foo@example.com
  addons:
    nginxIngress:
      enabled: false
    kubernetesDashboard:
      enabled: false
 
kubectl apply -f my-botany1.yaml

Delete shoot
https://gardener.cloud/docs/dashboard/project-operations/

kubectl annotate shoots -n garden-dev my-botany1 confirmation.gardener.cloud/deletion="true"
kubectl delete shoots my-botany1 -n garden-de

Access shoot cluster

export NAMESPACE=garden-dev
export SHOOT_NAME=my-botany1
 
kubectl create \
    -f <(printf '{"spec":{"expirationSeconds":3600}}') \
    --raw /apis/core.gardener.cloud/v1beta1/namespaces/${NAMESPACE}/shoots/${SHOOT_NAME}/adminkubeconfig | \
    jq -r ".status.kubeconfig" | \
    base64 --decode > ~/.kube/${NAMESPACE}--${SHOOT_NAME}-external.yaml
 
# access shoot
export KUBECONFIG=~/.kube/${NAMESPACE}--${SHOOT_NAME}-external.yaml
kubectl get nodes

Links
https://gardener.cloud/
https://github.com/gardener/gardener
https://www.youtube.com/@GardenerProject/videos
https://github.com/gardener/gardener/tree/master/example