From 81b4bb0717d97e3b236aa5aec211e548685088ea Mon Sep 17 00:00:00 2001 From: Ciprian Hacman Date: Mon, 19 Sep 2022 09:57:24 +0300 Subject: [PATCH] hetzner: Move out of alpha and drop feature flag --- README-ES.md | 221 -------------------- README.md | 4 +- cmd/kops/create_cluster_integration_test.go | 6 - cmd/kops/integration_test.go | 6 - docs/cli/kops_create_cluster.md | 2 +- docs/getting_started/digitalocean.md | 5 +- docs/getting_started/gce.md | 2 +- docs/getting_started/hetzner.md | 17 +- docs/getting_started/openstack.md | 2 +- docs/index.md | 2 +- mkdocs.yml | 6 +- pkg/clouds/supported.go | 4 +- pkg/featureflag/featureflag.go | 2 - upup/pkg/fi/cloudup/apply_cluster.go | 4 +- 14 files changed, 25 insertions(+), 258 deletions(-) delete mode 100644 README-ES.md diff --git a/README-ES.md b/README-ES.md deleted file mode 100644 index c083c5d1ec..0000000000 --- a/README-ES.md +++ /dev/null @@ -1,221 +0,0 @@ -# kOps - Operaciones con Kubernetes - -[![Go Report Card](https://goreportcard.com/badge/k8s.io/kops)](https://goreportcard.com/report/k8s.io/kops) [![GoDoc Widget]][GoDoc] - -[GoDoc]: https://pkg.go.dev/k8s.io/kops -[GoDoc Widget]: https://godoc.org/k8s.io/kops?status.svg - - -La forma más fácil de poner en marcha un cluster Kubernetes en producción. - - -## ¿Qué es kOps? - -Queremos pensar que es algo como `kubectl` para clusters. - -`kops` ayuda a crear, destruir, mejorar y mantener un grado de producción, altamente -disponible, desde las líneas de commando de Kubernetes clusters. AWS (Amazon Web Services) -está oficialmente soportado actualmente, con GCE en soporte beta , y VMware vSphere -en alpha, y otras plataformas planeadas. - - -## ¿Puedo verlo en acción? - -

- - - -

