diff --git a/content/docs/en/cluster/addons/essential-addons.mdx b/content/docs/en/cluster/addons/essential-addons.mdx new file mode 100644 index 0000000000..9402fec31d --- /dev/null +++ b/content/docs/en/cluster/addons/essential-addons.mdx @@ -0,0 +1,55 @@ +--- +title: Essential addons +sidebar_label: Essential addons +sidebar_position: 9 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +Essential addons are the infrastructure glue every cluster needs to function under SleakOps: networking, autoscaling, and access control. Unlike the optional addons you pick from the Addons list, these five are always present — SleakOps installs them automatically on every managed cluster instead of waiting for you to add them. + + + Addons list showing the five essential addons (all Installed) alongside a mix of installed, deprecated, and not-yet-installed optional addons + + +They show in the Addons list like any other addon card, with no special badge or visual marker — you recognize them by name and description, not by a distinct treatment. + +## The five essential addons + +| Name | What it does | +|---|---| +| Metrics Server | Collects resource metrics from kubelets and exposes them through the Kubernetes Metrics API, enabling Horizontal Pod Autoscaling and `kubectl top`. | +| ExternalDNS | Synchronizes exposed Kubernetes Services and Ingresses with DNS providers (Route53), keeping cluster DNS records up to date automatically. | +| Karpenter | A Kubernetes node autoscaler that provisions right-sized compute capacity in response to unschedulable pods, improving efficiency and reducing cost. | +| AWS Auth | Wires SleakOps IAM roles into the cluster's `aws-auth` ConfigMap and the SleakOps RBAC ClusterRoles, enabling SleakOps integration and role-based access. | +| Load Balancer | The AWS Load Balancer Controller manages Application Load Balancers for Kubernetes Ingresses, plus the public and private IngressClasses used to route external traffic. | + +## Behavior on imported clusters + +On a managed cluster, SleakOps provisions and owns all five essential addons from day one. On an imported cluster, there's nothing to provision — the client's infrastructure already runs its own version of each piece — so instead of installing them, SleakOps adopts them from what's already there, one at a time, as you bring resources under management. + +The Load Balancer addon is one concrete example: when a cluster is imported, its Addon row is created directly from the public and private IngressClass names discovered in the import payload, without running any Pulumi provisioning — the client already runs their own ALB controller, so SleakOps only needs to record what exists. + +AWS Auth has the most involved import-time behavior. On a managed cluster, SleakOps owns the entire `aws-auth` ConfigMap's `mapRoles`. On an imported cluster, the module instead runs in merge mode: it reads the client's live `aws-auth` ConfigMap and merges in only the SleakOps-required role entries, deduplicated by role ARN with the SleakOps entries winning on conflict — every pre-existing client entry is preserved. This merge is idempotent: reading back an already-merged ConfigMap and running it again doesn't duplicate entries. + +## Restrictions + +**Configuration** — an essential addon's configuration form is read-only on a managed cluster, since SleakOps owns that configuration; it becomes editable on an imported cluster, since there the configuration reflects what the client already had running, which is theirs to change. Note that most essential addons (Metrics Server, ExternalDNS, Karpenter, AWS Auth) have no configurable fields at all — Load Balancer is the one with an actual schema (its public and private IngressClass names), so it's also the one where the read-only lock is visible: + + + Load Balancer addon detail view on a managed cluster, with its IngressClass name fields locked + + +**Deletion** — essential addons cannot be deleted at all on a managed cluster: they're permanent for the cluster's lifetime and are only torn down automatically when the cluster itself is destroyed. On an imported cluster, they can be deleted individually like any other adopted resource, subject to the same dependency guard as any addon (you can't delete one that another addon depends on). This restriction is gated by the cluster's type, not by the requesting user's role. diff --git a/content/docs/en/cluster/addons/essential-addons/essential-addon-lb-detail.png b/content/docs/en/cluster/addons/essential-addons/essential-addon-lb-detail.png new file mode 100644 index 0000000000..a464dc494d Binary files /dev/null and b/content/docs/en/cluster/addons/essential-addons/essential-addon-lb-detail.png differ diff --git a/content/docs/en/cluster/addons/essential-addons/essential-addons-list.png b/content/docs/en/cluster/addons/essential-addons/essential-addons-list.png new file mode 100644 index 0000000000..861e05394d Binary files /dev/null and b/content/docs/en/cluster/addons/essential-addons/essential-addons-list.png differ diff --git a/content/docs/en/cluster/addons/import-addons.mdx b/content/docs/en/cluster/addons/import-addons.mdx new file mode 100644 index 0000000000..53758f2833 --- /dev/null +++ b/content/docs/en/cluster/addons/import-addons.mdx @@ -0,0 +1,69 @@ +--- +title: Import and export addons +sidebar_label: Import and export addons +sidebar_position: 8 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +Addons can move in and out of SleakOps in two ways: importing a JSON definition exported from another cluster, or discovering and adopting a Helm release already running in the cluster. Both buttons sit on the Addons list next to **Add custom addon**, and both only appear when your company has the generic (custom Helm chart) addon type registered. From there the two flows differ in scope: **Import from JSON** and **Export JSON** work with any addon type registered in the cluster — SleakOps Managed (Grafana, KEDA, …) or custom — while **Import from cluster** always adopts the release as a custom addon, since discovery has no way to know which managed type (if any) a live Helm release corresponds to. + +Both flows require your company to have the import feature enabled (`infra_import.addon`) and require an **admin** user — creating, updating, or exporting an addon is admin-only on the backend. + + + Addons list showing Import from cluster and Import from JSON next to Add custom addon + + +## Import from JSON + +Click **Import from JSON** to paste a definition exported from another cluster: + + + Import addon from JSON dialog with a textarea for pasting the exported definition + + +Paste the JSON and click **Import**. SleakOps validates it before opening the form: + +- Invalid JSON: **"Invalid JSON. Paste a valid addon export."** +- Missing shape: **'The JSON must include a string "addon_type" and an object "values".'** +- A type the cluster doesn't have registered: **`Addon type "" is not available in this cluster.`** + +Once it validates, the matching addon's create form opens pre-filled from the pasted `values` (and `name`, if present) — nothing is locked, so you can change anything before installing. The submit button reads **Import** instead of **Install** as a reminder that these are starting values, not a fresh default configuration. + +This pairs with **Export JSON**, available on any installed addon's detail view — SleakOps Managed or custom — once it's in `created` state (same access requirement). It copies the addon's portable JSON to the clipboard and downloads it as `.addon.json` — that file is what you paste into **Import from JSON** on the destination cluster. + +## Import from cluster + +Click **Import from cluster** to discover the Helm releases already running in this cluster: + + + Import from cluster dialog listing discovered Helm releases with a Use button each + + +Each release shows its name, namespace, chart, and version. While discovery runs: **"Loading releases…"**; if it can't reach the cluster: **"Could not load Helm releases from the cluster."**; if none are found: **"No Helm releases found in this cluster."** + +Click **Use** on a release to pre-fill the generic addon form with its release name, namespace, chart, version, and current Helm values. Unlike the JSON flow — which can target any addon type — this always creates a custom (generic) addon, and it adopts a live resource rather than just starting from a set of values: the release name, namespace, chart, and version are locked (read-only) because they feed the underlying Pulumi import and must match what's actually running. **Repository URL** is the one field left blank and editable — the chart's repository URL can't be recovered from a live release, so you type it in yourself. + + + Generic addon form pre-filled from a discovered release, with release name, chart, version and namespace locked and Repository URL left blank + + +Click **Import** to adopt the release under SleakOps management. diff --git a/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster-form.png b/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster-form.png new file mode 100644 index 0000000000..f74b6ab6e3 Binary files /dev/null and b/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster-form.png differ diff --git a/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster.png b/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster.png new file mode 100644 index 0000000000..73bc009365 Binary files /dev/null and b/content/docs/en/cluster/addons/import-addons/import-addon-from-cluster.png differ diff --git a/content/docs/en/cluster/addons/import-addons/import-addon-json.png b/content/docs/en/cluster/addons/import-addons/import-addon-json.png new file mode 100644 index 0000000000..db644db798 Binary files /dev/null and b/content/docs/en/cluster/addons/import-addons/import-addon-json.png differ diff --git a/content/docs/en/cluster/addons/import-addons/import-addons-buttons.png b/content/docs/en/cluster/addons/import-addons/import-addons-buttons.png new file mode 100644 index 0000000000..3be62f9215 Binary files /dev/null and b/content/docs/en/cluster/addons/import-addons/import-addons-buttons.png differ diff --git a/content/docs/en/cluster/index.mdx b/content/docs/en/cluster/index.mdx index 33b86e2969..21802eb1c5 100644 --- a/content/docs/en/cluster/index.mdx +++ b/content/docs/en/cluster/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 6 title: Cluster pagination_next: environment/index --- diff --git a/content/docs/en/cluster/nodepools/importing-a-nodepool.mdx b/content/docs/en/cluster/nodepools/importing-a-nodepool.mdx new file mode 100644 index 0000000000..e26104190b --- /dev/null +++ b/content/docs/en/cluster/nodepools/importing-a-nodepool.mdx @@ -0,0 +1,59 @@ +--- +title: Importing a Node Pool +sidebar_label: Importing a Node Pool +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +SleakOps can bring an existing Karpenter node pool under management instead of creating one from scratch. Import discovers the live node pools running in your cluster and lets you adopt one as-is. + +## Prerequisites + +- An admin user in SleakOps. +- The import feature enabled for your company (`infra_import.nodepool`). +- The cluster must **not** be in import mode. **Import Node Pool** is only available on clusters SleakOps provisioned itself — it doesn't appear on imported clusters. + +## Discover and import + +From the Cluster Listing, select a cluster and access its Settings, then click on Node Pools. If the prerequisites above are met, an **Import Node Pool** button sits next to **Create**. + + + Node Pools section of a cluster, with the Import Node Pool button next to Create + + +### Discover + +Clicking it opens a dialog that lists the live Karpenter node pools running in the cluster that SleakOps doesn't manage yet: + +- While the search runs: **"Discovering Karpenter node pools…"** +- No unmanaged node pools found: **"No unmanaged Karpenter node pools were found in this cluster."** +- The cluster isn't reachable: an error asking you to check connectivity and try again. + +A node pool whose name doesn't match SleakOps' naming rules (lowercase alphanumerics with single hyphens, up to 50 characters) can't be adopted and appears disabled — the pool's name becomes the NodePool's name in SleakOps and can't be edited afterward, so names outside that pattern are filtered out of selection. + + + Import Node Pool dialog showing the discovered, unmanaged Karpenter node pools of the cluster + + +### Review + +Select a node pool and move to the next step: "Review the configuration mapped from the live pool. It is adopted exactly as it runs today, even where its values fall outside the SleakOps ranges." + +SleakOps pre-fills the same form used to create or edit a node pool with the values discovered on the live pool — architecture, node types, instance types, CPU and memory limits, node storage, and its dedicated taint if the pool has one. + +## After importing + +Once you confirm the import: "`` is being adopted by SleakOps. SleakOps is taking the live node pool under management. Its EC2NodeClass is cloned under the pool's name and existing nodes rotate gradually, respecting PodDisruptionBudgets and disruption budgets. You can follow the progress in the node pools list." diff --git a/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png b/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png new file mode 100644 index 0000000000..797fcbb437 Binary files /dev/null and b/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png differ diff --git a/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png b/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png new file mode 100644 index 0000000000..5bf31c2438 Binary files /dev/null and b/content/docs/en/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png differ diff --git a/content/docs/en/domain/import-domain.mdx b/content/docs/en/domain/import-domain.mdx new file mode 100644 index 0000000000..09df92dae8 --- /dev/null +++ b/content/docs/en/domain/import-domain.mdx @@ -0,0 +1,53 @@ +--- +title: Import a domain +sidebar_label: Import a domain +sidebar_position: 3 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +Domain import isn't a separate flow — it's a section inside the Environment creation form. Creating an Environment normally provisions a brand-new Route53 hosted zone; the import option lets you reuse one that already exists in the target AWS account instead. + +## Reuse an existing hosted zone + +On the Environment creation form, an admin-only **Use Existing Hosted Zone** toggle sits below the base fields (Name, Cluster, Domain): + +> Adopt a Route53 hosted zone that already exists in the target AWS account instead of creating a new one. The ACM certificate for the domain is adopted automatically when the account has one issued. + +Before you can search, three fields need to be filled in first — the Cluster determines which AWS account SleakOps searches: + +- No Cluster selected: **"Select a Cluster to search its account for existing hosted zones."** +- Cluster selected but Name or Domain still missing/invalid: **"Enter a Name and a valid Domain to search for existing hosted zones."** + +Once all three are filled in, turning the toggle on searches Route53 in that account: + +- A zone whose name matches the Domain field exactly is marked **Exact Match** (plus **Private** if it's a private zone) and listed first. +- Any other zones found in the account are listed below it, each with a **Private** badge if applicable. +- No zones at all: **"No hosted zones found in the account."** +- Zones exist but none match exactly: **"No hosted zone matches `` exactly. Pick one manually or create a new one."** + +Pick one with the radio cards — **Create a New Hosted Zone** (the default, SleakOps provisions a new zone) or one of the discovered zones. Changing the Cluster switches the target AWS account, so it discards any zone you'd already picked — a hosted zone ID only makes sense within the account it belongs to. + + + Environment creation form with the Use Existing Hosted Zone toggle on, showing an exact-match zone and another discovered zone + + +Once the Environment is created, the usual domain setup applies — see [Setup your Domains](/docs/domain/setup) and the [Domain Delegation Guide](/docs/domain/delegation) for what comes next. + +## FAQs + +
+ + ### What happens to the ACM certificate? + + It's adopted automatically, along with the hosted zone, when the target AWS account already has one issued for the domain. +
diff --git a/content/docs/en/domain/import-domain/domain-import-section.png b/content/docs/en/domain/import-domain/domain-import-section.png new file mode 100644 index 0000000000..56ecf5a7d4 Binary files /dev/null and b/content/docs/en/domain/import-domain/domain-import-section.png differ diff --git a/content/docs/en/domain/index.mdx b/content/docs/en/domain/index.mdx index 327eede72b..e8057b0314 100644 --- a/content/docs/en/domain/index.mdx +++ b/content/docs/en/domain/index.mdx @@ -1,6 +1,6 @@ --- sidebar_label: Domain -sidebar_position: 8 +sidebar_position: 9 --- # Domain Levels & Strategies diff --git a/content/docs/en/environment/index.mdx b/content/docs/en/environment/index.mdx index f23a83000d..9942c1b7fb 100644 --- a/content/docs/en/environment/index.mdx +++ b/content/docs/en/environment/index.mdx @@ -1,6 +1,6 @@ --- sidebar_label: Environment -sidebar_position: 6 +sidebar_position: 7 pagination_next: project/index --- diff --git a/content/docs/en/install-on-your-infra/import-accounts.mdx b/content/docs/en/install-on-your-infra/import-accounts.mdx new file mode 100644 index 0000000000..7b7559dd72 --- /dev/null +++ b/content/docs/en/install-on-your-infra/import-accounts.mdx @@ -0,0 +1,48 @@ +--- +title: Import an account +sidebar_label: Import an account +sidebar_position: 3 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Import an account + +Once a provider is running in import mode, connect each existing AWS account you want SleakOps to manage from its **Accounts & Networking** section. + +## Declare an existing AWS account + +1. In **Accounts & Networking**, click the **Install SleakOps in account** card. +2. Fill in the three fields: + + - **Account color** — pick one of the 8 preset swatches, or use the custom color picker to choose any other color. + - **Account name** — up to 20 characters (e.g. `payments-prod`). + - **AWS account ID** — the account's 12-digit numeric ID. + + + Import account form with color, name, and AWS account ID filled in + + +3. Click **Create account**. The account appears in the list on the left. + +## Run the CloudFormation stack + +1. Select the new account in the list. Its detail panel shows **CloudFormation not applied yet**. + + + Account detail panel showing the CloudFormation not applied yet state with the Open CloudFormation link + + +2. Click **Open CloudFormation** to launch the SleakOps CloudFormation stack. It opens in a new tab — run it signed in to this AWS account. + +## What happens next + +Once SleakOps receives the stack's callback, the account is ready for network configuration. diff --git a/content/docs/en/install-on-your-infra/import-accounts/account-awaiting-cfn.png b/content/docs/en/install-on-your-infra/import-accounts/account-awaiting-cfn.png new file mode 100644 index 0000000000..f017b0fd42 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-accounts/account-awaiting-cfn.png differ diff --git a/content/docs/en/install-on-your-infra/import-accounts/import-account-form.png b/content/docs/en/install-on-your-infra/import-accounts/import-account-form.png new file mode 100644 index 0000000000..bc7401a184 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-accounts/import-account-form.png differ diff --git a/content/docs/en/install-on-your-infra/import-cluster.mdx b/content/docs/en/install-on-your-infra/import-cluster.mdx new file mode 100644 index 0000000000..696135ce0f --- /dev/null +++ b/content/docs/en/install-on-your-infra/import-cluster.mdx @@ -0,0 +1,83 @@ +--- +title: Import the cluster +sidebar_label: Import the cluster +sidebar_position: 5 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Import the cluster + +With an account's network configured, SleakOps can register an existing EKS cluster of that account without recreating it — the last step of the import journey. + +## Prerequisites + +- An account already in **created** state, with its network configured ([Configure the network](/docs/install-on-your-infra/network-configuration)). + +## Install SleakOps in the cluster + +On the Clusters list, admins see an **Install SleakOps in Cluster** button next to **Create**. It only appears once at least one account is in created state. + + + Clusters list with the Install SleakOps in Cluster button next to Create + + +The button opens a 4-step dialog. + +### 1. Select account + +Choose the account of the EKS cluster. Only accounts in created state are listed. + +### 2. Select cluster + +SleakOps lists the EKS clusters it discovered in that account — name, Kubernetes version and status (ACTIVE, etc.). Pick the cluster to import. + + + Select cluster step listing the EKS clusters SleakOps discovered in the account, with one selected + + +### 3. Cluster endpoint access + +SleakOps operates inside the cluster through its Kubernetes API, so it needs to reach the cluster endpoint. If the endpoint is already public with an allowlist, SleakOps adds its own outbound addresses to it, keeping every entry already there. If the endpoint isn't publicly reachable, SleakOps enables it and restricts it to its own outbound addresses. + +Check **I allow SleakOps to access the endpoint of this cluster** to continue — it's required. + +### 4. Ingress classes + +Enter the **Private IngressClass name** (e.g. `alb-internal`) and **Public IngressClass name** (e.g. `alb-internet-facing`) of the cluster. SleakOps uses them to route private and public traffic — it can't autodetect them, since only the cluster's ALB controller configuration defines which one is which. + + + Ingress classes step with the Private and Public IngressClass name fields filled in + + +Click **Install** to start the import. + +## Installation progress + +While the import runs, SleakOps reads the cluster metadata (OIDC issuer), sets up the account VPN if it doesn't exist yet, creates the dedicated `sleakops` namespace, and saves the Load Balancer addon with the IngressClass names from step 4. + +You can close the dialog and follow the progress from the clusters list — it keeps refreshing while the import is in progress. + +Once it finishes, SleakOps can reach the cluster endpoint and is ready to operate inside it. From here, the cluster is ready to have its essential addons and nodepools managed. + +## The Imported badge + +An imported cluster shows an **Imported** badge on its card in the clusters list, distinguishing it from clusters SleakOps created from scratch. Hovering over the badge shows: "Pre-existing EKS cluster imported into SleakOps". + + + Clusters list showing an imported cluster with the Imported badge and its tooltip + diff --git a/content/docs/en/install-on-your-infra/import-cluster/cluster-imported-badge.png b/content/docs/en/install-on-your-infra/import-cluster/cluster-imported-badge.png new file mode 100644 index 0000000000..fb4b234137 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-cluster/cluster-imported-badge.png differ diff --git a/content/docs/en/install-on-your-infra/import-cluster/import-cluster-button.png b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-button.png new file mode 100644 index 0000000000..25d42233f7 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-button.png differ diff --git a/content/docs/en/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png new file mode 100644 index 0000000000..b03a01e380 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png differ diff --git a/content/docs/en/install-on-your-infra/import-cluster/import-cluster-select-eks.png b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-select-eks.png new file mode 100644 index 0000000000..e1caeaae17 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-cluster/import-cluster-select-eks.png differ diff --git a/content/docs/en/install-on-your-infra/import-provider.mdx b/content/docs/en/install-on-your-infra/import-provider.mdx new file mode 100644 index 0000000000..311d5ae48f --- /dev/null +++ b/content/docs/en/install-on-your-infra/import-provider.mdx @@ -0,0 +1,44 @@ +--- +title: Import a provider +sidebar_label: Import a provider +sidebar_position: 2 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Import a provider + +A Provider in import mode connects SleakOps to an AWS Organization you already run, instead of creating a new one. This page covers how to create a provider in import mode and where it leads next. + +## When to use import mode + +Use the default flow ([Providers](/docs/provider)) when you want SleakOps to provision a new AWS Organization and accounts for you. Use import mode when you already operate AWS infrastructure and want SleakOps to manage it as-is — the accounts, network, and EKS cluster are connected rather than recreated. + +## Create the provider in import mode + +1. Go to **Settings > Providers** and click **Create**. The provider wizard opens on the **Basic Information** tab. +2. Turn on the **Install SleakOps in existing AWS infra** toggle. + + + Basic Information tab with the Install SleakOps in existing AWS infra toggle turned on + + + With the toggle on, the **Email** field is hidden — SleakOps reads the account email from your existing AWS setup instead. **Name**, **Region**, and **Domain** work the same as in the default flow. +3. Fill in **Name**, **Region**, and **Domain**, then click **Submit** to move to **Connect to AWS**. This tab and the CloudFormation role setup match the default flow — see [Providers](/docs/provider) — with one addition: an optional box lets you run a CloudFormation stack once on your AWS organization root account to activate organization-level Cost Allocation Tags. Skipping it only disables organization-level cost tagging. +4. Once the provider finishes creating, SleakOps redirects you automatically to **Accounts & Networking** instead of the dashboard. + + + Accounts and Networking section for a provider created in import mode + + +## Next step + +From **Accounts & Networking**, [connect your existing AWS accounts](/docs/install-on-your-infra/import-accounts) to the provider. diff --git a/content/docs/en/install-on-your-infra/import-provider/accounts-networking-landing.png b/content/docs/en/install-on-your-infra/import-provider/accounts-networking-landing.png new file mode 100644 index 0000000000..da8a28bc6d Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-provider/accounts-networking-landing.png differ diff --git a/content/docs/en/install-on-your-infra/import-provider/provider-wizard-import-toggle.png b/content/docs/en/install-on-your-infra/import-provider/provider-wizard-import-toggle.png new file mode 100644 index 0000000000..8e765d3193 Binary files /dev/null and b/content/docs/en/install-on-your-infra/import-provider/provider-wizard-import-toggle.png differ diff --git a/content/docs/en/install-on-your-infra/index.mdx b/content/docs/en/install-on-your-infra/index.mdx new file mode 100644 index 0000000000..fec955a304 --- /dev/null +++ b/content/docs/en/install-on-your-infra/index.mdx @@ -0,0 +1,45 @@ +--- +title: Install SleakOps on your infra +sidebar_label: Install SleakOps on your infra +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Install SleakOps on your infra + +SleakOps can bring an existing AWS setup under management instead of provisioning everything from scratch. Import mode connects SleakOps to infrastructure you already run — an AWS account, its network, and an EKS cluster — without recreating any of it. + +Import features are enabled per company — contact SleakOps to enable them for yours. + +## Prerequisites + +- An AWS account with existing infrastructure to import. +- Permissions to run CloudFormation stacks in that account. +- An admin user in SleakOps. + +## The import journey + +Importing existing infrastructure follows a fixed sequence: + +1. [Import the provider](/docs/install-on-your-infra/import-provider). +2. [Import the accounts](/docs/install-on-your-infra/import-accounts). +3. [Configure the network](/docs/install-on-your-infra/network-configuration). +4. [Import the cluster](/docs/install-on-your-infra/import-cluster). + +## What you can import + +| Resource | What it does | +|---|---| +| [Provider](/docs/install-on-your-infra/import-provider) | Connect SleakOps to an AWS Organization you already run. | +| [Account](/docs/install-on-your-infra/import-accounts) | Declare an existing AWS account and connect it via CloudFormation. | +| [Network configuration](/docs/install-on-your-infra/network-configuration) | Complete the network inputs SleakOps needs for an imported account. | +| [Cluster](/docs/install-on-your-infra/import-cluster) | Register an existing EKS cluster in SleakOps. | +| [Dependency](/docs/project/dependency/import-dependency) | Register an existing managed resource (RDS, S3, SQS, Redis…) as a SleakOps Dependency. | +| [Project](/docs/project/import-project) | Adopt an existing deployment as a SleakOps Project. | +| [Domain](/docs/domain/import-domain) | Reuse an existing Route53 hosted zone for an Environment. | +| [NodePool](/docs/cluster/nodepools/importing-a-nodepool) | Register an existing EKS node pool. | +| [Addons](/docs/cluster/addons/import-addons) | Import an addon's manifests, or adopt one already running in the cluster. | +| [Essential addons](/docs/cluster/addons/essential-addons) | Adopt the cluster's existing core addons (AWS Auth, external-dns, etc.) into SleakOps. | diff --git a/content/docs/en/install-on-your-infra/network-configuration.mdx b/content/docs/en/install-on-your-infra/network-configuration.mdx new file mode 100644 index 0000000000..6c0a55f15d --- /dev/null +++ b/content/docs/en/install-on-your-infra/network-configuration.mdx @@ -0,0 +1,76 @@ +--- +title: Configure the network +sidebar_label: Configure the network +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Configure the network + +Once an account's CloudFormation stack has run, SleakOps needs to know which VPC, subnets and gateways to use before it can deploy a cluster into it. This step maps that existing AWS network to the inputs SleakOps requires. + +## Find accounts waiting on network configuration + +If you have accounts still waiting on network configuration, you'll see an alert for it on the Providers list. The banner reads **Network configuration pending** and names the provider with pending accounts. Its **Configure networking** button takes you straight to that account's network configuration form in **Accounts & Networking**. Only admins see this alert. + + + Providers list showing the Network configuration pending banner with the Configure networking button + + +## Select the VPC + +The account's detail panel opens on a single required field: **VPC**. The dropdown lists every VPC SleakOps discovered in the account, as ` · `. + + + Network configuration form with the VPC dropdown not yet selected + + +Selecting a VPC loads its subnets, NAT Gateways and Internet Gateway — the form shows **Loading subnets, NAT and gateways…** while that happens. + +## Assign subnets to slots + +| **Setting** | **Description** | +| -------------------- | ------------------------------------------------------------- | +| **Public subnets** | Subnets with a route to the Internet Gateway. | +| **Private subnets** | Subnets that reach the internet through a NAT Gateway. | +| **Persistent subnets** | Subnets for stateful resources (databases, storage). | + +All three slots are required — each needs at least one subnet, or the form shows **Select at least one subnet**. The same subnet can be assigned to more than one slot. + +## Gateways + +- **NAT Gateway(s)** — select at least one. If none are selected, the form shows **Select at least one NAT Gateway**. If the VPC has no NAT Gateway at all, SleakOps shows a warning asking you to create one or pick another VPC. +- **Internet Gateway** — a single required dropdown, with the same warning if the VPC has none attached. + +Each NAT Gateway's Elastic IP is taken automatically from AWS — there's no field to pick it separately. + + + Network configuration form with a VPC, all three subnet slots, a NAT Gateway and the Internet Gateway selected + + +## Submit and import + +**Save and apply** stays disabled until all three subnet slots, at least one NAT Gateway, and the Internet Gateway are set. Once you submit, the account moves to **Creating…** while SleakOps applies the configuration — the panel switches to the **network explorer** automatically when it finishes. + +The network explorer is a read-only view of the imported network: the VPC, its route tables, the Internet Edge (Internet Gateway, NAT Gateway and its Elastic IP), and the subnets grouped by Public, Private and Persistent. + + + Network explorer showing the VPC, route tables, Internet Edge and subnet groups for a configured account + + +From here, the account is ready to import its cluster. diff --git a/content/docs/en/install-on-your-infra/network-configuration/network-config-slots.png b/content/docs/en/install-on-your-infra/network-configuration/network-config-slots.png new file mode 100644 index 0000000000..5613cab220 Binary files /dev/null and b/content/docs/en/install-on-your-infra/network-configuration/network-config-slots.png differ diff --git a/content/docs/en/install-on-your-infra/network-configuration/network-config-vpc.png b/content/docs/en/install-on-your-infra/network-configuration/network-config-vpc.png new file mode 100644 index 0000000000..3fda8cad58 Binary files /dev/null and b/content/docs/en/install-on-your-infra/network-configuration/network-config-vpc.png differ diff --git a/content/docs/en/install-on-your-infra/network-configuration/network-explorer.png b/content/docs/en/install-on-your-infra/network-configuration/network-explorer.png new file mode 100644 index 0000000000..0f8423fcb5 Binary files /dev/null and b/content/docs/en/install-on-your-infra/network-configuration/network-explorer.png differ diff --git a/content/docs/en/install-on-your-infra/network-configuration/pending-network-alert.png b/content/docs/en/install-on-your-infra/network-configuration/pending-network-alert.png new file mode 100644 index 0000000000..5b1415da85 Binary files /dev/null and b/content/docs/en/install-on-your-infra/network-configuration/pending-network-alert.png differ diff --git a/content/docs/en/install-on-your-infra/whats-next.mdx b/content/docs/en/install-on-your-infra/whats-next.mdx new file mode 100644 index 0000000000..40ed23823e --- /dev/null +++ b/content/docs/en/install-on-your-infra/whats-next.mdx @@ -0,0 +1,84 @@ +--- +title: What's next +sidebar_label: What's next +sidebar_position: 6 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; +import { FiDatabase, FiBox, FiGlobe, FiServer, FiPackage, FiShield } from "react-icons/fi"; + +# What's next + +The base import journey — provider, accounts, network, and cluster — is done; here's what else you can bring into SleakOps from your existing infrastructure. + +
+ +{" "} + +
+
+ +

Dependencies

+
+

Register an existing RDS, S3 bucket, SQS queue or Redis cluster that already runs in your AWS account.

+ Learn more +
+ +{" "} + +
+
+ +

Projects

+
+

Adopt an existing deployment as a SleakOps Project.

+ Learn more +
+ +{" "} + +
+
+ +

Domains

+
+

Reuse an existing Route53 hosted zone for an Environment.

+ Learn more +
+ +{" "} + +
+
+ +

NodePools

+
+

Register an existing EKS node pool.

+ Learn more +
+ +{" "} + +
+
+ +

Addons

+
+

Import an addon's manifests, or adopt one already running in the cluster.

+ Learn more +
+ +{" "} + +
+
+ +

Essential addons

+
+

Adopt the cluster's existing core addons into SleakOps.

+ Learn more +
+ +
diff --git a/content/docs/en/network/index.mdx b/content/docs/en/network/index.mdx index e60d9ab764..18c094cf35 100644 --- a/content/docs/en/network/index.mdx +++ b/content/docs/en/network/index.mdx @@ -2,7 +2,7 @@ id: network-resources title: Network Resources sidebar_label: Network Resources -sidebar_position: 6 +sidebar_position: 7 --- import Zoom from "react-medium-image-zoom"; diff --git a/content/docs/en/project/dependency/import-dependency.mdx b/content/docs/en/project/dependency/import-dependency.mdx new file mode 100644 index 0000000000..7567354088 --- /dev/null +++ b/content/docs/en/project/dependency/import-dependency.mdx @@ -0,0 +1,94 @@ +--- +title: Import a dependency +sidebar_label: Import a dependency +sidebar_position: 14 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +SleakOps can register a Dependency you already run in AWS — a database, a queue, a bucket — instead of creating one from scratch. Import discovers the real resources in an account and adopts the one you pick without modifying it. + +## Supported types + +All 14 types below are supported for import. This table only indicates whether SleakOps needs credentials to connect — it isn't a support/not-supported column. + +| **Type** | **Credentials required** | +| --------------------- | ------------------------- | +| **PostgreSQL** | Yes | +| **MySQL** | Yes | +| **MariaDB** | Yes | +| **Oracle** | Yes | +| **Aurora MySQL** | Yes | +| **Aurora PostgreSQL** | Yes | +| **DocumentDB** | Yes | +| **RabbitMQ** | Yes | +| **MSK** | Only for SASL/SCRAM | +| **S3 bucket** | No | +| **SQS** | No | +| **Redis** | No | +| **Memcached** | No | +| **OpenSearch** | No | + +## Discover and import + +On the Dependencies list, click **Import Dependency** next to **Create**. + + + Dependencies list with the Import Dependency button next to Create + + +The button opens a 4-step dialog. + +### 1. Choose the type of resource + +Search and pick one of the supported types above. + +### 2. Choose the account + +Select the account where the resource lives. Only accounts in created state are listed. + +### 3. Discover + +SleakOps lists the real resources of that type it found in the account — name, engine version (or the relevant attributes for non-database types), and status. A resource already registered in SleakOps shows dimmed and disabled, with a tooltip explaining it's already managed. + + + Discover step listing the resources SleakOps found in the account, with one selected + + +### 4. Name, project and credentials + +Enter a **Name** and pick the **Project** to attach the dependency to. For types that require credentials, enter the **Username** and **Password** SleakOps should use to connect — AWS never exposes the master password of an existing instance, so these values aren't discovered automatically. + + + Name, project and credentials step filled in for a PostgreSQL resource + + +Click **Import** to start the registration. SleakOps adopts the resource into its infrastructure state without modifying it, and you can follow the progress from the dependencies list. + +## Configuration sync + +Once imported, a dependency's config can also be synced from the real AWS resource in the background — this isn't triggered from the console yet. + +## FAQs + +
+ +### Does importing modify the resource? + +No. SleakOps adopts the resource into its infrastructure state without modifying it — it only registers what's already there. +
diff --git a/content/docs/en/project/dependency/import-dependency/import-dependency-button.png b/content/docs/en/project/dependency/import-dependency/import-dependency-button.png new file mode 100644 index 0000000000..c67d94bac5 Binary files /dev/null and b/content/docs/en/project/dependency/import-dependency/import-dependency-button.png differ diff --git a/content/docs/en/project/dependency/import-dependency/import-dependency-config.png b/content/docs/en/project/dependency/import-dependency/import-dependency-config.png new file mode 100644 index 0000000000..fdea05ede1 Binary files /dev/null and b/content/docs/en/project/dependency/import-dependency/import-dependency-config.png differ diff --git a/content/docs/en/project/dependency/import-dependency/import-dependency-discovery.png b/content/docs/en/project/dependency/import-dependency/import-dependency-discovery.png new file mode 100644 index 0000000000..2f9c237cf0 Binary files /dev/null and b/content/docs/en/project/dependency/import-dependency/import-dependency-discovery.png differ diff --git a/content/docs/en/project/import-project.mdx b/content/docs/en/project/import-project.mdx new file mode 100644 index 0000000000..0f15132dd7 --- /dev/null +++ b/content/docs/en/project/import-project.mdx @@ -0,0 +1,77 @@ +--- +title: Import a project +sidebar_label: Import a project +sidebar_position: 15 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +This page covers importing an existing resource. If you haven't connected your AWS infrastructure to SleakOps yet, start with [Install SleakOps on your infra](/docs/install-on-your-infra). +::: + +SleakOps can adopt a deployment already running in a cluster as a managed Project instead of building it from scratch. Import discovers the Helm releases the cluster runs outside SleakOps and maps one of them into workloads and manifests. + +## Discover a release to import + +On the Projects screen, click **Import Project** next to **Create**. This opens the same discovery dialog used to import addons: pick the cluster to inspect, and SleakOps lists the Helm releases running there that aren't already managed by SleakOps. Pick one to continue. + + + Import project from cluster dialog listing unmanaged Helm releases + + +## Preview: what SleakOps detects + +SleakOps maps the release's documents deterministically into workloads — web service, worker, cron job, or hook — plus any manifests shared across the whole project. Anything it couldn't map lands in a **Not included** list, each with a reason. An optional **Improve mapping with AI** button re-runs the mapping with an LLM as an alternative if the deterministic result needs adjusting. + + + Preview step showing the release mapped into a workload with its manifests + + +The original release keeps running untouched. This creates a SleakOps-managed project in its own namespace, in parallel — its pods use the SleakOps service account, so grant any AWS access the app needs via Dependencies. Switching traffic over to the managed project is a manual step. + +## Complete the project details + +Click **Continue** to fill in the new project: + +| **Field** | **Description** | +| ------------------ | ----------------------------------------------------------------------------- | +| **Project name** | Prefilled from the release name, slugified. Editable. | +| **Environment** | The Environment of the chosen cluster to deploy into. | +| **Nodepool** | The node pool of the chosen cluster to run the workloads on. | +| **Branch** | The Git branch to build from. | +| **Repository** | The Git repository to build from — requires a Git integration configured. | +| **Build method** | Docker or Buildpack. | +| **Dockerfile path**| Only for the Docker method. | + +Environment and Nodepool list the real resources of the cluster you picked in the discovery step. + + + Details step with project name, environment, nodepool, branch and build method filled in + + +Click **Import** to create the project. + +## What stays manual + +The new project builds from the repository you pick and deploys with the manifests mapped from the release. The original release is not modified — it keeps serving traffic on its own until you decide to switch over. Routing real traffic to the managed project is a manual step, outside SleakOps. + +## FAQs + +
+ +### What happens to the original release? + +Nothing. The original release keeps running untouched in its own namespace. SleakOps creates a new, separate project alongside it — switching traffic over to the managed project is a manual step you take when you're ready. +
diff --git a/content/docs/en/project/import-project/import-project-details.png b/content/docs/en/project/import-project/import-project-details.png new file mode 100644 index 0000000000..c8edcf9e74 Binary files /dev/null and b/content/docs/en/project/import-project/import-project-details.png differ diff --git a/content/docs/en/project/import-project/import-project-entry.png b/content/docs/en/project/import-project/import-project-entry.png new file mode 100644 index 0000000000..715adf8834 Binary files /dev/null and b/content/docs/en/project/import-project/import-project-entry.png differ diff --git a/content/docs/en/project/import-project/import-project-preview.png b/content/docs/en/project/import-project/import-project-preview.png new file mode 100644 index 0000000000..b3c661d069 Binary files /dev/null and b/content/docs/en/project/import-project/import-project-preview.png differ diff --git a/content/docs/en/project/index.mdx b/content/docs/en/project/index.mdx index 89aa45e640..6dd01f4e6c 100644 --- a/content/docs/en/project/index.mdx +++ b/content/docs/en/project/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 7 +sidebar_position: 8 sidebar_label: Project pagination_next: project/dependency/index --- diff --git a/content/docs/en/provider/index.mdx b/content/docs/en/provider/index.mdx index 20c266c41f..a76dc32642 100644 --- a/content/docs/en/provider/index.mdx +++ b/content/docs/en/provider/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 5 pagination_next: provider/schemas --- diff --git a/content/docs/es/cluster/addons/essential-addons.mdx b/content/docs/es/cluster/addons/essential-addons.mdx new file mode 100644 index 0000000000..de957d6f59 --- /dev/null +++ b/content/docs/es/cluster/addons/essential-addons.mdx @@ -0,0 +1,55 @@ +--- +title: Addons esenciales +sidebar_label: Addons esenciales +sidebar_position: 9 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +Los addons esenciales son el pegamento de infraestructura que todo clúster necesita para funcionar bajo SleakOps: networking, autoscaling y control de acceso. A diferencia de los addons opcionales que elegís del listado de Addons, estos cinco siempre están presentes — SleakOps los instala automáticamente en todo clúster gestionado en lugar de esperar a que vos los agregues. + + + Listado de Addons mostrando los cinco addons esenciales (todos Installed) junto a una mezcla de addons opcionales instalados, deprecados y sin instalar + + +Aparecen en el listado de Addons como cualquier otra tarjeta de addon, sin ninguna insignia o marca visual especial — se reconocen por nombre y descripción, no por un tratamiento distinto. + +## Los cinco addons esenciales + +| Nombre | Qué hace | +|---|---| +| Metrics Server | Recolecta métricas de recursos desde los kubelets y las expone a través de la Kubernetes Metrics API, habilitando Horizontal Pod Autoscaling y `kubectl top`. | +| ExternalDNS | Sincroniza los Services e Ingresses expuestos de Kubernetes con los proveedores de DNS (Route53), manteniendo los registros DNS del clúster actualizados automáticamente. | +| Karpenter | Un autoscaler de nodos de Kubernetes que aprovisiona capacidad de cómputo del tamaño justo en respuesta a pods sin programar, mejorando la eficiencia y reduciendo el costo. | +| AWS Auth | Conecta los roles IAM de SleakOps al ConfigMap `aws-auth` del clúster y a los ClusterRoles de RBAC de SleakOps, habilitando la integración de SleakOps y el acceso basado en roles. | +| Load Balancer | El AWS Load Balancer Controller gestiona los Application Load Balancers para los Ingresses de Kubernetes, además de las IngressClasses públicas y privadas usadas para rutear el tráfico externo. | + +## Comportamiento en clústeres importados + +En un clúster gestionado, SleakOps aprovisiona y es dueño de los cinco addons esenciales desde el primer día. En un clúster importado no hay nada que aprovisionar — la infraestructura del cliente ya corre su propia versión de cada pieza — así que en lugar de instalarlos, SleakOps los adopta a partir de lo que ya está corriendo, uno a la vez, a medida que traés recursos bajo gestión. + +El addon Load Balancer es un ejemplo concreto: cuando se importa un clúster, su fila de Addon se crea directamente a partir de los nombres de las IngressClass públicas y privadas descubiertas en el payload de importación, sin correr ningún aprovisionamiento de Pulumi — el cliente ya corre su propio controlador ALB, así que SleakOps solo necesita registrar lo que existe. + +AWS Auth tiene el comportamiento de importación más elaborado. En un clúster gestionado, SleakOps es dueño de todo el `mapRoles` del ConfigMap `aws-auth`. En un clúster importado, el módulo corre en modo merge: lee el ConfigMap `aws-auth` real del cliente y mezcla solo las entradas de rol que requiere SleakOps, deduplicadas por ARN de rol y con las entradas de SleakOps ganando en caso de conflicto — se preserva cada entrada previa del cliente. Este merge es idempotente: leer un ConfigMap ya mezclado y volver a correrlo no duplica entradas. + +## Restricciones + +**Configuración** — el formulario de configuración de un addon esencial es de solo lectura en un clúster gestionado, ya que SleakOps es dueño de esa configuración; se vuelve editable en un clúster importado, ya que ahí la configuración refleja lo que el cliente ya tenía corriendo, y eso es suyo para cambiar. La mayoría de los addons esenciales (Metrics Server, ExternalDNS, Karpenter, AWS Auth) no tienen campos configurables — Load Balancer es el único con un esquema real (los nombres de sus IngressClass públicas y privadas), así que también es el único donde se ve el bloqueo de solo lectura: + + + Vista de detalle del addon Load Balancer en un clúster gestionado, con sus campos de nombre de IngressClass bloqueados + + +**Eliminación** — los addons esenciales no se pueden eliminar en absoluto en un clúster gestionado: son permanentes durante toda la vida del clúster y solo se destruyen automáticamente cuando se destruye el clúster mismo. En un clúster importado se pueden eliminar de forma individual como cualquier otro recurso adoptado, sujeto a la misma protección de dependencias que cualquier addon (no se puede eliminar uno del que otro addon depende). Esta restricción está condicionada por el tipo de clúster, no por el rol del usuario que hace la solicitud. diff --git a/content/docs/es/cluster/addons/essential-addons/essential-addon-lb-detail.png b/content/docs/es/cluster/addons/essential-addons/essential-addon-lb-detail.png new file mode 100644 index 0000000000..a464dc494d Binary files /dev/null and b/content/docs/es/cluster/addons/essential-addons/essential-addon-lb-detail.png differ diff --git a/content/docs/es/cluster/addons/essential-addons/essential-addons-list.png b/content/docs/es/cluster/addons/essential-addons/essential-addons-list.png new file mode 100644 index 0000000000..861e05394d Binary files /dev/null and b/content/docs/es/cluster/addons/essential-addons/essential-addons-list.png differ diff --git a/content/docs/es/cluster/addons/import-addons.mdx b/content/docs/es/cluster/addons/import-addons.mdx new file mode 100644 index 0000000000..dca1b36605 --- /dev/null +++ b/content/docs/es/cluster/addons/import-addons.mdx @@ -0,0 +1,69 @@ +--- +title: Importar y exportar addons +sidebar_label: Importar y exportar addons +sidebar_position: 8 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +Los addons pueden entrar y salir de SleakOps de dos formas: importando una definición JSON exportada desde otro clúster, o descubriendo y adoptando un release de Helm que ya corre en el clúster. Ambos botones están en el listado de Addons, junto a **Add custom addon**, y solo aparecen cuando tu empresa tiene registrado el tipo de addon genérico (custom Helm chart). A partir de ahí los dos flujos difieren en alcance: **Import from JSON** y **Export JSON** funcionan con cualquier tipo de addon registrado en el clúster — gestionado por SleakOps (Grafana, KEDA, …) o personalizado — mientras que **Import from cluster** siempre adopta el release como un addon personalizado, ya que el descubrimiento no tiene forma de saber a qué tipo gestionado (si es que corresponde a alguno) equivale un release de Helm en vivo. + +Ambos flujos requieren que tu empresa tenga habilitada la funcionalidad de importación (`infra_import.addon`) y que seas un usuario **admin** — crear, actualizar o exportar un addon está restringido a admin en el backend. + + + Listado de Addons mostrando Import from cluster e Import from JSON junto a Add custom addon + + +## Importar desde JSON + +Hacé clic en **Import from JSON** para pegar una definición exportada desde otro clúster: + + + Diálogo Import addon from JSON con un textarea para pegar la definición exportada + + +Pegá el JSON y hacé clic en **Import**. SleakOps lo valida antes de abrir el formulario: + +- JSON inválido: **"Invalid JSON. Paste a valid addon export."** +- Forma incorrecta: **'The JSON must include a string "addon_type" and an object "values".'** +- Un tipo que el clúster no tiene registrado: **`Addon type "" is not available in this cluster.`** + +Una vez que valida, se abre el formulario de creación del addon correspondiente precargado con los `values` pegados (y el `name`, si viene incluido) — nada queda bloqueado, así que podés cambiar lo que quieras antes de instalar. El botón de envío dice **Import** en lugar de **Install**, como recordatorio de que estos son valores de partida, no una configuración por defecto recién creada. + +Esto se combina con **Export JSON**, disponible en la vista de detalle de cualquier addon instalado — gestionado por SleakOps o personalizado — una vez que está en estado `created` (mismo requisito de acceso). Copia el JSON portable del addon al portapapeles y lo descarga como `.addon.json` — ese archivo es el que pegás en **Import from JSON** en el clúster de destino. + +## Importar desde el clúster + +Hacé clic en **Import from cluster** para descubrir los releases de Helm que ya corren en este clúster: + + + Diálogo Import from cluster listando los releases de Helm descubiertos, cada uno con un botón Use + + +Cada release muestra su nombre, namespace, chart y versión. Mientras corre el descubrimiento: **"Loading releases…"**; si no puede alcanzar el clúster: **"Could not load Helm releases from the cluster."**; si no encuentra ninguno: **"No Helm releases found in this cluster."** + +Hacé clic en **Use** sobre un release para precargar el formulario del addon genérico con su nombre de release, namespace, chart, versión y los valores de Helm actuales. A diferencia del flujo por JSON — que puede apuntar a cualquier tipo de addon —, este siempre crea un addon personalizado (genérico), y además adopta un recurso que ya corre en vivo, no simplemente parte de un conjunto de valores: el nombre del release, el namespace, el chart y la versión quedan bloqueados (solo lectura) porque alimentan la importación de Pulumi subyacente y deben coincidir con lo que realmente está corriendo. **Repository URL** es el único campo que queda vacío y editable — la URL del repositorio del chart no se puede recuperar de un release en vivo, así que la escribís vos. + + + Formulario de addon genérico precargado desde un release descubierto, con release name, chart, version y namespace bloqueados y Repository URL vacío + + +Hacé clic en **Import** para adoptar el release bajo la gestión de SleakOps. diff --git a/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster-form.png b/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster-form.png new file mode 100644 index 0000000000..f74b6ab6e3 Binary files /dev/null and b/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster-form.png differ diff --git a/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster.png b/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster.png new file mode 100644 index 0000000000..73bc009365 Binary files /dev/null and b/content/docs/es/cluster/addons/import-addons/import-addon-from-cluster.png differ diff --git a/content/docs/es/cluster/addons/import-addons/import-addon-json.png b/content/docs/es/cluster/addons/import-addons/import-addon-json.png new file mode 100644 index 0000000000..db644db798 Binary files /dev/null and b/content/docs/es/cluster/addons/import-addons/import-addon-json.png differ diff --git a/content/docs/es/cluster/addons/import-addons/import-addons-buttons.png b/content/docs/es/cluster/addons/import-addons/import-addons-buttons.png new file mode 100644 index 0000000000..3be62f9215 Binary files /dev/null and b/content/docs/es/cluster/addons/import-addons/import-addons-buttons.png differ diff --git a/content/docs/es/cluster/index.mdx b/content/docs/es/cluster/index.mdx index 00f1d88766..88ab94b340 100644 --- a/content/docs/es/cluster/index.mdx +++ b/content/docs/es/cluster/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 5 +sidebar_position: 6 title: Cluster pagination_next: environment/index --- diff --git a/content/docs/es/cluster/nodepools/importing-a-nodepool.mdx b/content/docs/es/cluster/nodepools/importing-a-nodepool.mdx new file mode 100644 index 0000000000..85907d5e5d --- /dev/null +++ b/content/docs/es/cluster/nodepools/importing-a-nodepool.mdx @@ -0,0 +1,59 @@ +--- +title: Importar un Node Pool +sidebar_label: Importar un Node Pool +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +SleakOps puede tomar bajo gestión un node pool de Karpenter existente en lugar de crear uno desde cero. La importación descubre los node pools que corren de verdad en tu clúster y te permite adoptar uno tal cual está. + +## Requisitos previos + +- Un usuario con permisos de administrador en SleakOps. +- La funcionalidad de importación habilitada para tu empresa (`infra_import.nodepool`). +- El clúster **no** debe estar en modo importación. **Import Node Pool** solo está disponible en clústeres que SleakOps aprovisionó él mismo — no aparece en clústeres importados. + +## Descubrí e importá + +Desde el listado de Clústeres, seleccioná uno y entrá a su Settings, después hacé clic en Node Pools. Si se cumplen los requisitos anteriores, vas a encontrar un botón **Import Node Pool** junto a **Create**. + + + Sección Node Pools de un clúster, con el botón Import Node Pool junto a Create + + +### Descubrimiento + +Al hacer clic se abre un diálogo que lista los node pools de Karpenter que corren de verdad en el clúster y que SleakOps todavía no gestiona: + +- Mientras se busca: **"Discovering Karpenter node pools…"** +- No se encontraron node pools sin gestionar: **"No unmanaged Karpenter node pools were found in this cluster."** +- El clúster no es alcanzable: un error que pide verificar la conectividad y reintentar. + +Un node pool cuyo nombre no cumple las reglas de nombres de SleakOps (minúsculas alfanuméricas con guiones simples, hasta 50 caracteres) no se puede adoptar y aparece deshabilitado — el nombre del pool pasa a ser el nombre del NodePool en SleakOps y no se puede editar después, así que los nombres fuera de ese patrón quedan afuera de la selección. + + + Diálogo Import Node Pool mostrando los node pools de Karpenter descubiertos y sin gestionar del clúster + + +### Revisión + +Elegí un node pool y pasá al siguiente paso: "Review the configuration mapped from the live pool. It is adopted exactly as it runs today, even where its values fall outside the SleakOps ranges." + +SleakOps precarga el mismo formulario que se usa para crear o editar un node pool con los valores descubiertos en el pool real — arquitectura, tipos de nodo, tipos de instancia, límites de CPU y memoria, almacenamiento del nodo, y su taint dedicado si el pool tiene uno. + +## Después de importar + +Una vez que confirmás la importación: "`` is being adopted by SleakOps. SleakOps is taking the live node pool under management. Its EC2NodeClass is cloned under the pool's name and existing nodes rotate gradually, respecting PodDisruptionBudgets and disruption budgets. You can follow the progress in the node pools list." diff --git a/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png b/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png new file mode 100644 index 0000000000..797fcbb437 Binary files /dev/null and b/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-button.png differ diff --git a/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png b/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png new file mode 100644 index 0000000000..5bf31c2438 Binary files /dev/null and b/content/docs/es/cluster/nodepools/importing-a-nodepool/import-nodepool-dialog.png differ diff --git a/content/docs/es/domain/import-domain.mdx b/content/docs/es/domain/import-domain.mdx new file mode 100644 index 0000000000..159f1cca19 --- /dev/null +++ b/content/docs/es/domain/import-domain.mdx @@ -0,0 +1,53 @@ +--- +title: Importa un dominio +sidebar_label: Importa un dominio +sidebar_position: 3 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +La importación de dominio no es un flujo separado — es una sección dentro del formulario de creación de un Entorno. Crear un Entorno normalmente aprovisiona una hosted zone de Route53 nueva; la opción de importación te permite reutilizar una que ya existe en la cuenta de AWS de destino en lugar de eso. + +## Reutilizá una hosted zone existente + +En el formulario de creación de Entorno, un toggle **Use Existing Hosted Zone**, visible solo para administradores, aparece debajo de los campos base (Name, Cluster, Domain): + +> Adopt a Route53 hosted zone that already exists in the target AWS account instead of creating a new one. The ACM certificate for the domain is adopted automatically when the account has one issued. + +Antes de poder buscar, hace falta completar tres campos primero — el Cluster determina en qué cuenta de AWS busca SleakOps: + +- Sin Cluster elegido: **"Select a Cluster to search its account for existing hosted zones."** +- Cluster elegido pero falta Name o Domain (o el Domain no es válido): **"Enter a Name and a valid Domain to search for existing hosted zones."** + +Una vez que los tres campos están completos, activar el toggle busca en Route53 de esa cuenta: + +- Una zona cuyo nombre coincide exacto con el campo Domain se marca con el badge **Exact Match** (más **Private** si es una zona privada) y se muestra primero. +- Las demás zonas encontradas en la cuenta se listan debajo, cada una con el badge **Private** si corresponde. +- Si no hay ninguna zona: **"No hosted zones found in the account."** +- Si hay zonas pero ninguna coincide exacto: **"No hosted zone matches `` exactly. Pick one manually or create a new one."** + +Elegí una opción con las tarjetas de radio — **Create a New Hosted Zone** (la opción por defecto, SleakOps aprovisiona una zona nueva) o una de las zonas encontradas. Cambiar el Cluster cambia la cuenta de AWS de destino, así que descarta cualquier zona que ya hubieras elegido — el id de una hosted zone solo tiene sentido dentro de la cuenta a la que pertenece. + + + Formulario de creación de Entorno con el toggle Use Existing Hosted Zone activado, mostrando una zona con exact match y otra zona encontrada + + +Una vez creado el Entorno, aplica la configuración de dominio habitual — mirá [Setup your Domains](/docs/domain/setup) y la [Domain Delegation Guide](/docs/domain/delegation) para lo que sigue. + +## FAQs + +
+ + ### ¿Qué pasa con el certificado ACM? + + Se adopta automáticamente, junto con la hosted zone, cuando la cuenta de AWS de destino ya tiene uno emitido para el dominio. +
diff --git a/content/docs/es/domain/import-domain/domain-import-section.png b/content/docs/es/domain/import-domain/domain-import-section.png new file mode 100644 index 0000000000..56ecf5a7d4 Binary files /dev/null and b/content/docs/es/domain/import-domain/domain-import-section.png differ diff --git a/content/docs/es/domain/index.mdx b/content/docs/es/domain/index.mdx index d1e1e9a05c..5e0bc8e2b5 100644 --- a/content/docs/es/domain/index.mdx +++ b/content/docs/es/domain/index.mdx @@ -1,6 +1,6 @@ --- sidebar_label: Dominio -sidebar_position: 8 +sidebar_position: 9 --- # Niveles de Dominio y Estrategias diff --git a/content/docs/es/environment/index.mdx b/content/docs/es/environment/index.mdx index aedbb6c36b..3f9d6c6f32 100644 --- a/content/docs/es/environment/index.mdx +++ b/content/docs/es/environment/index.mdx @@ -1,6 +1,6 @@ --- sidebar_label: Entorno -sidebar_position: 6 +sidebar_position: 7 pagination_next: project/index --- diff --git a/content/docs/es/install-on-your-infra/import-accounts.mdx b/content/docs/es/install-on-your-infra/import-accounts.mdx new file mode 100644 index 0000000000..4b9f037e48 --- /dev/null +++ b/content/docs/es/install-on-your-infra/import-accounts.mdx @@ -0,0 +1,48 @@ +--- +title: Importa una cuenta +sidebar_label: Importa una cuenta +sidebar_position: 3 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Importa una cuenta + +Una vez que un provider está corriendo en modo de importación, conectá cada cuenta de AWS existente que quieras que SleakOps gestione desde su sección **Accounts & Networking**. + +## Declará una cuenta de AWS existente + +1. En **Accounts & Networking**, hacé clic en la card **Install SleakOps in account**. +2. Completá los tres campos: + + - **Account color** — elegí uno de los 8 colores predefinidos, o usá el color picker personalizado para elegir cualquier otro color. + - **Account name** — hasta 20 caracteres (por ejemplo, `payments-prod`). + - **AWS account ID** — el ID numérico de 12 dígitos de la cuenta. + + + Formulario de importación de cuenta con color, nombre y AWS account ID completos + + +3. Hacé clic en **Create account**. La cuenta aparece en la lista de la izquierda. + +## Corré el stack de CloudFormation + +1. Seleccioná la cuenta recién creada en la lista. Su panel de detalle muestra **CloudFormation not applied yet**. + + + Panel de detalle de la cuenta mostrando el estado CloudFormation not applied yet con el link Open CloudFormation + + +2. Hacé clic en **Open CloudFormation** para lanzar el stack de CloudFormation de SleakOps. Se abre en una pestaña nueva — corrélo estando conectado a esa cuenta de AWS. + +## Qué pasa después + +Cuando SleakOps recibe el callback del stack, la cuenta queda lista para la configuración de red. diff --git a/content/docs/es/install-on-your-infra/import-accounts/account-awaiting-cfn.png b/content/docs/es/install-on-your-infra/import-accounts/account-awaiting-cfn.png new file mode 100644 index 0000000000..f017b0fd42 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-accounts/account-awaiting-cfn.png differ diff --git a/content/docs/es/install-on-your-infra/import-accounts/import-account-form.png b/content/docs/es/install-on-your-infra/import-accounts/import-account-form.png new file mode 100644 index 0000000000..bc7401a184 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-accounts/import-account-form.png differ diff --git a/content/docs/es/install-on-your-infra/import-cluster.mdx b/content/docs/es/install-on-your-infra/import-cluster.mdx new file mode 100644 index 0000000000..8780d142e2 --- /dev/null +++ b/content/docs/es/install-on-your-infra/import-cluster.mdx @@ -0,0 +1,83 @@ +--- +title: Importa el clúster +sidebar_label: Importa el clúster +sidebar_position: 5 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Importa el clúster + +Con la red de una cuenta ya configurada, SleakOps puede registrar un clúster EKS existente de esa cuenta sin recrearlo — el último paso del recorrido de importación. + +## Requisitos previos + +- Una cuenta ya en estado **created**, con su red configurada ([Configura la red](/docs/install-on-your-infra/network-configuration)). + +## Instala SleakOps en el clúster + +En la lista de Clusters, los admins ven un botón **Install SleakOps in Cluster** junto a **Create**. Solo aparece cuando al menos una cuenta está en estado created. + + + Lista de Clusters con el botón Install SleakOps in Cluster junto a Create + + +El botón abre un diálogo de 4 pasos. + +### 1. Elegí la cuenta + +Elegí la cuenta del clúster EKS. Solo se listan las cuentas en estado created. + +### 2. Elegí el clúster + +SleakOps lista los clústeres EKS que descubrió en esa cuenta — nombre, versión de Kubernetes y estado (ACTIVE, etc.). Elegí el clúster a importar. + + + Paso Select cluster listando los clústeres EKS que SleakOps descubrió en la cuenta, con uno seleccionado + + +### 3. Acceso al endpoint del clúster + +SleakOps opera dentro del clúster a través de su API de Kubernetes, así que necesita llegar al endpoint del clúster. Si el endpoint ya es público con una allowlist, SleakOps agrega sus propias direcciones salientes a ella, manteniendo cada entrada que ya está. Si el endpoint no es públicamente alcanzable, SleakOps lo habilita y lo restringe a sus propias direcciones salientes. + +Marcá **I allow SleakOps to access the endpoint of this cluster** para continuar — es obligatorio. + +### 4. Ingress classes + +Ingresá el **Private IngressClass name** (por ejemplo `alb-internal`) y el **Public IngressClass name** (por ejemplo `alb-internet-facing`) del clúster. SleakOps los usa para rutear tráfico privado y público — no puede autodetectarlos, ya que solo la configuración del ALB controller del clúster define cuál es cuál. + + + Paso Ingress classes con los campos Private y Public IngressClass name completos + + +Hacé clic en **Install** para iniciar la importación. + +## Progreso de la instalación + +Mientras corre la importación, SleakOps lee la metadata del clúster (OIDC issuer), configura la VPN de la cuenta si todavía no existe, crea el namespace dedicado `sleakops`, y guarda el addon de Load Balancer con los nombres de IngressClass del paso 4. + +Podés cerrar el diálogo y seguir el progreso desde la lista de clusters — se sigue actualizando mientras la importación está en curso. + +Al terminar, SleakOps puede alcanzar el endpoint del clúster y está listo para operar dentro de él. Desde acá, el clúster está listo para que se gestionen sus addons esenciales y nodepools. + +## La etiqueta Imported + +Un clúster importado muestra una etiqueta **Imported** en su tarjeta en la lista de clusters, distinguiéndolo de los clústeres que SleakOps creó desde cero. Al pasar el mouse sobre la etiqueta se muestra: "Pre-existing EKS cluster imported into SleakOps". + + + Lista de clusters mostrando un clúster importado con la etiqueta Imported y su tooltip + diff --git a/content/docs/es/install-on-your-infra/import-cluster/cluster-imported-badge.png b/content/docs/es/install-on-your-infra/import-cluster/cluster-imported-badge.png new file mode 100644 index 0000000000..fb4b234137 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-cluster/cluster-imported-badge.png differ diff --git a/content/docs/es/install-on-your-infra/import-cluster/import-cluster-button.png b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-button.png new file mode 100644 index 0000000000..25d42233f7 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-button.png differ diff --git a/content/docs/es/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png new file mode 100644 index 0000000000..b03a01e380 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-ingress-classes.png differ diff --git a/content/docs/es/install-on-your-infra/import-cluster/import-cluster-select-eks.png b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-select-eks.png new file mode 100644 index 0000000000..e1caeaae17 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-cluster/import-cluster-select-eks.png differ diff --git a/content/docs/es/install-on-your-infra/import-provider.mdx b/content/docs/es/install-on-your-infra/import-provider.mdx new file mode 100644 index 0000000000..043d25c30e --- /dev/null +++ b/content/docs/es/install-on-your-infra/import-provider.mdx @@ -0,0 +1,44 @@ +--- +title: Importar un provider +sidebar_label: Importar un provider +sidebar_position: 2 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Importar un provider + +Un provider en modo de importación conecta SleakOps con una Organización de AWS que ya operás, en lugar de crear una nueva. Esta página cubre cómo crear un provider en modo de importación y a dónde te lleva a continuación. + +## Cuándo usar el modo de importación + +Usá el flujo por defecto ([Providers](/docs/provider)) cuando quieras que SleakOps aprovisione una nueva Organización de AWS y sus cuentas por vos. Usá el modo de importación cuando ya operás infraestructura en AWS y querés que SleakOps la gestione tal como está — las cuentas, la red y el clúster EKS se conectan en lugar de recrearse. + +## Crea el provider en modo de importación + +1. Ve a **Configuración > Providers** y hacé clic en **Crear**. El wizard del provider se abre en la pestaña **Basic Information**. +2. Activá el toggle **Install SleakOps in existing AWS infra**. + + + Pestaña Basic Information con el toggle Install SleakOps in existing AWS infra activado + + + Con el toggle activado, el campo **Email** se oculta — SleakOps lee el email de la cuenta desde tu configuración de AWS existente. **Name**, **Region** y **Domain** funcionan igual que en el flujo por defecto. +3. Completá **Name**, **Region** y **Domain**, y hacé clic en **Submit** para pasar a **Connect to AWS**. Esta pestaña y la configuración del rol de CloudFormation coinciden con el flujo por defecto — mirá [Providers](/docs/provider) — con un agregado: un cuadro opcional te permite ejecutar un stack de CloudFormation una vez en la cuenta raíz de tu Organización de AWS para activar las Cost Allocation Tags a nivel organización. Si lo omitís, solo se desactiva el etiquetado de costos a nivel organización. +4. Cuando el provider termina de crearse, SleakOps te redirige automáticamente a **Accounts & Networking** en lugar del dashboard. + + + Sección Accounts and Networking de un provider creado en modo de importación + + +## Próximo paso + +Desde **Accounts & Networking**, [conectá tus cuentas de AWS existentes](/docs/install-on-your-infra/import-accounts) al provider. diff --git a/content/docs/es/install-on-your-infra/import-provider/accounts-networking-landing.png b/content/docs/es/install-on-your-infra/import-provider/accounts-networking-landing.png new file mode 100644 index 0000000000..da8a28bc6d Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-provider/accounts-networking-landing.png differ diff --git a/content/docs/es/install-on-your-infra/import-provider/provider-wizard-import-toggle.png b/content/docs/es/install-on-your-infra/import-provider/provider-wizard-import-toggle.png new file mode 100644 index 0000000000..8e765d3193 Binary files /dev/null and b/content/docs/es/install-on-your-infra/import-provider/provider-wizard-import-toggle.png differ diff --git a/content/docs/es/install-on-your-infra/index.mdx b/content/docs/es/install-on-your-infra/index.mdx new file mode 100644 index 0000000000..1a52ff7e00 --- /dev/null +++ b/content/docs/es/install-on-your-infra/index.mdx @@ -0,0 +1,45 @@ +--- +title: Instala SleakOps en tu infraestructura +sidebar_label: Instala SleakOps en tu infraestructura +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Instala SleakOps en tu infraestructura + +SleakOps puede gestionar una infraestructura de AWS existente en lugar de aprovisionar todo desde cero. El modo de importación conecta SleakOps con infraestructura que ya tienes en funcionamiento — una cuenta de AWS, su red y un clúster EKS — sin recrear nada de eso. + +Las funcionalidades de importación se habilitan por empresa — contacta a SleakOps para habilitarlas en la tuya. + +## Requisitos previos + +- Una cuenta de AWS con infraestructura existente para importar. +- Permisos para ejecutar stacks de CloudFormation en esa cuenta. +- Un usuario con permisos de administrador en SleakOps. + +## El recorrido de importación + +Importar infraestructura existente sigue una secuencia fija: + +1. [Importa el provider](/docs/install-on-your-infra/import-provider). +2. [Importa las cuentas](/docs/install-on-your-infra/import-accounts). +3. [Configura la red](/docs/install-on-your-infra/network-configuration). +4. [Importa el clúster](/docs/install-on-your-infra/import-cluster). + +## Qué podés importar + +| Recurso | Qué hace | +|---|---| +| [Provider](/docs/install-on-your-infra/import-provider) | Conecta SleakOps a una AWS Organization que ya tenés en funcionamiento. | +| [Cuenta](/docs/install-on-your-infra/import-accounts) | Declara una cuenta de AWS existente y la conecta vía CloudFormation. | +| [Configuración de red](/docs/install-on-your-infra/network-configuration) | Completa los datos de red que SleakOps necesita para una cuenta importada. | +| [Clúster](/docs/install-on-your-infra/import-cluster) | Registra un clúster EKS existente en SleakOps. | +| [Dependencia](/docs/project/dependency/import-dependency) | Registra un recurso administrado existente (RDS, S3, SQS, Redis…) como una Dependencia de SleakOps. | +| [Proyecto](/docs/project/import-project) | Adopta un deployment existente como un Proyecto de SleakOps. | +| [Dominio](/docs/domain/import-domain) | Reutiliza una hosted zone de Route53 existente para un Entorno. | +| [NodePool](/docs/cluster/nodepools/importing-a-nodepool) | Registra un node pool de EKS existente. | +| [Addons](/docs/cluster/addons/import-addons) | Importa los manifiestos de un addon, o adopta uno que ya esté corriendo en el clúster. | +| [Addons esenciales](/docs/cluster/addons/essential-addons) | Adopta los addons esenciales existentes del clúster (AWS Auth, external-dns, etc.) en SleakOps. | diff --git a/content/docs/es/install-on-your-infra/network-configuration.mdx b/content/docs/es/install-on-your-infra/network-configuration.mdx new file mode 100644 index 0000000000..eaf9e653a2 --- /dev/null +++ b/content/docs/es/install-on-your-infra/network-configuration.mdx @@ -0,0 +1,76 @@ +--- +title: Configura la red +sidebar_label: Configura la red +sidebar_position: 4 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +# Configura la red + +Una vez que el stack de CloudFormation de una cuenta corrió, SleakOps necesita saber qué VPC, subnets y gateways usar antes de poder desplegar un clúster en ella. Este paso mapea esa red de AWS existente a los inputs que SleakOps requiere. + +## Encontrá cuentas pendientes de configuración de red + +Si tenés cuentas todavía esperando su configuración de red, vas a ver una alerta para eso en la lista de Providers. El banner dice **Network configuration pending** y nombra al provider con cuentas pendientes. Su botón **Configure networking** te lleva directo al formulario de configuración de red de esa cuenta en **Accounts & Networking**. Solo los admins ven esta alerta. + + + Lista de Providers mostrando el banner Network configuration pending con el botón Configure networking + + +## Seleccioná la VPC + +El panel de detalle de la cuenta abre con un único campo obligatorio: **VPC**. El dropdown lista cada VPC que SleakOps descubrió en la cuenta, como ` · `. + + + Formulario de configuración de red con el dropdown de VPC sin seleccionar todavía + + +Al seleccionar una VPC se cargan sus subnets, NAT Gateways e Internet Gateway — el formulario muestra **Loading subnets, NAT and gateways…** mientras eso sucede. + +## Asigná subnets a los slots + +| **Setting** | **Description** | +| ------------------------ | --------------------------------------------------------------- | +| **Public subnets** | Subnets con ruta hacia el Internet Gateway. | +| **Private subnets** | Subnets que llegan a internet a través de un NAT Gateway. | +| **Persistent subnets** | Subnets para recursos con estado (bases de datos, storage). | + +Los tres slots son obligatorios — cada uno necesita al menos una subnet, o el formulario muestra **Select at least one subnet**. La misma subnet se puede asignar a más de un slot. + +## Gateways + +- **NAT Gateway(s)** — seleccioná al menos uno. Si no hay ninguno seleccionado, el formulario muestra **Select at least one NAT Gateway**. Si la VPC no tiene ningún NAT Gateway, SleakOps muestra una advertencia pidiéndote crear uno o elegir otra VPC. +- **Internet Gateway** — un único dropdown obligatorio, con la misma advertencia si la VPC no tiene ninguno asociado. + +La Elastic IP de cada NAT Gateway se toma automáticamente de AWS — no hay un campo para elegirla por separado. + + + Formulario de configuración de red con una VPC, los tres slots de subnets, un NAT Gateway y el Internet Gateway seleccionados + + +## Enviá e importá + +**Save and apply** queda deshabilitado hasta completar los tres slots de subnets, al menos un NAT Gateway y el Internet Gateway. Al enviarlo, la cuenta pasa a **Creating…** mientras SleakOps aplica la configuración — el panel cambia automáticamente al **network explorer** cuando termina. + +El network explorer es una vista de solo lectura de la red importada: la VPC, sus route tables, el Internet Edge (Internet Gateway, NAT Gateway y su Elastic IP), y las subnets agrupadas en Public, Private y Persistent. + + + Network explorer mostrando la VPC, las route tables, el Internet Edge y los grupos de subnets de una cuenta configurada + + +Desde acá, la cuenta está lista para importar su clúster. diff --git a/content/docs/es/install-on-your-infra/network-configuration/network-config-slots.png b/content/docs/es/install-on-your-infra/network-configuration/network-config-slots.png new file mode 100644 index 0000000000..5613cab220 Binary files /dev/null and b/content/docs/es/install-on-your-infra/network-configuration/network-config-slots.png differ diff --git a/content/docs/es/install-on-your-infra/network-configuration/network-config-vpc.png b/content/docs/es/install-on-your-infra/network-configuration/network-config-vpc.png new file mode 100644 index 0000000000..3fda8cad58 Binary files /dev/null and b/content/docs/es/install-on-your-infra/network-configuration/network-config-vpc.png differ diff --git a/content/docs/es/install-on-your-infra/network-configuration/network-explorer.png b/content/docs/es/install-on-your-infra/network-configuration/network-explorer.png new file mode 100644 index 0000000000..0f8423fcb5 Binary files /dev/null and b/content/docs/es/install-on-your-infra/network-configuration/network-explorer.png differ diff --git a/content/docs/es/install-on-your-infra/network-configuration/pending-network-alert.png b/content/docs/es/install-on-your-infra/network-configuration/pending-network-alert.png new file mode 100644 index 0000000000..5b1415da85 Binary files /dev/null and b/content/docs/es/install-on-your-infra/network-configuration/pending-network-alert.png differ diff --git a/content/docs/es/install-on-your-infra/whats-next.mdx b/content/docs/es/install-on-your-infra/whats-next.mdx new file mode 100644 index 0000000000..03ae6325b0 --- /dev/null +++ b/content/docs/es/install-on-your-infra/whats-next.mdx @@ -0,0 +1,84 @@ +--- +title: Próximos pasos +sidebar_label: Próximos pasos +sidebar_position: 6 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; +import { FiDatabase, FiBox, FiGlobe, FiServer, FiPackage, FiShield } from "react-icons/fi"; + +# Próximos pasos + +El recorrido base de importación — provider, cuentas, red y clúster — ya está completo; esto es lo que además podés traer a SleakOps desde tu infraestructura existente. + +
+ +{" "} + +
+
+ +

Dependencias

+
+

Registrá una RDS, un bucket de S3, una cola de SQS o un clúster de Redis existente que ya corre en tu cuenta de AWS.

+ Más información +
+ +{" "} + +
+
+ +

Proyectos

+
+

Adoptá un deployment existente como un Proyecto de SleakOps.

+ Más información +
+ +{" "} + +
+
+ +

Dominios

+
+

Reutilizá una hosted zone de Route53 existente para un Entorno.

+ Más información +
+ +{" "} + +
+
+ +

NodePools

+
+

Registrá un node pool de EKS existente.

+ Más información +
+ +{" "} + +
+
+ +

Addons

+
+

Importá los manifiestos de un addon, o adoptá uno que ya esté corriendo en el clúster.

+ Más información +
+ +{" "} + +
+
+ +

Addons esenciales

+
+

Adoptá en SleakOps los addons esenciales que ya existen en el clúster.

+ Más información +
+ +
diff --git a/content/docs/es/network/index.mdx b/content/docs/es/network/index.mdx index 53b0836d57..b7b85dfd97 100644 --- a/content/docs/es/network/index.mdx +++ b/content/docs/es/network/index.mdx @@ -2,7 +2,7 @@ id: networking-y-recursos-de-red title: Networking y Recursos de Red sidebar_label: Networking y Recursos de Red -sidebar_position: 6 +sidebar_position: 7 --- import Zoom from "react-medium-image-zoom"; diff --git a/content/docs/es/project/dependency/import-dependency.mdx b/content/docs/es/project/dependency/import-dependency.mdx new file mode 100644 index 0000000000..a99df72bf7 --- /dev/null +++ b/content/docs/es/project/dependency/import-dependency.mdx @@ -0,0 +1,94 @@ +--- +title: Importa una dependencia +sidebar_label: Importa una dependencia +sidebar_position: 14 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +SleakOps puede registrar una Dependencia que ya tenés en AWS — una base de datos, una cola, un bucket — en lugar de crear una desde cero. La importación descubre los recursos reales de una cuenta y adopta el que elijas sin modificarlo. + +## Tipos soportados + +Los 14 tipos de abajo están soportados para importar. Esta tabla solo indica si SleakOps necesita credenciales para conectarse — no es una columna de soportado/no soportado. + +| **Tipo** | **Requiere credenciales** | +| ---------------------- | -------------------------- | +| **PostgreSQL** | Sí | +| **MySQL** | Sí | +| **MariaDB** | Sí | +| **Oracle** | Sí | +| **Aurora MySQL** | Sí | +| **Aurora PostgreSQL** | Sí | +| **DocumentDB** | Sí | +| **RabbitMQ** | Sí | +| **MSK** | Solo para SASL/SCRAM | +| **S3 bucket** | No | +| **SQS** | No | +| **Redis** | No | +| **Memcached** | No | +| **OpenSearch** | No | + +## Descubrí e importá + +En la lista de Dependencies, hacé clic en **Import Dependency** al lado de **Create**. + + + Lista de Dependencies con el botón Import Dependency al lado de Create + + +El botón abre un diálogo de 4 pasos. + +### 1. Elegí el tipo de recurso + +Buscá y elegí uno de los tipos soportados de la tabla anterior. + +### 2. Elegí la cuenta + +Seleccioná la cuenta donde vive el recurso. Solo se listan cuentas en estado created. + +### 3. Descubrí + +SleakOps lista los recursos reales de ese tipo que encontró en la cuenta — nombre, versión del engine (o los atributos correspondientes para los tipos que no son bases de datos) y estado. Un recurso ya registrado en SleakOps aparece atenuado y deshabilitado, con un tooltip que aclara que ya está gestionado. + + + Paso de descubrimiento listando los recursos que SleakOps encontró en la cuenta, con uno seleccionado + + +### 4. Nombre, proyecto y credenciales + +Ingresá un **Name** y elegí el **Project** al que se va a asociar la dependencia. Para los tipos que requieren credenciales, ingresá el **Username** y **Password** que SleakOps va a usar para conectarse — AWS nunca expone la contraseña maestra de una instancia existente, así que estos valores no se descubren automáticamente. + + + Paso de nombre, proyecto y credenciales completo para un recurso PostgreSQL + + +Hacé clic en **Import** para iniciar el registro. SleakOps adopta el recurso en su estado de infraestructura sin modificarlo, y podés seguir el progreso desde la lista de dependencias. + +## Sincronización de configuración + +Una vez importada, la configuración de una dependencia también puede sincronizarse desde el recurso real de AWS en segundo plano — esto todavía no se dispara desde el console. + +## Preguntas frecuentes + +
+ +### ¿Importar modifica el recurso? + +No. SleakOps adopta el recurso en su estado de infraestructura sin modificarlo — solo registra lo que ya existe. +
diff --git a/content/docs/es/project/dependency/import-dependency/import-dependency-button.png b/content/docs/es/project/dependency/import-dependency/import-dependency-button.png new file mode 100644 index 0000000000..c67d94bac5 Binary files /dev/null and b/content/docs/es/project/dependency/import-dependency/import-dependency-button.png differ diff --git a/content/docs/es/project/dependency/import-dependency/import-dependency-config.png b/content/docs/es/project/dependency/import-dependency/import-dependency-config.png new file mode 100644 index 0000000000..fdea05ede1 Binary files /dev/null and b/content/docs/es/project/dependency/import-dependency/import-dependency-config.png differ diff --git a/content/docs/es/project/dependency/import-dependency/import-dependency-discovery.png b/content/docs/es/project/dependency/import-dependency/import-dependency-discovery.png new file mode 100644 index 0000000000..2f9c237cf0 Binary files /dev/null and b/content/docs/es/project/dependency/import-dependency/import-dependency-discovery.png differ diff --git a/content/docs/es/project/import-project.mdx b/content/docs/es/project/import-project.mdx new file mode 100644 index 0000000000..3055e4ddf2 --- /dev/null +++ b/content/docs/es/project/import-project.mdx @@ -0,0 +1,77 @@ +--- +title: Importa un proyecto +sidebar_label: Importa un proyecto +sidebar_position: 15 +--- + +import Zoom from "react-medium-image-zoom"; +import "react-medium-image-zoom/dist/styles.css"; +import { FiExternalLink } from "react-icons/fi"; + +:::info +Esta página cubre la importación de un recurso existente. Si todavía no conectaste tu infraestructura de AWS a SleakOps, empezá por [Instala SleakOps en tu infraestructura](/docs/install-on-your-infra). +::: + +SleakOps puede adoptar un deployment que ya corre en un clúster como un Proyecto administrado, en vez de crearlo desde cero. La importación descubre los Helm releases que el clúster corre fuera de SleakOps y mapea uno de ellos en workloads y manifiestos. + +## Descubrí un release para importar + +En la pantalla de Proyectos, hacé clic en **Import Project** junto a **Create**. Esto abre el mismo diálogo de descubrimiento que se usa para importar addons: elegí el clúster a inspeccionar, y SleakOps lista los Helm releases que corren ahí y que todavía no están administrados por SleakOps. Elegí uno para continuar. + + + Diálogo de importación de proyecto desde clúster listando Helm releases no administrados + + +## Preview: qué detecta SleakOps + +SleakOps mapea determinísticamente los documentos del release en workloads — web service, worker, cron job o hook — más cualquier manifiesto compartido por todo el proyecto. Lo que no pudo mapear queda en una lista de **Not included**, cada uno con su motivo. Un botón opcional **Improve mapping with AI** vuelve a correr el mapeo con un LLM como alternativa, si el resultado determinístico necesita ajustarse. + + + Paso de preview mostrando el release mapeado en un workload con sus manifiestos + + +El release original sigue corriendo intacto. Esto crea un proyecto administrado por SleakOps en su propio namespace, en paralelo — sus pods usan la service account de SleakOps, así que hay que otorgar cualquier acceso a AWS que la app necesite a través de Dependencias. Pasar el tráfico al proyecto administrado es un paso manual. + +## Completá los datos del proyecto + +Hacé clic en **Continue** para completar el nuevo proyecto: + +| **Campo** | **Descripción** | +| ---------------------- | -------------------------------------------------------------------------------- | +| **Project name** | Prellenado a partir del nombre del release, slugificado. Editable. | +| **Environment** | El Entorno del clúster elegido en el que se va a desplegar. | +| **Nodepool** | El node pool del clúster elegido en el que van a correr los workloads. | +| **Branch** | La rama de Git desde la que se construye. | +| **Repository** | El repositorio de Git desde el que se construye — requiere una integración de Git configurada. | +| **Build method** | Docker o Buildpack. | +| **Dockerfile path** | Solo para el método Docker. | + +Environment y Nodepool listan los recursos reales del clúster que elegiste en el paso de descubrimiento. + + + Paso de detalles con nombre de proyecto, entorno, nodepool, rama y método de build completos + + +Hacé clic en **Import** para crear el proyecto. + +## Qué queda manual + +El nuevo proyecto se construye desde el repositorio que elijas y se despliega con los manifiestos mapeados desde el release. El release original no se modifica — sigue sirviendo tráfico por su cuenta hasta que decidas pasarte al proyecto administrado. Enrutar tráfico real hacia el proyecto administrado es un paso manual, fuera de SleakOps. + +## FAQs + +
+ +### ¿Qué pasa con el release original? + +Nada. El release original sigue corriendo intacto en su propio namespace. SleakOps crea un proyecto nuevo y separado en paralelo — pasar el tráfico al proyecto administrado es un paso manual que tomás cuando estés listo. +
diff --git a/content/docs/es/project/import-project/import-project-details.png b/content/docs/es/project/import-project/import-project-details.png new file mode 100644 index 0000000000..c8edcf9e74 Binary files /dev/null and b/content/docs/es/project/import-project/import-project-details.png differ diff --git a/content/docs/es/project/import-project/import-project-entry.png b/content/docs/es/project/import-project/import-project-entry.png new file mode 100644 index 0000000000..715adf8834 Binary files /dev/null and b/content/docs/es/project/import-project/import-project-entry.png differ diff --git a/content/docs/es/project/import-project/import-project-preview.png b/content/docs/es/project/import-project/import-project-preview.png new file mode 100644 index 0000000000..b3c661d069 Binary files /dev/null and b/content/docs/es/project/import-project/import-project-preview.png differ diff --git a/content/docs/es/project/index.mdx b/content/docs/es/project/index.mdx index daee081895..1dc12424c0 100644 --- a/content/docs/es/project/index.mdx +++ b/content/docs/es/project/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 7 +sidebar_position: 8 sidebar_label: Projecto pagination_next: project/dependency/index --- diff --git a/content/docs/es/provider/index.mdx b/content/docs/es/provider/index.mdx index 4c9127c9b6..c52221f416 100644 --- a/content/docs/es/provider/index.mdx +++ b/content/docs/es/provider/index.mdx @@ -1,5 +1,5 @@ --- -sidebar_position: 4 +sidebar_position: 5 pagination_next: provider/schemas --- diff --git a/static/admin/config.yml b/static/admin/config.yml index a24db78b5e..89beb92adf 100644 --- a/static/admin/config.yml +++ b/static/admin/config.yml @@ -50,6 +50,35 @@ collections: } - { name: body, label: Body, widget: markdown, i18n: true } + # Install on your infra + - name: docs-install-on-your-infra + label: "Install on your infra" + icon: download + folder: content/docs + path: "install-on-your-infra/{{slug}}" + create: true + extension: mdx + format: frontmatter + i18n: true + identifier_field: title + fields: + - { name: title, label: Title, widget: string, i18n: true } + - { + name: sidebar_label, + label: Sidebar Label, + widget: string, + required: false, + i18n: true, + } + - { + name: sidebar_position, + label: Sidebar Position, + widget: number, + required: false, + i18n: duplicate, + } + - { name: body, label: Body, widget: markdown, i18n: true } + # Cluster - name: docs-cluster label: "Cluster"