- - -## Lanzando un anfitrión de Kubernetes cluster en AWS o GCE - -Para reproducir exactamente el demo anterior, visualizalo en el [tutorial](/docs/getting_started/aws.md) para -lanzar un anfitrión de Kubernetes cluster en AWS. - -Para instalar un Kubernetes cluster en GCE por fabor siga esta [guide](/docs/getting_started/gce.md). - - -## Caracteristicas - -* Automatiza el aprovisionamiento de Kubernetes clusters en [AWS](/docs/getting_started/aws.md) y [GCE](/docs/getting_started/gce.md) -* Un Despliegue Altamente Disponible (HA) Kubernetes Masters -* Construye en un modelo de estado sincronizado para **dry-runs** y **idempotency** automático -* Capacidad de generar [Terraform](/docs/terraform.md) -* Soporta un Kubernetes personalizado [add-ons](/docs/operations/addons.md) -* Línea de commando [autocompletion](/docs/cli/kops_completion.md) -* YAML Archivo de Manifiesto Basado en API [Configuration](/docs/manifests_and_customizing_via_api.md) -* [Templating](/docs/cluster_template.md) y ejecutar modos de simulacro para crear - Manifiestos -* Escoge de ocho proveedores CNI diferentes [Networking](/docs/networking.md) -* Capacidad para añadir contenedores, como enganches, y archivos a nodos vía [cluster manifest](/docs/cluster_spec.md) - - -## Documentación - -La documentación está en el directorio `/docs`, [and the index is here.](docs/README.md) - - -## Compatibilidad de Kubernetes con el Lanzamiento - - -### Soporte de la Versión Kubernetes - -kOps está destinado a ser compatible con versiones anteriores. Siempre es recomendado utilizar la -última versión de kOps con cualquier versión de Kubernetes que estés utilizando. Siempre -utilize la última versión de kOps. - -Una excepción, en lo que respecta a la compatibilidad, kOps soporta el equivalente a -un número de versión menor de Kubernetes. Una versión menor es el segundo dígito en el -número de versión. la versión de kOps 1.8.0 tiene una versión menor de 8. La numeración -sigue la especificación de versión semántica, MAJOR.MINOR.PATCH. - -Por ejemplo kOps, 1.8.0 no soporta Kubernetes 1.9.2, pero kOps 1.9.0 -soporta Kubernetes 1.9.2 y versiones anteriores de Kubernetes. Sólo cuando coincide la versión -menor de kOps, La versión menor de kubernetes hace que kOps soporte oficialmente -el lanzamiento de kubernetes. kOps no impide que un usuario instale versiones -no coincidentes de K8, pero las versiones de Kubernetes siempre requieren kOps para instalar -versiones de componentes como docker, probado contra la versión -particular de Kubernetes. - -#### Compatibilidad Matrix - -| kOps version | k8s 1.19.x | k8s 1.20.x | k8s 1.21.x | k8s 1.22.x | k8s 1.23.x | -|---------------|------------|------------|------------|------------|------------| -| 1.23.0 | ✔ | ✔ | ✔ | ✔ | ✔ | -| 1.22.x | ✔ | ✔ | ✔ | ✔ | ⚫ | -| ~~1.21.x~~ | ✔ | ✔ | ✔ | ⚫ | ⚫ | -| ~~1.20.x~~ | ✔ | ✔ | ⚫ | ⚫ | ⚫ | -| ~~1.19.x~~ | ✔ | ⚫ | ⚫ | ⚫ | ⚫ | - -Utilice la última versión de kOps para todas las versiones de Kubernetes, con la advertencia de que las versiones más altas de Kubernetes no cuentan con el respaldo _oficial_ de kOps. - -### Cronograma de Lanzamiento de kOps - -Este proyecto no sigue el cronograma de lanzamiento de Kubernetes. `kops` tiene como objetivo -proporcionar una experiencia de instalación confiable para Kubernetes, y, por lo general, se lanza -aproximadamente un mes después de la publicación correspondiente de Kubernetes. Esta vez, permite que el proyecto Kubernetes resuelva los problemas que presenta la nueva versión y garantiza que podamos admitir las funciones más recientes. kOps lanzará pre-lanzamientos alfa y beta para las personas que están ansiosas por probar la última versión de Kubernetes. -Utilice únicamente lanzamientos pre-GA kOps en ambientes que puedan tolerar las peculiaridades de las nuevas versiones, e informe cualquier problema que surja. - - -## Instalación - -### Requisito previo - -`kubectl` es requerido, visualize [here](http://kubernetes.io/docs/user-guide/prereqs/). - - -### OSX desde Homebrew - -```console -brew update && brew install kops -``` - -El binario `kops` también está disponible a través de nuestro [releases](https://github.com/kubernetes/kops/releases/latest). - - -### Linux - -```console -curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64 -chmod +x kops-linux-amd64 -sudo mv kops-linux-amd64 /usr/local/bin/kops -``` - - -## Historial de Versiones - -visualize el [releases](https://github.com/kubernetes/kops/releases) para más -información sobre cambios entre lanzamientos. - - -## Involucrarse y Contribuir - -¿Estás interesado en contribuir con kOps? Nosotros, los mantenedores y la comunidad, -nos encantaría sus sugerencias, contribuciones y ayuda. -Tenemos una guía de inicio rápido en [adding a feature](/docs/development/adding_a_feature.md). Además, se -puede contactar a los mantenedores en cualquier momento para obtener más información sobre -cómo involucrarse. -Con el interés de involucrar a más personas con kOps, estamos comenzando a -etiquetar los problemas con `good-starter-issue`. Por lo general, se trata de problemas que tienen -un alcance menor, pero que son buenas maneras de familiarizarse con la base de código. - -También alentamos a TODOS los participantes activos de la comunidad a actuar como si fueran -mantenedores, incluso si no tiene permisos de escritura "oficiales".Este es un -esfuerzo de la comunidad, estamos aquí para servir a la comunidad de Kubernetes. -Si tienes un interés activo y quieres involucrarte, ¡tienes verdadero poder! -No asuma que las únicas personas que pueden hacer cosas aquí son los "mantenedores". - -También nos gustaría agregar más mantenedores "oficiales", así que -¡muéstranos lo que puedes hacer! - - -Lo que esto significa: - -__Issues__ -* Ayude a leer y clasifique los problemas, ayúdelo cuando sea posible. -* Señale los problemas que son duplicados, desactualizados, etc. - - Incluso si no tiene permisos para etiquetar, tome nota y etiquete mantenedores (`/close`,`/dupe #127`). - -__Pull Requests__ -* Lee y revisa el código. Deja comentarios, preguntas y críticas (`/lgtm` ). -* Descargue, compile y ejecute el código y asegúrese de que las pruebas pasen (make test). - - También verifique que la nueva característica parezca cuerda, siga los mejores patrones arquitectónicos e incluya pruebas. - -Este repositorio usa los bots de Kubernetes. Hay una lista completa de los commandos [aqui](https://go.k8s.io/bot-commands). - - -## Horas de Oficina - -Los mantenedores de kOps reservaron una hora cada dos semanas para **horas de oficina** públicas. Los horarios de oficina se alojan en un [zoom video chat](https://zoom.us/j/97072789944?pwd=VVlUR3dhN2h5TEFQZHZTVVd4SnJUdz09) los viernes en [5 pm UTC/12 noon ET/9 am US Pacific](http://www.worldtimebuddy.com/?pl=1&lid=100,5,8,12), en semanas impares numeradas. Nos esforzamos por conocer y ayudar a los programadores, ya sea trabajando en `kops` o interesados en conocer más sobre el proyecto. - - -### Temas Abiertos en Horas de Oficina - -Incluye pero no limitado a: - -- Ayuda y guía para aquellos que asisten, que están interesados en contribuir. -- Discuta el estado actual del proyecto kOps, incluidas las versiones. -- Diseña estrategias para mover `kops` hacia adelante. -- Colabora sobre PRs abiertos y próximos. -- Presenta demos. - -Esta vez se enfoca en los programadores, aunque nunca rechazaremos a un participante cortés. Pase por alto, incluso si nunca ha instalado kOps. - -Le recomendamos que se comunique **de antemano** si planea asistir. Puedes unirte a cualquier sesión y no dudes en agregar un elemento a la [agenda](https://docs.google.com/document/d/12QkyL0FkNbWPcLFxxRGSPt_tNPBHbmni3YLY-lHny7E/edit) donde rastreamos notas en el horario de oficina. - -Los horarios de oficina están alojados en una [Zoom](https://zoom.us/j/97072789944?pwd=VVlUR3dhN2h5TEFQZHZTVVd4SnJUdz09) video conferencia, celebrada los viernes a las [5 pm UTC/12 noon ET/9 am US Pacific](http://www.worldtimebuddy.com/?pl=1&lid=100,5,8,12) cada otra semana impare numerada. - -Puede verificar su número de semana utilizando: - -```bash -date +%V -``` - -Los mantenedores y otros miembros de la comunidad están generalmente disponibles en [kubernetes slack](https://github.com/kubernetes/community/blob/master/communication.md#social-media) en [#kops](https://kubernetes.slack.com/messages/kops/), ¡así que ven y conversa con nosotros sobre cómo los kOps pueden ser mejores para ti! - - -## GitHub Issues - - -### Errores - -Si cree que ha encontrado un error, siga las instrucciones a continuación. - -- Dedique una pequeña cantidad de tiempo a prestar la debida diligencia al rastreador de problemas. Tu problema puede ser un duplicado. -- Establezca la `-v 10` línea de commando y guarde la salida de los registros. Por favor pegue esto en su issue. -- Note the version of kOps you are running (from `kops version`), and the command line options you are using. -- Abra un [new issue](https://github.com/kubernetes/kops/issues/new). -- Recuerde que los usuarios pueden estar buscando su issue en el futuro, por lo que debe darle un título significativo para ayudar a otros. -- No dude en comunicarse con la comunidad de kOps en [kubernetes slack](https://github.com/kubernetes/community/blob/master/communication.md#social-media). - - -### Caracteristicas - -También usamos el rastreador de problemas para rastrear características. Si tiene una idea para una función, o cree que puede ayudar a que los kOps se vuelvan aún más impresionantes, siga los pasos a continuación. - -- Abra un [new issue](https://github.com/kubernetes/kops/issues/new). -- Recuerde que los usuarios pueden estar buscando su issue en el futuro, por lo que debe darle un título significativo para ayudar a otros. -- Defina claramente el caso de uso, usando ejemplos concretos. P EJ: Escribo `esto` y kOps hace `eso`. -- Algunas de nuestras características más grandes requerirán algún diseño. Si desea incluir un diseño técnico para su función, inclúyalo en el problema. -- Después de que la nueva característica sea bien comprendida, y el diseño acordado, podemos comenzar a codificar la característica. Nos encantaría que lo codificaras. Por lo tanto, abra una **WIP** *(trabajo en progreso)* solicitud de extracción, y que tenga una feliz codificación. diff --git a/README.md b/README.md index 7b02262856..44d6f156b2 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ We like to think of it as `kubectl` for clusters. `kops` will not only help you create, destroy, upgrade and maintain production-grade, highly available, Kubernetes cluster, but it will also provision the necessary cloud infrastructure. -AWS (Amazon Web Services) is currently officially supported, with DigitalOcean, GCE, and OpenStack in beta support, and Azure and AliCloud in alpha. +AWS (Amazon Web Services) and GCE (Google Cloud Platform) are currently officially supported, with DigitalOcean, Hetzner and OpenStack in beta support, and Azure in alpha. ## Can I see it in action? @@ -26,7 +26,7 @@ AWS (Amazon Web Services) is currently officially supported, with DigitalOcean,

-## Installing and launching a Kubernetes cluster hosted on AWS, GCE, DigitalOcean or OpenStack +## Installing and launching a Kubernetes cluster hosted on AWS, GCE, DigitalOcean, Hetzner, OpenStack, Azure See [Getting Started](https://kops.sigs.k8s.io/getting_started/install/) diff --git a/cmd/kops/create_cluster_integration_test.go b/cmd/kops/create_cluster_integration_test.go index 799f918bd4..16d3fbcfb8 100644 --- a/cmd/kops/create_cluster_integration_test.go +++ b/cmd/kops/create_cluster_integration_test.go @@ -58,12 +58,6 @@ func TestCreateClusterMinimal(t *testing.T) { // TestCreateClusterHetzner runs kops create cluster minimal.k8s.local --zones fsn1 func TestCreateClusterHetzner(t *testing.T) { t.Setenv("HCLOUD_TOKEN", "REDACTED") - featureflag.ParseFlags("+Hetzner") - unsetFeatureFlags := func() { - featureflag.ParseFlags("-Hetzner") - } - defer unsetFeatureFlags() - runCreateClusterIntegrationTest(t, "../../tests/integration/create_cluster/ha_hetzner", "v1alpha2") runCreateClusterIntegrationTest(t, "../../tests/integration/create_cluster/minimal_hetzner", "v1alpha2") } diff --git a/cmd/kops/integration_test.go b/cmd/kops/integration_test.go index 51ea930e2e..4d30f79701 100644 --- a/cmd/kops/integration_test.go +++ b/cmd/kops/integration_test.go @@ -276,12 +276,6 @@ func TestMinimal_v1_26(t *testing.T) { // TestHetzner runs the test on a minimum configuration func TestHetzner(t *testing.T) { t.Setenv("HCLOUD_TOKEN", "REDACTED") - featureflag.ParseFlags("+Hetzner") - unsetFeatureFlags := func() { - featureflag.ParseFlags("-Hetzner") - } - defer unsetFeatureFlags() - newIntegrationTest("minimal.k8s.local", "minimal_hetzner"). runTestTerraformHetzner(t) } diff --git a/docs/cli/kops_create_cluster.md b/docs/cli/kops_create_cluster.md index 7c2d97f558..f8efb31008 100644 --- a/docs/cli/kops_create_cluster.md +++ b/docs/cli/kops_create_cluster.md @@ -73,7 +73,7 @@ kops create cluster [CLUSTER] [flags] --authorization string Authorization mode: AlwaysAllow or RBAC (default "RBAC") --bastion Enable a bastion instance group. Only applies to private topology. --channel string Channel for default versions and configuration to use (default "stable") - --cloud string Cloud provider to use - aws, digitalocean, gce, openstack + --cloud string Cloud provider to use - aws, digitalocean, gce, hetzner, openstack --cloud-labels string A list of key/value pairs used to tag all instance groups (for example "Owner=John Doe,Team=Some Team"). --container-runtime string Container runtime to use: containerd, docker --disable-subnet-tags Disable automatic subnet tagging diff --git a/docs/getting_started/digitalocean.md b/docs/getting_started/digitalocean.md index d8ee3cf059..f16ec47993 100644 --- a/docs/getting_started/digitalocean.md +++ b/docs/getting_started/digitalocean.md @@ -1,6 +1,7 @@ # Getting Started with kOps on DigitalOcean -**WARNING**: digitalocean support on kOps promoted to **beta** currently meaning it is subject to change, so please use with caution. +**WARNING**: digitalocean support on kOps promoted to **beta**, which means it is in good shape and could be used for production. +However, it is not as rigorously tested as the stable cloud providers and there are some features that might be missing. ## Requirements @@ -94,6 +95,6 @@ kOps for DigitalOcean currently does not support these features: * kops terraform support for DO -# Next steps +## Next steps Now that you have a working kOps cluster, read through the [recommendations for production setups guide](production.md) to learn more about how to configure kOps for production workloads. \ No newline at end of file diff --git a/docs/getting_started/gce.md b/docs/getting_started/gce.md index 1d5748a9a8..6978eae6e3 100644 --- a/docs/getting_started/gce.md +++ b/docs/getting_started/gce.md @@ -185,6 +185,6 @@ the command. When run without `--yes` it shows a preview of the objects it will After you've double-checked you're deleting exactly what you want to delete, run `kops delete cluster simple.k8s.local --yes`. -# Next steps +## Next steps Now that you have a working kOps cluster, read through the [recommendations for production setups guide](production.md) to learn more about how to configure kOps for production workloads. \ No newline at end of file diff --git a/docs/getting_started/hetzner.md b/docs/getting_started/hetzner.md index 6bbab2044e..587dedf54a 100644 --- a/docs/getting_started/hetzner.md +++ b/docs/getting_started/hetzner.md @@ -1,7 +1,7 @@ # Getting Started with kOps on Hetzner Cloud -**WARNING**: Hetzner Cloud support on kOps is currently in **alpha**, meaning it is subject to change, so please use with caution. -The original issue ticket is [#8983](https://github.com/kubernetes/kops/issues/8983). +**WARNING**: Hetzner Cloud support on kOps is currently in **beta**, which means it is in good shape and could be used for production. +However, it is not as rigorously tested as the stable cloud providers and there are some features that might be missing. ## Requirements * kOps version >= 1.24 @@ -15,7 +15,6 @@ The original issue ticket is [#8983](https://github.com/kubernetes/kops/issues/8 It is important to set the following environment variables: ```bash -export KOPS_FEATURE_FLAGS=Hetzner export HCLOUD_TOKEN= export S3_ENDPOINT= export S3_ACCESS_KEY_ID= @@ -46,10 +45,17 @@ kops create cluster --name=my-cluster.example.k8s.local \ --node-size cpx31 kops update cluster --name=my-cluster.example.k8s.local --yes +# update a cluster +kops update cluster --name=my-cluster.example.k8s.local +kops update cluster --name=my-cluster.example.k8s.local --yes +kops rolling-update cluster --name=my-cluster.example.k8s.local +kops rolling-update cluster --name=my-cluster.example.k8s.local --yes + # validate a cluster kops validate cluster --name=my-cluster.example.k8s.local # delete a cluster +kops delete cluster --name=my-cluster.example.k8s.local kops delete cluster --name=my-cluster.example.k8s.local --yes # export kubecfg @@ -63,10 +69,9 @@ kops delete cluster --name=my-cluster.example.k8s.local --yes kOps for Hetzner Cloud currently does not support the following features: -* Multiple SSH keys * Autoscaling using [Cluster Autoscaler](https://github.com/hetznercloud/autoscaler) -* [Terraform](https://github.com/hetznercloud/terraform-provider-hcloud) support +* Terraform support using [terraform-provider-hcloud](https://github.com/hetznercloud/terraform-provider-hcloud) -# Next steps +## Next steps Now that you have a working kOps cluster, read through the recommendations for [production setups guide](production.md) to learn more about how to configure kOps for production workloads. diff --git a/docs/getting_started/openstack.md b/docs/getting_started/openstack.md index bc10eb0018..77966f3a4a 100644 --- a/docs/getting_started/openstack.md +++ b/docs/getting_started/openstack.md @@ -218,6 +218,6 @@ spec: insecureSkipVerify: true ``` -# Next steps +## Next steps Now that you have a working kOps cluster, read through the [recommendations for production setups guide](production.md) to learn more about how to configure kOps for production workloads. diff --git a/docs/index.md b/docs/index.md index ba484ca5e9..15bccccf95 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,7 +18,7 @@ We like to think of it as `kubectl` for clusters. `kops` will not only help you create, destroy, upgrade and maintain production-grade, highly available, Kubernetes cluster, but it will also provision the necessary cloud infrastructure. -[AWS](getting_started/aws.md) (Amazon Web Services) is currently officially supported, with [DigitalOcean](getting_started/digitalocean.md), [GCE](getting_started/gce.md) and [OpenStack](getting_started/openstack.md) in beta support, and [Azure](getting_started/azure.md) in alpha. +[AWS](getting_started/aws.md) (Amazon Web Services) and [GCE](getting_started/gce.md) (Google Cloud Platform) are currently officially supported, with [DigitalOcean](getting_started/digitalocean.md), [Hetzner](getting_started/hetzner.md) and [OpenStack](getting_started/openstack.md) in beta support, and [Azure](getting_started/azure.md) in alpha. ## Can I see it in action? diff --git a/mkdocs.yml b/mkdocs.yml index 841c99e2f5..c8b0ef9c29 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -38,11 +38,11 @@ nav: - Getting Started: - Installing: "getting_started/install.md" - Deploying to AWS: "getting_started/aws.md" - - Deploying to GCE - Alpha: "getting_started/gce.md" - - Deploying to OpenStack - Beta: "getting_started/openstack.md" + - Deploying to GCE: "getting_started/gce.md" - Deploying to Digital Ocean - Beta: "getting_started/digitalocean.md" + - Deploying to Hetzner - Beta: "getting_started/hetzner.md" + - Deploying to OpenStack - Beta: "getting_started/openstack.md" - Deploying to Azure - Alpha: "getting_started/azure.md" - - Deploying to Hetzner - Alpha: "getting_started/hetzner.md" - Deploying to Spot Ocean - Alpha: "getting_started/spot-ocean.md" - kOps Commands: "getting_started/commands.md" - kOps Arguments: "getting_started/arguments.md" diff --git a/pkg/clouds/supported.go b/pkg/clouds/supported.go index ac03f5d7cb..29b1c15692 100644 --- a/pkg/clouds/supported.go +++ b/pkg/clouds/supported.go @@ -26,14 +26,12 @@ func SupportedClouds() []kops.CloudProviderID { kops.CloudProviderAWS, kops.CloudProviderDO, kops.CloudProviderGCE, + kops.CloudProviderHetzner, kops.CloudProviderOpenstack, } if featureflag.Azure.Enabled() { clouds = append(clouds, kops.CloudProviderAzure) } - if featureflag.Hetzner.Enabled() { - clouds = append(clouds, kops.CloudProviderHetzner) - } return clouds } diff --git a/pkg/featureflag/featureflag.go b/pkg/featureflag/featureflag.go index 691508f4e4..6405af1365 100644 --- a/pkg/featureflag/featureflag.go +++ b/pkg/featureflag/featureflag.go @@ -90,8 +90,6 @@ var ( Karpenter = new("Karpenter", Bool(false)) // ImageDigest remaps all manifests with image digests ImageDigest = new("ImageDigest", Bool(true)) - // Hetzner toggles the Hetzner Cloud support. - Hetzner = new("Hetzner", Bool(false)) ) // FeatureFlag defines a feature flag diff --git a/upup/pkg/fi/cloudup/apply_cluster.go b/upup/pkg/fi/cloudup/apply_cluster.go index fd7cada9fe..f4f950567f 100644 --- a/upup/pkg/fi/cloudup/apply_cluster.go +++ b/upup/pkg/fi/cloudup/apply_cluster.go @@ -427,9 +427,7 @@ func (c *ApplyClusterCmd) Run(ctx context.Context) error { case kops.CloudProviderHetzner: { - if !featureflag.Hetzner.Enabled() { - return fmt.Errorf("Hetzner Cloud support is currently alpha, and is feature-gated. export KOPS_FEATURE_FLAGS=Hetzner") - } + // Hetzner Cloud support is currently in beta } case kops.CloudProviderDO: