diff --git a/Makefile b/Makefile index 43bf5271..c6576e6e 100644 --- a/Makefile +++ b/Makefile @@ -6,5 +6,5 @@ help: yarn-install: .PHONY yarn -web: yarn ## runs the docs site locally +web: ## runs the docs site locally yarn dev \ No newline at end of file diff --git a/pages/adding-new-application/background-app-install.md b/pages/adding-new-application/background-app-install.md index f6ea7a30..8408e6ad 100644 --- a/pages/adding-new-application/background-app-install.md +++ b/pages/adding-new-application/background-app-install.md @@ -6,7 +6,7 @@ description: >- In this guide we will lay out how your user provided values tie in with the deployment process as it relates to the configuration and templating of the app. -When a user sets up a new Plural workspace in a git repository (we'll call that a *deployment repository* going forward) a `workspace.yaml` file is created that stores global values for that cluster such as the cloud account and region, the cluster and VPC name and what subdomain all the applications will be hosted under. +When a user sets up a new Plural workspace in a git repository (we'll call that a _deployment repository_ going forward) a `workspace.yaml` file is created that stores global values for that cluster such as the cloud account and region, the cluster and VPC name and what subdomain all the applications will be hosted under. Next, the user can install an application bundle using the `plural bundle install ` CLI command. > Most applications come with more than one bundle, one for each targeted cloud provider. @@ -32,6 +32,7 @@ $ tree -L 1 . ``` The `workspace.yaml` would look like this: + ```yaml apiVersion: plural.sh/v1alpha1 kind: ProjectManifest @@ -40,7 +41,7 @@ metadata: spec: cluster: pluraldev bucket: pluraldevsh-tf-state - project: "123456765432" + project: '123456765432' provider: aws region: us-east-2 owner: @@ -53,6 +54,7 @@ spec: ``` And the `context.yaml` like this. In the `spec.configuration` section you can see the recorded user input for each artifact. + ```yaml apiVersion: plural.sh/v1alpha1 kind: Context diff --git a/pages/adding-new-application/index.md b/pages/adding-new-application/index.md index 38de0b4a..35cae941 100644 --- a/pages/adding-new-application/index.md +++ b/pages/adding-new-application/index.md @@ -9,4 +9,4 @@ description: >- If you want to contribute your own application to the Plural marketplace we invite you to create and publish your own artifacts. In this section we guide you through the ins and outs of Plural's application artifacts, how you can build your own with the tools that Plural provides you, and how you can publish them for others to use. -> We are focused on properly compensating any contributions to the Plural platform, which includes a meaningful [bounty](https://github.com/pluralsh/plural-artifacts#plural-contributor-program). \ No newline at end of file +> We are focused on properly compensating any contributions to the Plural platform, which includes a meaningful [bounty](https://github.com/pluralsh/plural-artifacts#plural-contributor-program). diff --git a/pages/adding-new-application/plural-artifact-structure.md b/pages/adding-new-application/plural-artifact-structure.md index d0e210bd..f32a79d0 100644 --- a/pages/adding-new-application/plural-artifact-structure.md +++ b/pages/adding-new-application/plural-artifact-structure.md @@ -7,6 +7,7 @@ description: >- As mentioned in [Background on Application Installations](/adding-new-application/background-app-install), the Plural CLI creates a wrapper Helm chart and Terraform module for each installed application and inputs the user provided values for that installation. Some extra configuration files are necessary in the application's artifact for the Plural API to be able to understand: + - the Helm charts and Terraform modules dependencies to run them through its templating engine - dependencies on other Plural artifacts - platform specific components and infrastructure configurations @@ -83,8 +84,7 @@ $ tree . └── vendor_images.yaml ``` -Let's disect this artifact's structure. - +Let's dissect this artifact's structure. ## Helm @@ -105,7 +105,8 @@ Plural leverages dependency tracking of applications to achieve a high degree of Dependencies between artifacts are defined in the recipe files (see below). Dependencies are also tracked between the Helm charts and Terraform modules of other applications in a dedicated `deps.yaml` file in each chart's or module's directory. For example, for Dagster's Helm chart you would list required dependencies on: -- the `bootstrap` application's Helm chart + +- the `bootstrap` application's Helm chart - the `ingress-nginx` application's Helm chart - the `postrges` operator application's Helm chart @@ -120,33 +121,33 @@ metadata: spec: breaking: true dependencies: - - type: helm - name: bootstrap - repo: bootstrap - version: '>= 0.5.1' - - type: helm - name: ingress-nginx - repo: ingress-nginx - version: ">= 0.1.2" - - type: helm - name: postgres - repo: postgres - version: ">= 0.1.6" - - type: terraform - name: aws - repo: dagster - version: '>= 0.1.0' - optional: true - - type: terraform - name: azure - repo: dagster - version: '>= 0.1.0' - optional: true - - type: terraform - name: gcp - repo: dagster - version: '>= 0.1.0' - optional: true + - type: helm + name: bootstrap + repo: bootstrap + version: '>= 0.5.1' + - type: helm + name: ingress-nginx + repo: ingress-nginx + version: '>= 0.1.2' + - type: helm + name: postgres + repo: postgres + version: '>= 0.1.6' + - type: terraform + name: aws + repo: dagster + version: '>= 0.1.0' + optional: true + - type: terraform + name: azure + repo: dagster + version: '>= 0.1.0' + optional: true + - type: terraform + name: gcp + repo: dagster + version: '>= 0.1.0' + optional: true ``` ## Terraform @@ -157,9 +158,10 @@ Most commonly you'd find object storage alongside their IAM resources, or additi Sometimes it will also include Kubernetes resources like service accounts, if their deployment cannot be achieved through the artifact's Helm chart in a convenient manner. > One peculiarity about the Terraform modules is that, at the very least, they need to contain the Kubernetes namespace for your application. - This is because during a `plural deploy` with the Plural CLI the `terraform apply` will always run before the `helm install` step. +> This is because during a `plural deploy` with the Plural CLI the `terraform apply` will always run before the `helm install` step. Just like the Helm chart, the Terraform modules also contain a `deps.yaml` file that inform the Plural API about dependencies on other modules. + ``` apiVersion: plural.sh/v1alpha1 kind: Dependencies @@ -176,7 +178,6 @@ spec: - aws ``` - ## Plural Files The `plural` directory contains the artifact's packaging information (`plural/recipes`), metadata (`plural/tags` and `plural/icons`), and application specific instructions (`plural/docs` and `plural/notes.tpl`). @@ -185,6 +186,7 @@ On the top-level directory of each artifact you'll also find a`repository.yaml`. The `repository.yaml` and recipe YAMLs are an integral part of Plural's artifact packaging format. ### `repository.yaml` + ```yaml name: dagster description: A data orchestration platform for the development, production, and observation of data assets. @@ -199,9 +201,9 @@ oauthSettings: uriFormat: https://{domain}/oauth2/callback authMethod: POST tags: -- tag: dag -- tag: data -- tag: data-pipelines + - tag: dag + - tag: data + - tag: data-pipelines ``` The metadata in this file informs the Plural API about the application this artifact envelopes. @@ -209,43 +211,45 @@ It will store its name, category and description, where it can find the icon and the notes template to prompt after installation, as well as links to any upstream git repository or homepage (if applicable). `oauthSettings` specifies the URI format for the OIDC callback address and informs the Plural API how to setup the OIDC endpoint for your application if you use it. + > Behind the scenes, every `plural bundle install` triggers the OIDC client creation when you answer with `yes` on the OIDC prompt. - This happens, because every client needs to be created before a `plural build` which then inputs the client info into the helm chart. +> This happens, because every client needs to be created before a `plural build` which then inputs the client info into the helm chart. The `private` flag controls whether the artifact's bundles are published publicly or privately on a `plural push` or `plural apply` (see [Publishing](/adding-new-application/publishing)). ### `plural/recipes/dagster-aws.yaml` + ```yaml name: dagster-aws description: Installs dagster on an aws eks cluster provider: AWS primary: true dependencies: -- repo: bootstrap - name: aws-k8s -- repo: ingress-nginx - name: ingress-nginx-aws -- repo: postgres - name: aws-postgres + - repo: bootstrap + name: aws-k8s + - repo: ingress-nginx + name: ingress-nginx-aws + - repo: postgres + name: aws-postgres oidcSettings: uriFormat: https://{domain}/oauth2/callback authMethod: POST domainKey: hostname sections: -- name: dagster - configuration: - - name: dagsterBucket - type: BUCKET - documentation: s3 bucket for storing dagster logs - default: dagster - - name: hostname - type: DOMAIN - documentation: fqdn on which to deploy your dagster instance - items: - - type: TERRAFORM - name: aws - - type: HELM - name: dagster + - name: dagster + configuration: + - name: dagsterBucket + type: BUCKET + documentation: s3 bucket for storing dagster logs + default: dagster + - name: hostname + type: DOMAIN + documentation: fqdn on which to deploy your dagster instance + items: + - type: TERRAFORM + name: aws + - type: HELM + name: dagster ``` The recipe file ties a bundle together, with one dedicated recipe per cloud provider. diff --git a/pages/adding-new-application/publishing.md b/pages/adding-new-application/publishing.md index 2b85f503..22e5a11a 100644 --- a/pages/adding-new-application/publishing.md +++ b/pages/adding-new-application/publishing.md @@ -11,16 +11,17 @@ To publish an artifact you first need to create a publisher with your Plural acc 1. Click on your profile on the bottom left on `app.plural.sh`. 2. Select `create publisher`. -3. Enter your information. +3. Enter your information. 4. Hit save. ## Publish an Artifact with the Plural CLI -When you're done with implementing your artifact and you have created a publisher you're ready to publish it. +When you're done with implementing your artifact and you have created a publisher you're ready to publish it. 1. Navigate to the directory of your artifact in your local copy of the [Plural artifacts git repository](https://github.com/pluralsh/plural-artifacts). 2. Locate the `Pluralfile`. 3. Enter the name of your publisher as the first argument in the `ATTRIBUTES` line. E.g. if your publisher is called `mypublisher`, it should look like this: + ``` REPO dagster ATTRIBUTES mypublisher repository.yaml @@ -29,7 +30,9 @@ TF terraform/* HELM helm/* RECIPE plural/recipes/* ``` + 4. Finally, publish your artifact with the command `plural apply -f Pluralfile`. E.g. for our dagster example + ```console $ plural apply -f Pluralfile Setting attributes for dagster diff --git a/pages/deployments/addons.md b/pages/deployments/addons.md new file mode 100644 index 00000000..57e356a4 --- /dev/null +++ b/pages/deployments/addons.md @@ -0,0 +1,17 @@ +--- +title: Kubernetes Add-Ons +description: Extend Kubernetes to support load balancing, dns, monitoring and security +--- + +Kubernetes natively is just a container orchestrator, but it's apis can be easily extended to support many other major concerns within the DevOps space. Some of the more common usecases we currently support are: + +- Networking - you need load balancers, dns, and cert management to build a full production service exposed to the outside world. We can deploy all the operators and controllers needed to get this set up in a fully self-service way. +- Monitoring - inject agents from Datadog, New Relic, Prometheus and other providers to provide observability to your fleet +- Security - tools like Trivy and Kubescape can continuously monitor clusters for vulnerabilities and enhance your security posture. +- Cost Monitoring - deploy the kubecost agent to give you coherent cost dashboards for your entire fleet + +All of these will be constantly updated and maintained by us, you just need to perform the initial configuration via our wizards. + +You can see all the addons we support in the `Add Ons` tab of Plural Deployments, as seen here: + +![](/assets/deployments/addons.png) diff --git a/pages/deployments/architecture.md b/pages/deployments/architecture.md new file mode 100644 index 00000000..2c9b8521 --- /dev/null +++ b/pages/deployments/architecture.md @@ -0,0 +1,35 @@ +--- +title: Plural CD Architecture +description: Secure, Scalable Pull-Based Architecture +--- + +## Overview + +Plural CD is based on a scalable, secure, agent-based pull architecture. It doesn't require direct access to any of the clusters it deploys to, meaning it can manage workloads in any cloud, on-prem, on the edge, or even on a local laptop running KIND. Further since it doesn't require networking intensive kubernetes watch streams, central access to kubernetes, or relies on single-mastered operator control loops, it should scale to virtually any size kubernetes fleet. We also enhance your kubernetes setup with a auth proxy, allowing you to have full visibility to your workloads without compromising the network security of your setup or require the creation of complex multi-cloud networking setups. + +Here's a quick diagram of the setup: + +![](/assets/deployments/architecture.png) + +## Control Plane + +The Control Plane layer is a full-stack service deployable onto any kubernetes cluster you designate as your management cluster. It contains a few main components: + +- Horizontally scalable git cache - we should be able to ingest as many git repos as you'd like and auto-shard them throughout your cluster automatically and efficiently. +- Configuration Management - supports re-configurable backends, but allows you to easily parameterize services with information like hostnames, docker image tags, and other secret and non-secret information. +- Auth Proxy - this is a secure bidirectional grpc channel initiated by a deployment agent used to make kubernetes api calls no matter where a cluster may live and give you full dashboarding capabilities from the Plural CD UI. +- Cluster API Providers - Plural CD natively integrates with cluster api and allows you to create and manage new clusters at scale and fork your own kubernetes cluster APIs on top of existing setups for services like EKS, AKS and GKE or on-prem solutions like Rancher + +We provide simple installers if you'd like to deploy the control plane layer to a kubernetes cluster already in your fleet, or you can use our own kubernetes setup in the standard plural install flow. + +## Deployment Agent + +A thin deployment agent is installed onto each cluster and perpetually managed by Plural CD from then on. It will perpetually poll the control plane for new services to apply and if there are any changes to make, apply them into your cluster. It also can do a few other things like: + +- establish the bidectional grpc channel for the auth proxy layer (this does require an ingress with websocket support) +- execute integration tests + +There were a few design considerations involved in our agent that are worth understanding as well: + +- The expectation is the agent is deployed independently at scale, potentially hundreds of times for a large organization, so it must be maximally simple to reduce operational complexity to near 0. +- It is designed to be extensible to arbitrarily many frameworks for defining kubernetes manifests. We aren't actually huge fans of helm or kustomize and want organizations to have the flexibility to ultimately use other toolchains for managing their kubernetes YAML codebase (or ultimately de-YAML themselves) diff --git a/pages/deployments/browser-quickstart.md b/pages/deployments/browser-quickstart.md new file mode 100644 index 00000000..a259661b --- /dev/null +++ b/pages/deployments/browser-quickstart.md @@ -0,0 +1,53 @@ +--- +title: Plural CD In-Browser Quickstart +description: Deploying your services using the Plural Console UI. +--- + +## Overview + +This guide goes over how to deploy your services with Plural using the Plural Console UI. At the end of this tutorial, you will have: + +- Provisioned new clusters, and/or deployed the Plural Deployment Operator on your existing clusters. +- Imported the Git repositories containing your code and manifests. +- Deployed your code onto your clusters of choice. +- Optionally updated any configurations and permissions for the clusters and services. + +in under 30 minutes, all within your browser. You can see the process in the video here or follow the instructions step-by-step: + +{% embed url="https://www.youtube.com/watch?v=jBlq45ntbBw" aspectRatio="16 / 9" /%} + +## Onboard to Plural and install the Plural Console + +If you haven't already, you'll need to follow the Plural guide to install Console. You can use the guide for the [in-browser Cloud Shell](/getting-started/cloud-shell-quickstart) or the [CLI](/getting-started/quickstart) to get started. + +## Log in to Console and Add Clusters + +Once you've logged in to Plural Console, you can click the "Continuous deployment" tab to set up your clusters. By default, you should see the cluster that your Console is deployed on. + +To deploy additional clusters, click the "Create cluster" button in the top right. To spin up a new cluster, fill in the required fields: + +![](/assets/deployments/create-cluster.png) + +To import an existing cluster, select the "Import existing" toggle and add a name, handle, and any tags. You then need to run the following command on the cluster itself to install the Plural Deploy Operator: + +``` +plural cd install --url https:///ext/gql --token +``` + +Make sure your kubeconfig points to the desired cluster for import. More information is available in the guide for [existing clusters](/deployments/existing-cluster). + +Once you've added the required clusters, you should see them populated on the "Clusters" subtab within your Console. + +## Import Git Repositories and Deploy services + +You'll need to then import the Git repository containing your service and the associated Kubernetes manifests. Click the "Git repositories" subtab, and hit the "Import Git" button in the top right. + +![](/assets/deployments/import-git.png) + +Add the url of the repo and authorization if necessary, and hit import. Once your service is pullable, you can deploy it to your clusters. + +Navigate to the "Services" subtab and click "Deploy service". Add a name and namespace and select the cluster you want to deploy to. You can then select the relevant repository and add any secrets necessary to parameterize the deployment. + +Your service should populate initially as `Stale` until your components are Ready, at which point they will flip to `Healthy`. + +Congratulations! You've deployed your first service with Plural. diff --git a/pages/deployments/ci-gh-actions.md b/pages/deployments/ci-gh-actions.md new file mode 100644 index 00000000..46284a16 --- /dev/null +++ b/pages/deployments/ci-gh-actions.md @@ -0,0 +1,34 @@ +--- +title: Github Actions Example +description: Call Plural CD from a simple Github Actions workflow +--- + +## Overview + +We've built a basic FastApi [example app](https://github.com/pluralsh/plrl-cd-demo) to demonstrate how to easily integrate Plural Deployments with Github actions. The app itself just has a single api to echo it's current git commit. As far as the Github Actions setup, it is a fairly representative pipeline that does: + +- a quick unit test to check correctness +- builds a docker image (using the docker/setup-metadata action for tagging). +- takes the sha tag from the deployed image and applies it to our example Plural service + +Here's a link to the example [code](https://github.com/pluralsh/plrl-cd-demo). The README there is pretty thorough and worth diving, but we can give the tldr here. + +This model allows you to let your CI system what it does best, test code and build deployable artifacts, and then allow our CD solution to handle the longer duration and security-intensive task of deployment from there. + +## Kubernetes Manifest setup + +The manifests for the service are defined at `/kubernetes`. It's a fairly simple service with a `Deployment`, which runs 2 replicas of the api server, a `Service` which sets up internal network access to the server pods, and an `Ingress`, which sets up external load balancing to that service and also configures dns + tls certificates through integration with external-dns and cert-manager. There is also templating built-in to allow the service to be parameterized by `hostname` and by `tag`. These are stored as service secrets. + +## Actions Setup + +The action is defined at `.github/workflows/push.yaml`. The final step of the workflow calls the `plural cd services update` command that rewires the service to use the current sha. The command in longform is: + +```sh +plural cd services update @{cluster-handle}/{service-name} --conf {name}={value} --conf {name2}={value2} ... +``` + +Feel free to run `plural cd services update --help` for more documentation as well. + +## Addendum + +Since the plural cli is a standalone go binary, it can easily be injected in any CI framework in much the same way by installing it and the executing the appropriate cli command to modify your service once a deployable artifact has been built. diff --git a/pages/deployments/ci-overview.md b/pages/deployments/ci-overview.md new file mode 100644 index 00000000..047e440a --- /dev/null +++ b/pages/deployments/ci-overview.md @@ -0,0 +1,22 @@ +--- +title: CI Integration +description: Deploying your services using the Plural Console UI. +--- + +## Overview + +Plural CD is meant to help you separate the concerns around software delivery and deployment from your CI provider, which is usually purpose built for running unit tests and compiling build artifacts. There are some major motivations for this separation, among them being: + +- Deployment is frequently a much longer running process than a standard code change, encompassing staged releases across multiple environments with multiple rounds of integration testing. +- A seperated CD system can make it easy to manage drift in micro-service dependencies by allowing them to be tested in tandem and rolled back independently. +- Separating CD enhances your security posture by not requiring master creds in a build service like Jenkins or a cloud service like Circle-CI. +- A Central CD service drastically simplifies managing polymorphic infrastructure providers, as a pull based architecture naturally can extend to multi-cloud or on-prem delivery models. + +We rely on two models for doing delivery, full GitOps, where the definition of a service is fully specified in Git, and parameterized GitOps, in which case you can define templated manifests and use our service configuration to inject variables like docker image tags, hostnames, etc to parameterize your service. + +The parameterized model enables a few useful operational models, namely: + +- Updating docker image tags for a service after a successful merge to `main`, then releasing it down a deployment pipeline. +- Deep-cloning a service to create a pull-request based environment, while only changing a hostname. +- Full rollbacks/roll-forwards of configuration in the inevitable event of an engineer misconfiguring a service +- Importing state from terraform/pulumi into one of your CD services. diff --git a/pages/deployments/ci.md b/pages/deployments/ci.md new file mode 100644 index 00000000..6cdbf854 --- /dev/null +++ b/pages/deployments/ci.md @@ -0,0 +1,4 @@ +--- +title: Integrate with Your CI +description: How to integrate Plural CD with your CI Provider, like Github Actions, Jenkins, or CircleCI +--- diff --git a/pages/deployments/cli-quickstart.md b/pages/deployments/cli-quickstart.md new file mode 100644 index 00000000..f6b5d7d0 --- /dev/null +++ b/pages/deployments/cli-quickstart.md @@ -0,0 +1,63 @@ +--- +title: Plural CD CLI Quickstart +description: Deploying your services using the Plural CLI. +--- + +## Overview + +This guide goes over how to deploy your services with the Plural CLI. At the end of this tutorial, you will have: + +- Provisioned new clusters, and/or deployed the Plural Deployment Operator on your existing clusters. +- Imported the Git repositories containing your code and manifests. +- Deployed your code onto your clusters of choice. +- Optionally updated any configurations and permissions for the clusters and services. + +## Onboard to Plural and install the Plural Console + +If you haven't already, you'll need to follow the Plural guide to install Console. You can use the guide for the [in-browser Cloud Shell](/getting-started/cloud-shell-quickstart) or the [CLI](/getting-started/quickstart) to get started. + +{% callout severity="info" %} +`plural cd` is an alias for `plural deployments`, and can be used interchangeably within the CLI. +{% /callout %} + +## Set Environment Variables + +If you haven't already, you'll need to set your Console URL and Console token. Set them with: + +``` +PLURAL_CONSOLE_URL +PLURAL_CONSOLE_TOKEN +``` + +## Create Clusters + +To deploy additional clusters, use the `plural cd clusters create` command. As an example: + +``` +plural cd clusters create --handle --version CLUSTER_NAME +``` + +To import an existing cluster, see the guide for [existing clusters](/deployments/existing-cluster). + +## Import Git Repositories and Deploy services + +You'll need to then import the Git repository containing your service and the associated Kubernetes manifests. To do so, use `plural cd repositories create`: + +``` +plural cd repositories create --url +``` + +Optionally add flags for Github authorization if necessary. + +To then deploy your service, find the repo ID for the service you want to deploy using `plural cd repositories list`. + +You can then use the `plural cd services create` command: + +``` +plural cd services create --name --namespace --repo-id --git-ref --git-folder CLUSTER_ID + +``` + +See deployed services with the `plural cd services list` command. Your service should populate initially as `Stale` until your components are Ready, at which point they will flip to `Healthy`. + +Congratulations! You've deployed your first service with Plural. diff --git a/pages/deployments/cluster-config.md b/pages/deployments/cluster-config.md new file mode 100644 index 00000000..40bc5250 --- /dev/null +++ b/pages/deployments/cluster-config.md @@ -0,0 +1,4 @@ +--- +title: Configure my Cluster +description: XXX +--- diff --git a/pages/deployments/cluster-cost.md b/pages/deployments/cluster-cost.md new file mode 100644 index 00000000..f5b126bd --- /dev/null +++ b/pages/deployments/cluster-cost.md @@ -0,0 +1,42 @@ +--- +title: Optimize Cluster Costs +description: Guidance on Cost Optimization +--- + +Generally managing Kubernetes costs can be a bit tricky, and there's a few things to understand: + +- how the kubernetes node autoscaler works +- how to distinguish base/variable load +- how to optimize with spot instances + +In addition, you'll likely want to implement some tooling to add cost visibility to your fleet. + +## Install Kubecost on a Plural Cluster + +We have a packaged add-on for installing the kubecost cloud agent to any Plural-ingested kubernetes cluster. You'll first want to set up an account on [Kubecost Cloud](https://www.kubecost.com/products/kubecost-cloud/) and then they'll give you some instructions for installing there agent including an agent key. Copy that key, then go to the add-ons tab of Plural Deployments, and click the `kubecost-cloud` add-on. It will ask for that key, enter it in, and click install. + +We recommend you configure it as a global service, as that will ensure it's installed and confgured for your entire fleet going forward. + +## How Kubernetes Node Autoscaling Works + +Kubernetes has its own mechanism of managing autoscaling. Instead of using familiar patterns like EC2 autoscaling groups, ultimately keyed on CPU or memory utilization, kubernetes will add or removed nodes based on whether there are outstanding pods that cannot be scheduled to any worker given the currently configured pod requests. + +There are also some other constraints that kubernetes will cause autoscaling for, eg pods that have scheduling constraints preventing them to be scheduling on the same nodes as other (thus requiring a new node), pods that must be in a specific availability zone or other node pool, pods that must remain due to a PodDisruptionBudget. + +This does lead to much more powerful autoscaling constructs but can lead to a bit of confusion for new users. To leverage kubernetes autoscaling properly you'll need to be sure you're putting sane resource requests on your pods and also have some of those edge cases in mind. + +## Base vs Variable Load + +In general, you should always have a firm grasp of the evergreen load needed to run your systems. This is usually non-zero since most programming languages will require some amount of memory to boot and you'll likely want your service on 24/7. Disaggregating these two concepts will make it easier for you to safely purchase reserved instances with your cloud, leading to this model: + +- accurately understand base load and purchase full RIs for the entirety of it to lock in that cost +- tune autoscaling to meet any variability (mid-day peaks, seasonality) at minimal cost using on-demand instances + +## Spot Instances + +Spot instances can radically reduce the cost of some workloads, but they due have significant drawbacks. + +- you might not be able to provision them due to market conditions +- you can lose the spot instance at any time due to being outbid + +If you have one-off, batch workloads that have relatively low latency (single-digit hours maximum), then those are ideal candidates for spot instance targeting. Examples we've seen are airflow dag jobs, background crons, and occasionally ETL syncs (although they can sometimes be long-running enough to be risky). We'd recommend learning and leveraging the kubernets `Job` and `CronJob` apis if you have any of these patterns, and then potentially configuring them to run on spot. diff --git a/pages/deployments/cluster-create.md b/pages/deployments/cluster-create.md new file mode 100644 index 00000000..ec650001 --- /dev/null +++ b/pages/deployments/cluster-create.md @@ -0,0 +1,38 @@ +--- +title: Create Workload Clusters +description: Spawn New Clusters with Cluster API +--- + +## Overview + +Plural supports both a Bring-Your-Own-Kubernetes model of cluster creation, and the ability to do full provisioning and lifecycle management of Kubernetes with Cluster API. If you'd rather define your clusters yourself using tools like terraform or Pulumi, feel free to check out the docs [here](deployments/import-cluster). + +There are two tiers of cluster within Plural CD: + +- Management Cluster - where the Plural control plane resides and also where CAPI controllers will reside. You are free to use this to host other services if you like, but security/reliability best-practices would suggest you at least segregate it from production systems +- Workload Cluster - where main production/staging services are hosted + +Seperating workloads at the kubernetes cluster level has the benefit of minimizing the risk of bad kubernetes upgrades and allowing seperate teams/organizations to manage their resources without compromising others. That said if you don't have a strong handle on managing kubernetes at-scale, the operational overhead at the kubernetes level will make that model costly. Hopefully we can help minimize that. + +## Create In-Browser + +You can create a new cluster entirely in-browser by first clicking the `Create Cluster` button and filling out the form we provider, it should look something like: + +![](/assets/deployments/create-cluster.png) + +Clusters have both names and unique, human readable handles, the name is not guaranteed unique, since cloud providers don't enforce that across project/account/subscriptions. The handle is optional and will default to the name unless otherwise provided. + +Generally there will be some basic cloud-specific cluster metadata, and then you can also configure the general structure of your node topology as well, the main concerns there being: + +- node type +- min/max size +- whether to use spot nodes +- labels/taints to use for workload targeting criteria + +## Configure Deletion Protection + +If you click on a cluster and go to its properties page, you should be able to add delete protection to a cluster, which must be manually disabled before any cluster delete calls can succeed + +## Create Using Terraform + +Coming Soon! diff --git a/pages/deployments/cluster-destroy.md b/pages/deployments/cluster-destroy.md new file mode 100644 index 00000000..d64318d1 --- /dev/null +++ b/pages/deployments/cluster-destroy.md @@ -0,0 +1,25 @@ +--- +title: Destroy the Cluster Safely +description: Drain and Remove your Clusters +--- + +## Deletion Models + +Plural supports two deletion models: + +- drain - this will first delete all services in Plural CD before finally proceeding to deregister the cluster if BYOK or destroy it via Cluster API if it was a cluster api cluster +- soft - this will leave all the services in-place and simply remove the reference to the cluster in our system. You'll want to manually uninstall the agent in that cluster as well. This is meant primarily for BYOK clusters. + +Before deleting your cluster, you should decide on which you'd prefer to do, if it's a full deletion, we'd recommend draining as it will ensure all load balancers/volumes are swept up upon cluster deletion + +## Delete a cluster In-Browser + +In the cluster list, you can delete a cluster by clicking the trash icon next to it. This will open a confirmation modal and if chosen, will proceed with deletion. + +## Delete a cluster via cli + +You can delete a cluster with the cli using: + +```sh +plural cd clusters delete @ +``` diff --git a/pages/deployments/clusters.md b/pages/deployments/clusters.md new file mode 100644 index 00000000..48bdf4f7 --- /dev/null +++ b/pages/deployments/clusters.md @@ -0,0 +1,17 @@ +--- +title: Cluster Management +description: Manage a Kubernetes Fleet at Scale with Cluster API, or at your own pace +--- + +## Overview + +Plural supports creation and management of new clusters using [Cluster API](https://cluster-api.sigs.k8s.io/). This provides a full kubernetes control loop for creating, upgrading and deleting kubernetes clusters, with the ability to declaratively define your cluster topology using Cluster CRDs. We've found operating kubernetes using standard toolchains have underappreciated error patterns, and CAPI can help resolve these issues. It also allows you to create a reusable, declarative api for your companies own flavor of Kubernetes, ultimately backed by familiar services like EKS, AKS, or GKE, or if you're running on-prem, solutions like Rancher or OpenStack. + +That said we also support [importing](/deployments/import-cluster) clusters you manage yourself, no matter where they might live by installing our agent and registering it with our apis. The CAPI pattern might be good for you if you have a few of these needs though: + +- need a fully repeatable way to provision new kubernetes environments +- are operating in multi-cloud environments, and want a unified kubernetes management plane +- are operating on-prem and want a robust kubernetes provisioner (talk with us if this is your usecase and we can help) +- want to have the ability to spin up ephemeral kubernetes clusters and gracefully spin them down + +If you're interested, you can find more information on our website at [https://www.plural.sh/plural-deployments-early-access](https://www.plural.sh/plural-deployments-early-access). diff --git a/pages/deployments/cost-addons.md b/pages/deployments/cost-addons.md new file mode 100644 index 00000000..9b74d417 --- /dev/null +++ b/pages/deployments/cost-addons.md @@ -0,0 +1,10 @@ +--- +title: Cost Management Setup +description: Set up Kubecost Cloud +--- + +## Kubecost Cloud Agent + +Kubecost is the most mature kubernetes-focused cost management solution, and Kubecost Cloud is the most turnkey way to get going with it in a multi-cluster fleet. To install Kubecost you'll first want to create an account [here](https://www.kubecost.com/products/kubecost-cloud/) and you'll be given an agent key. Save that, then install the `kubecost-cloud` addon in our addon library, providing that agent key. + +You can then configure a global service to replicate the agent throughout your fleet automatically. diff --git a/pages/deployments/credentials.md b/pages/deployments/credentials.md new file mode 100644 index 00000000..4a5fc918 --- /dev/null +++ b/pages/deployments/credentials.md @@ -0,0 +1,20 @@ +--- +title: Create Provider Credentials +description: Set Up a New Cloud Provider +--- + +## Create In-Browser + +When you set up your cluster with Plural, we'll initialize the cluster with a bootstrap CAPI provider. This will look something like: + +![](/assets/deployments/cluster-providers.png) + +You'll be able to use that out-of-the-box to create new clusters in the same cloud as you might like. If you'd want to add a new cloud, you'll want to click the `Create Provider` button, then enter the credentials needed for the CAPI provider to authorize: + +![](/assets/deployments/create-provider.png) + +Once created, you'll be able to see a new service named `capi-{cloud}` in your management cluster which is the kubernetes controller and other resources needed to spawn that provider. When the service is fully healthy new clusters will be able to be created. + +## Create using Terraform + +Coming Soon! diff --git a/pages/deployments/debugging.md b/pages/deployments/debugging.md new file mode 100644 index 00000000..75422b86 --- /dev/null +++ b/pages/deployments/debugging.md @@ -0,0 +1,4 @@ +--- +title: Debugging +description: XXX +--- diff --git a/pages/deployments/deprecations.md b/pages/deployments/deprecations.md new file mode 100644 index 00000000..9e0b8a21 --- /dev/null +++ b/pages/deployments/deprecations.md @@ -0,0 +1,16 @@ +--- +title: Managing Deprecations and K8s upgrades +description: Navigating Kubernetes API deprecations with Plural +--- + +The Kubernetes API is constantly evolving, and APIs are periodically changed and deprecated. Before upgrading the Kubernetes version running on a cluster, you must make sure any API changes are addressed. + +Plural will automatically surface deprecated resources detected on the cluster, and link to the location in Github for review. + +Deprecations will be surfaced at the cluster level in the "Status" column of the Clusters table. Clicking the "Deprecations" label will trigger a modal with all detected deprecated resources: + +![](/assets/deployments/deprecated-resources.png) + +To see deprecations relevant to a specific service, navigate to the Service details page. You'll see a notification that you can click to review any changes that need to be made: + +![](/assets/deployments/deprecation-warning.png) diff --git a/pages/deployments/existing-cluster.md b/pages/deployments/existing-cluster.md new file mode 100644 index 00000000..ec252a05 --- /dev/null +++ b/pages/deployments/existing-cluster.md @@ -0,0 +1,42 @@ +--- +title: Plural CD Bring-your-own-Kubernes +description: Bootstrap Plural CD on an existing cluster +--- + +## Overview + +For users that just want to use our CD capabilities and full control of their kubernetes setup, you can install a simplified version of Plural CD onto an existing kubernetes cluster. We've made this a turnkey process, but there are some prerequisites, namely: + +- You'll need to create a postgres db for state storage, and have a jdbc connection string for it ready of the form: `postgres://:@:5432/` +- You'll need to have your network setup in place so that all clusters you want to deploy to can make outbound network connections to the ingress you configure for plural CD. + +## Bootstrapping + +Make sure your kubeconfig is pointing to the management cluster you want to deploy to, then run the following: + +```sh +plural login +plural cd control-plane +``` + +This will do a few things: + +- ask you for basic configuration like fqdns for your CD install and also the postgres jdbc url +- set up a oidc provider for your cluster to provide secure user login +- print a full helm values file that will be used to install your instance. + +You'll then want to run the helm command we provide to you, you have the option to inspect the values we've generated first, and also you can add some last mile configuration here. This can be things like flipping out the ingress class or cert manager issuer (we use `nginx` by default and an issuer of `letsencrypt-prod`). + +Then run the helm command generated, which ought to be something along the lines of: + +```sh +helm upgrade --install --create-namespace -f values.secret.yaml --repo https://pluralsh.github.io/console console console -n plrl-console +``` + +We also strongly recommend you find a secure place to store the generated `values.secret.yaml` file in case you want to manually manage future console updates. You can use tooling like `git-crypt` or `kops` to secure this in git, or save it in a secret manager. + +## Configure Console Upgrades + +The Plural Console has the capability of self-managing its own upgrades in BYOK mode. This can be configured in the global settings page for deployments. + +You can also self-manage the chart to control your own upgrade cadence. We recommend you use our self-management though to simplify this process and ensure your constantly up-to-date. diff --git a/pages/deployments/git.md b/pages/deployments/git.md new file mode 100644 index 00000000..ff20808a --- /dev/null +++ b/pages/deployments/git.md @@ -0,0 +1,32 @@ +--- +title: Import Git Repositories +description: How to import a repo containing your service and manifests +--- + +## Structure + +To deploy your service with Plural, configure your repository with a folder containing your Kubernetes manifests that indicates how your service should be deployed. As an example, you can check out the charts folder of the [Plural Deployment Operator](https://github.com/pluralsh/deployment-operator/tree/main/charts/deployment-operator). + +We currently support helm, kustomize and raw kubernetes manifests to define your application. Service configuration can be templated in, either at the `values.yaml` file level for helm, or directly in kubernetes manifests for raw folders. You can see an example of a templated yaml file in `charts/deployment-operator/values.yaml.liquid` at the link above, and for slightly simpler templating an example can be found in our guestbook test app [here](https://github.com/pluralsh/console/blob/cd-scaffolding/test-apps/guestbook/ingress.yaml). + +We are going to be adding support for CDK8s, CUE and some other formats imminently, send us a github issue if you want to add support and contributions are always welcome! + +## Import from the Browser + +To deploy a service, Plural needs to pull the Git repository containing your Kubernetes manifests. Navigate to the "Git repositories" subtab and click the "Import Git" button in the top right corner. + +Connect your repo by adding the URL. Plural supports both SSH and basic auth. If your manifests are located in a private repo, add your credentials via upload or manual entry. + +Plural will then attempt to connect to the repository. If successful, the status will update to `Pullable`, and you can then deploy your service from the "Services" subtab. + +To update the repository URL, use the `Update` button inline with the repository row. + +## Import from the CLI + +To import a repo via the CLI, use the `plural cd repositories create` command. Provide the URL and any authentication required. As an example: + +``` +plural cd repositories create --url https://github.com/helm/examples.git +``` + +You should then see your repository show up when calling `plural cd repositories list`. diff --git a/pages/deployments/global-services.md b/pages/deployments/global-services.md new file mode 100644 index 00000000..fbae1787 --- /dev/null +++ b/pages/deployments/global-services.md @@ -0,0 +1,14 @@ +--- +title: Configure Global Services +description: Deploy services by default on specified clusters. +--- + +Global services are automatically replicated across existing and new clusters matching the set of defined specifications. + +Once a service is deployed onto any cluster, it can be marked global by clicking the three dots in the deployments table and selecting "Make global". + +![](/assets/deployments/global-service.png) + +Add cluster tags or a cluster provider to ensure that the service is only replicated on matching clusters. + +Global services are denoted with the globe icon in the deployments table. diff --git a/pages/deployments/import-cluster.md b/pages/deployments/import-cluster.md new file mode 100644 index 00000000..8c36802f --- /dev/null +++ b/pages/deployments/import-cluster.md @@ -0,0 +1,34 @@ +--- +title: Import An Existing Cluster +description: Set Up deployments to an existing, self-managed cluster +--- + +## Overview + +Most users will have created a significant amount of kubernetes infrastructure with tooling like terraform, pulumi or other forms of infrastructure automation. You can easily configure deployments to these clusters by installing our agent with a single command, and Plural CD will manage that agent from then on without any manual intervention. + +## Installation + +Make sure your local kubeconfig is pointing to the cluster you want to set up, then simply run: + +```sh +plural cd bootstrap --name {name-for-your-cluster} +``` + +You can also configure a few tags for this cluster at create time with: + +```sh +plural cd bootstrap --name {name} --tag {name}={value} --tag {name2}={value2} +``` + +## Terraform + +You can also set up a BYOK cluster via terraform with the following: + +```tf +Coming Soon! +``` + +## Networking Considerations + +You do need to ensure the cluster you're going to be deploying to has egress access to your controlling cluster diff --git a/pages/first-party/manage-your-microservices.md b/pages/deployments/manage-your-microservices.md similarity index 100% rename from pages/first-party/manage-your-microservices.md rename to pages/deployments/manage-your-microservices.md diff --git a/pages/deployments/monitoring-addons.md b/pages/deployments/monitoring-addons.md new file mode 100644 index 00000000..adf4b225 --- /dev/null +++ b/pages/deployments/monitoring-addons.md @@ -0,0 +1,10 @@ +--- +title: Monitoring Setup +description: Set up common monitoring agents +--- + +## Datadog + +The `datadog` add-on will automatically install Datadog's onto a cluster for you. You can also create a global service to automate installing the agent throughout your fleet. It will ask for your datadog api and app keys, and automatically inject them into the agent. We'll also manage future upgrades of the agent so you don't have to. + +Once the agent is installed, there are often additional features that need to be enabled to get the full Datadog ecosystem functioning. We recommend visiting their docs [here](https://docs.datadoghq.com/containers/kubernetes/installation/?tab=operator#next-steps) diff --git a/pages/deployments/network-addons.md b/pages/deployments/network-addons.md new file mode 100644 index 00000000..872c74ee --- /dev/null +++ b/pages/deployments/network-addons.md @@ -0,0 +1,38 @@ +--- +title: Network Setup +description: Set up Nginx, Cert Manager and ExternalDns to build a full network stack +--- + +## Overview + +The kubernetes network stack has a few main touchpoints: + +- Ingress controllers - manage provisioning load balancers for routing external traffic into services within a cluster. These ultimately implement the [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) spec and now the [Gateway](https://kubernetes.io/docs/concepts/services-networking/gateway/). +- Cert Manager - the most mature solution in the kubernetes ecosystem for provisioning ssl certificates. We configure it by default to use lets-encrypt, but it also has a very broad range of other certificate issuance mechanisms. +- ExternalDns - a simple controller that can scrape ingress resources and other networking related resources for FQDNs and automatically register them with a dns provider. We currently have self-service configuration for aws, azure, gcp, and cloudflare, but we're happy to help with others as needed. + +## Set Up Ingress-Nginx + +First you'll want to install the `ingress-nginx` add-on. This is one of the more mature ingress controllers in the ecosystem and has support for things like websockets/grpc and easily integrates with cert manager. It requires a distinct setup on AWS due to their load balancers requiring proxy protocol, so let us know if you are going to deploy to AWS, otherwise it's a one-click setup. + +We'd recommend also configuring global services for this to automate provisioning throughout your fleet. + +If you'd like to learn more about more advanced uses of it, here are the [docs](https://kubernetes.github.io/ingress-nginx/) + +## Set Up Cert Manager + +We provide a sane base-install of Cert Manager, using the http01 solver for letsencrypt. All it will ask for is an email for cert issuance notifications that letsencrypt sends as part of their protocol (they can be ignored for the most part). + +If you want to set up your own issuers, I'd recommend reading the [docs](https://cert-manager.io/docs/configuration/acme/dns01/) and you are free to either fork our setup or create a new service in Plural CD defining your own issuer custom resources. + +## ExternalDNS + +Externaldns is in effect a simple agent that watches a few network-related kubernetes api and diffs against your DNS service to determine if records need to be created or deleted. We provide self-service setups for AWS, GCP, Azure and Cloudflare, and are happy to help with others. + +You can also actually run multiple externaldns instances in the same cluster as long as they are not configured to look at the same DNS zone. That can make it easy to support DNS setups that are multi-provider or if you have dev + prod services in the same cluster. + +We don't necessarily recommend using a global service for `external-dns` since it is often re-configured differently for each cluster. + +## Validating the setup + +Once you have all these installed and healthy, you can create a test service to confirm all the independent components work as expected. Our guestbook ingress app is a decent example of this, and can be seen [here](https://github.com/pluralsh/console/tree/cd-scaffolding/test-apps/guestbook) diff --git a/pages/deployments/operations.md b/pages/deployments/operations.md new file mode 100644 index 00000000..deaa41ad --- /dev/null +++ b/pages/deployments/operations.md @@ -0,0 +1,5 @@ +--- +title: Advanced Operations +description: >- + Advanced topics for continuous deployment +--- diff --git a/pages/deployments/pipelines.md b/pages/deployments/pipelines.md new file mode 100644 index 00000000..50eecdbb --- /dev/null +++ b/pages/deployments/pipelines.md @@ -0,0 +1,4 @@ +--- +title: Pipelines +description: Coming soon! +--- diff --git a/pages/deployments/security-addons.md b/pages/deployments/security-addons.md new file mode 100644 index 00000000..65c47252 --- /dev/null +++ b/pages/deployments/security-addons.md @@ -0,0 +1,6 @@ +--- +title: Security Setup +description: Set up Trivy, Kubescape, and Others +--- + +Coming Soon! diff --git a/pages/deployments/services-deploy.md b/pages/deployments/services-deploy.md new file mode 100644 index 00000000..c0962026 --- /dev/null +++ b/pages/deployments/services-deploy.md @@ -0,0 +1,32 @@ +--- +title: Deploy Services +description: How to deploy imported Git repositories to clusters +--- + +## Deploy from the Browser + +To deploy a service, navigate to the "Services" subtab in the "Continuous deployment" tab of Plural Console. Click the "Deploy service" button in the top right corner. + +Fill in the service name and namespace for your deployment, and choose a target cluster. Choose a Git repository that you've connected to Console, and add the Git ref and folder. + +Git ref should refer to the branch name, tag name, or commit that you want deployed (e.g., "main"). Git folder should be the path that includes your manifests within your repository. + +Add any secrets to parameterize your deployment, then click "Deploy service". + +You should see your service populate in the services table with a `Stale` status. The status will update once components are healthy. + +## Deploy from the CLI + +To deploy a service via the CLI, use the `plural cd services create` command. Provide the name, repo id, git reference, and git folder. Optionally provide the namespace, version, config name, and config filepath. As an example: + +``` +plural cd services create --name dummy-service --repo-id c518d0c3-1cfe-4a16-b66c-7de4c07d562d --git-ref main --git-folder /manifests +``` + +You can find the repo-id for your desired repository by running `plural cd repositories list`. If namespace is not specified, the 'default' will be used. If version is not specified, '0.0.1' will be used. + +You should then see your service show up when calling `plural cd services list`. + +## Create Using Terraform + +Coming Soon! diff --git a/pages/deployments/services.md b/pages/deployments/services.md new file mode 100644 index 00000000..cfdda522 --- /dev/null +++ b/pages/deployments/services.md @@ -0,0 +1,4 @@ +--- +title: Deployments +description: How to deploy and configure services in Plural +--- diff --git a/pages/deployments/upgrades.md b/pages/deployments/upgrades.md new file mode 100644 index 00000000..ea79c78e --- /dev/null +++ b/pages/deployments/upgrades.md @@ -0,0 +1,16 @@ +--- +title: Upgrades and Rollbacks +description: Change versions of deployed services +--- + +## Upgrades + +Plural will track new revisions for a service when the underlying Git repo or configured secrets are changed. When PRs are merged to the tracked branch in Git, the service will be updated after the next pull. Modifying secrets will also trigger an update. + +## Rollbacks + +To roll a service back to a prior revision, you can either select the Rollback icon from the deployments table or the Revisions tab from the Service details page. + +The current revision will be marked with a purple checkmark. Choose a version and select "Roll back" to revert. + +![](/assets/deployments/rollback.png) diff --git a/pages/getting-started/concepts.md b/pages/getting-started/concepts.md index e75ebe4a..1e531dff 100644 --- a/pages/getting-started/concepts.md +++ b/pages/getting-started/concepts.md @@ -4,11 +4,15 @@ description: >- A brief overview of concepts used throughout our docs. --- -## Components +## Components: Plural -Plural deploys open-source third party `applications` into a net new `cluster` in your cloud environment. You can browse a list of all available applications in the Plural [Marketplace](https://www.plural.sh/marketplace). Plural uses [Terraform](https://www.terraform.io/) to create and manage the cluster, and uses an application’s [Helm charts](https://helm.sh/docs/topics/charts/) to deploy and update that application. +Plural deploys open-source third-party and proprietary first-party `applications` into `clusters` in your cloud environment. For open-source applications, Plural deploys a net new cluster; for proprietary applications, you can use a new cluster or an existing cluster for deployments. -All the necessary configuration for an individual cluster and its applications is stored in an `installation repository` in your Github or Gitlab account that’s created at the time of deployment. +Plural creates two types of clusters; a `Management Cluster` where the Plural control plane and CAPI controllers will reside, and `Workload Clusters` where main production/staging services are hosted. Plural will deploy open-source applications into a Management Cluster. + +You can browse a list of all available open-source applications in the Plural [Marketplace](https://www.plural.sh/marketplace). Plural uses [Terraform](https://www.terraform.io/) and [Cluster API](https://cluster-api.sigs.k8s.io/) to create and manage the cluster, and uses an application’s [Helm charts](https://helm.sh/docs/topics/charts/) to deploy and update that application. + +All the necessary configuration for a Management Cluster and its applications is stored in an `installation repository` in your Github or Gitlab account that’s created at the time of deployment. Each application has a set of `packages` that encompasses the application’s Helm charts, Terraform, and Docker images necessary to install and manage that application. These packages are stored in a `repository`, and a user can install that repository and the set of packages within. @@ -24,4 +28,4 @@ The Plural `Cloud Shell` is an in-browser alternative to running the Plural CLI The Plural `CLI` is a command line interface that can be used to run all Plural commands locally. -The `Console` is a web application created by Plural that runs within a cluster deployed by Plural. The Console serves as a control panel for all your Plural applications by managing automated upgrades delivered from the Kubernetes API, showing application metrics and logs, serving as a built-in K8s dashboard, and being the touchpoint for incidents which can be filed with the owner of an application. +The `Console` is a web application created by Plural that runs within a cluster deployed by Plural. The Console serves as a control panel for all your applications. diff --git a/pages/getting-started/deployments.md b/pages/getting-started/deployments.md new file mode 100644 index 00000000..a2d175de --- /dev/null +++ b/pages/getting-started/deployments.md @@ -0,0 +1,5 @@ +--- +title: Getting Started with Plural CD +description: >- + Guides you can use to get up and running quickly with Plural CD. +--- diff --git a/pages/getting-started/marketplace.md b/pages/getting-started/marketplace.md new file mode 100644 index 00000000..0fba54e2 --- /dev/null +++ b/pages/getting-started/marketplace.md @@ -0,0 +1,5 @@ +--- +title: Getting Started with Plural Open-Source Marketplace +description: >- + Guides to getting up and running with open-source applications +--- diff --git a/pages/getting-started/plural-difference.md b/pages/getting-started/plural-difference.md index 50565685..b43220d0 100644 --- a/pages/getting-started/plural-difference.md +++ b/pages/getting-started/plural-difference.md @@ -11,6 +11,7 @@ Plural was built to make deploying and managing applications on Kubernetes as ea - Plural is self-hosted. You retain full control over your deployments in your cloud. - We're open-source. We were built as an open-source solution from day 1, and allow for full transparency of what our software is doing. - Bring your own cloud. We support deploying on all major cloud providers, including AWS, Azure, and GCP. -- We perform automated testing and upgrades of supported applications, including all dependency management. Set your preferred upgrade channels and we'll do the hard work for you. +- Bring your own clusters or provision from scratch. When deploying your own software, we make it easy to adopt your existing clusters and spin up any new ones that you need. +- We perform automated testing and upgrades of the open-source application in our marketplace, including all dependency management. Set your preferred upgrade channels and we'll do the hard work for you. - We're entirely portable. Plural is built on common open-source tools, so if you don't like us, you can always eject your application from Plural and use it as you please. - We provide out-of-the-box Day 2 operational workflows. Monitor, manage, and scale your configuration with ease to meet changing demands of your business. diff --git a/pages/introduction.md b/pages/introduction.md index 4acff7d7..9682c979 100644 --- a/pages/introduction.md +++ b/pages/introduction.md @@ -7,20 +7,27 @@ description: >- ## What is Plural? -Plural is an open-source, unified, application deployment platform that stands up a Kubernetes cluster and selected applications in the cloud provider of your choice. Plural stores your infrastructure code and configuration in a fresh Git repository of your choosing, which we refer to as a Plural [workspace](/getting-started/manage-git-repositories/your-plural-workspace). +Plural is a self-hosted, open-source, unified application deployment platform that deploys your selected applictions into a Kubernetes cluster in the cloud provider of your choice. Plural acts as: -Plural writes all the Helm, Terraform, and YAML needed for your desired infrastructure with `plural build`, and deploys it all into production with `plural deploy`. All configuration within your Plural Git repository is fully ejectable from the platform and ecosystem. +- An infrastructure provisioner, spinning up new clusters as needed +- A continuous deployment solution, allowing you to deploy your services across environments +- A single pane of glass for complete visibility into what's deployed where +- An open-source marketplace to deploy 3rd party software into your clusters + +Plural leverages Cluster API, Helm, Terraform, and YAML to create your desired infrastructure. Spinning up a first cluster is as easy as running `plural build`, and all configuration within your Plural Git repository is fully ejectable from the platform and ecosystem. ![](/assets/introduction/introduction-marketplace.png) +![](/assets/deployments/deployment-services.png) **Some key features of the platform include:** -- Automated Upgrades +- Bundled infrastructure provisioning and application deployment +- Automated upgrades for open-source software - Cross-tool dependency management - GitOps workflow with batteries-included transparent secret encryption - Built on common open-source tools, so if you don't like us, you can always eject your application from Plural and use it as you please. -Notably, we **do not** support bringing your own Kubernetes cluster yet, but it's on our roadmap. +Notably, we support bringing your own Kubernetes cluster for our continuous deployment workflows. ## Deployment Options @@ -42,38 +49,38 @@ If you need support getting your Plural deployment up and running, join the [Plu The Plural architecture has three main components: +- Plural Console for management of all applications on your infrastructure - Plural API and Catalog site (available at [https://app.plural.sh](https://app.plural.sh)) - Plural CLI and Git SCM to maintain the state of a user's applications -- Plural Console for management of all plural applications on your infrastructure -At a high level, the interactions between all three components look something like this: +### Plural Console + +The Plural Console is the operational hub for all applications managed by Plural. It is deployed in-cluster alongside applications and provides a few key features: + +- Horizontally scalable Git cache - we should be able to ingest as many git repos as you'd like and auto-shard them throughout your cluster automatically and efficiently. +- Configuration Management - supports re-configurable backends, but allows you to easily parameterize services with information like hostnames, docker image tags, and other secret and non-secret information. +- Auth Proxy - this is a secure bidirectional grpc channel initiated by a deployment agent used to make kubernetes api calls no matter where a cluster may live and give you full dashboarding capabilities from the Plural CD UI. +- Cluster API Providers - Plural CD natively integrates with cluster api and allows you to create and manage new clusters at scale and fork your own kubernetes cluster APIs on top of existing setups for services like EKS, AKS and GKE or on-prem solutions like Rancher +- Support - in-person support can be handled in our chat interface available directly in the admin console, with a lot of nice features like direct zoom integration + +It's deployed as a highly available, scalable web service, with postgres as its datastore. It also directly integrates with Plural's OIDC for login and user management. -![](/assets/reference/architecture.png) +See our [Plural CD Architecture page](/deployments/architecture) for more information ### Plural API -The primary responsibility of the Plural API is to store the packages needed for application installation - terraform, helm - and ingesting high-level dependency information about them. This allows us to properly sequence installations. It also serves as a publish-subscribe layer to communicate updates to clusters that have installed those applications, and can leverage the dependency information ingested to delay updates until a cluster has caught up with all the necessary dependencies. +The primary responsibility of the Plural API is to store the packages needed for open-source application installation - terraform, helm - and ingesting high-level dependency information about them. This allows us to properly sequence installations. It also serves as a publish-subscribe layer to communicate updates to clusters that have installed those applications, and can leverage the dependency information ingested to delay updates until a cluster has caught up with all the necessary dependencies. It also can serve as an identity provider for any Plural application, delegating authentication via OIDC and also maintaining user group info and communicating it down to applications. ### Plural CLI -The Plural CLI effectively uses the Plural API as a package manager, and works as a higher level build tool on top of the DevOps packages it supports. It will handle things like running installations in dependency order, detecting changes between runs, and templating out a workspace from scratch. +The Plural CLI can be used for interaction with the Plural API and Plural Console. The CLI effectively uses the Plural API as a package manager, and works as a higher level build tool on top of the DevOps packages it supports. It also is responsible for managing secret encryption of all application state in plural installation repos and provides a few useful tools for troubleshooting an application our admin console might not be well-suited to solve. Finally it also provides the toolchain for publishing applications to the plural API. -### Plural Console - -The Plural Console is the operational hub for all applications managed by Plural. It is deployed in-cluster alongside applications and provides a few key features: - -- Automated upgrades - by subscribing to the API's upgrade websocket -- Observability - leveraging the dashboard and logging Kubernetes CRDs deployed alongside Plural applications -- Support - in-person support can be handled in our chat interface available directly in the admin console, with a lot of nice features like direct zoom integration - -It's deployed as a highly available, scalable web service, with postgres as its datastore. It also directly integrates with Plural's OIDC for login and user management. - ## Docs Translations ### Japanese diff --git a/pages/operations/advanced-operations.md b/pages/operations/advanced-operations.md new file mode 100644 index 00000000..da5abc05 --- /dev/null +++ b/pages/operations/advanced-operations.md @@ -0,0 +1,5 @@ +--- +title: Advanced Operations +description: >- + Advanced topics for open-source deployment +--- diff --git a/pages/operations/applications.md b/pages/operations/applications.md new file mode 100644 index 00000000..b5f87af7 --- /dev/null +++ b/pages/operations/applications.md @@ -0,0 +1,5 @@ +--- +title: Application Management +description: >- + Operations to manage applications for open-source deployment. +--- diff --git a/pages/operations/clusters.md b/pages/operations/clusters.md new file mode 100644 index 00000000..e6b0cc03 --- /dev/null +++ b/pages/operations/clusters.md @@ -0,0 +1,5 @@ +--- +title: Cluster Management +description: >- + Operations to manage clusters for open-source deployment. +--- diff --git a/public/assets/deployments/architecture.png b/public/assets/deployments/architecture.png new file mode 100644 index 00000000..c47e03fc Binary files /dev/null and b/public/assets/deployments/architecture.png differ diff --git a/public/assets/deployments/cluster-providers.png b/public/assets/deployments/cluster-providers.png new file mode 100644 index 00000000..22f9d3b3 Binary files /dev/null and b/public/assets/deployments/cluster-providers.png differ diff --git a/public/assets/deployments/create-cluster.png b/public/assets/deployments/create-cluster.png new file mode 100644 index 00000000..ad62cdef Binary files /dev/null and b/public/assets/deployments/create-cluster.png differ diff --git a/public/assets/deployments/create-provider.png b/public/assets/deployments/create-provider.png new file mode 100644 index 00000000..c12e8040 Binary files /dev/null and b/public/assets/deployments/create-provider.png differ diff --git a/public/assets/deployments/deployment-services.png b/public/assets/deployments/deployment-services.png new file mode 100644 index 00000000..efbaad2f Binary files /dev/null and b/public/assets/deployments/deployment-services.png differ diff --git a/public/assets/deployments/deprecated-resources.png b/public/assets/deployments/deprecated-resources.png new file mode 100644 index 00000000..3fc21269 Binary files /dev/null and b/public/assets/deployments/deprecated-resources.png differ diff --git a/public/assets/deployments/deprecation-warning.png b/public/assets/deployments/deprecation-warning.png new file mode 100644 index 00000000..b13f75ee Binary files /dev/null and b/public/assets/deployments/deprecation-warning.png differ diff --git a/public/assets/deployments/global-service.png b/public/assets/deployments/global-service.png new file mode 100644 index 00000000..5f8849b6 Binary files /dev/null and b/public/assets/deployments/global-service.png differ diff --git a/public/assets/deployments/import-git.png b/public/assets/deployments/import-git.png new file mode 100644 index 00000000..b5ef2f3b Binary files /dev/null and b/public/assets/deployments/import-git.png differ diff --git a/public/assets/deployments/rollback.png b/public/assets/deployments/rollback.png new file mode 100644 index 00000000..16566773 Binary files /dev/null and b/public/assets/deployments/rollback.png differ diff --git a/src/NavData.tsx b/src/NavData.tsx index 482e7ae9..6ea16305 100644 --- a/src/NavData.tsx +++ b/src/NavData.tsx @@ -55,133 +55,306 @@ const rootNavData: NavMenu = deepFreeze([ title: 'Concepts', href: '/getting-started/concepts', }, - { - title: 'How much does it cost?', - href: '/operations/pricing-calculator', - }, - ], - }, - { - title: 'Getting Started', - sections: [ - { - title: 'Quickstart with our CLI', - href: '/getting-started/quickstart', - }, - { - href: '/getting-started/cloud-shell-quickstart', - title: 'Quickstart from your Browser', - }, - { - href: '/getting-started/admin-console', - title: 'Installing Plural Console', - }, - { - href: '/getting-started/understanding-upgrades', - title: 'Understanding Application Upgrades', - }, ], }, { - title: 'How To', + title: 'Plural Continuous Deployment', sections: [ { - title: 'Configure my Cluster', - href: '/operations/cluster-configuration', - }, - { - href: '/operations/managing-applications/add-application-to-cluster', - title: 'Add an Application to a Cluster', - }, - { - href: '/operations/managing-applications/add-users-to-application', - title: 'Add Users to an Application', - }, - { - href: '/operations/managing-applications/update-application', - title: 'Update an Application', - }, - { - href: '/operations/managing-applications/delete-application', - title: 'Delete an Application', - }, - { - href: '/operations/managing-applications/bounce-application', - title: 'Bounce an Application', + href: '/getting-started/deployments', + title: 'Getting Started', + sections: [ + { + title: 'Architecture', + href: '/deployments/architecture', + }, + { + title: 'Quickstart with our CLI', + href: '/deployments/cli-quickstart', + }, + { + href: '/deployments/browser-quickstart', + title: 'Quickstart from your Browser', + }, + { + href: '/deployments/existing-cluster', + title: 'Set Up on your own Cluster', + }, + ], }, { - href: '/operations/managing-applications/connect-application-db', - title: 'Connect to Application DB', + href: '/deployments/clusters', + title: 'Cluster Management', + sections: [ + { + title: 'Import An Existing Cluster', + href: '/deployments/import-cluster', + }, + { + title: 'Create Provider Credentials', + href: '/deployments/credentials', + }, + { + href: '/deployments/cluster-create', + title: 'Create Workload Clusters', + }, + // { + // href: '/deployments/cluster-config', + // title: 'Configure my Cluster', + // }, + { + title: 'Destroy the Cluster Safely', + href: '/deployments/cluster-destroy', + }, + { + title: 'Optimize Cluster Costs', + href: '/deployments/cluster-cost', + }, + ], }, { - href: '/operations/managing-applications/credentials-non-oidc', - title: 'Find Credentials for non-OIDC applications', + href: '/deployments/services', + title: 'Deployments', + sections: [ + { + title: 'Import Git Repositories', + href: '/deployments/git', + }, + { + href: '/deployments/services-deploy', + title: 'Deploy Services', + }, + { + href: '/deployments/global-services', + title: 'Configure Global Services', + }, + { + title: 'Upgrades and Rollbacks', + href: '/deployments/upgrades', + }, + ], }, { - href: '/operations/managing-applications/customize-application', - title: 'Customize an Application', + href: '/deployments/addons', + title: 'Managed Kubernetes Add-Ons', + sections: [ + { + title: 'Network Stack', + href: '/deployments/network-addons', + }, + { + title: 'Monitoring', + href: '/deployments/monitoring-addons', + }, + { + title: 'Security', + href: '/deployments/security-addons', + }, + ], }, { - href: '/operations/network-configuration', - title: 'Configure your Network', + href: '/deployments/ci', + title: 'Integrate With your CI', + sections: [ + { + title: 'Overview', + href: '/deployments/ci-overview', + }, + { + title: 'Github Actions', + href: '/deployments/ci-gh-actions', + }, + ], }, { - title: 'Debug issues on your Plural Cluster', - href: '/debugging/application-issues', + href: '/deployments/pipelines', + title: 'Pipelines', }, { - href: '/operations/uninstall', - title: 'Destroy the Cluster Safely', + href: '/deployments/operations', + title: 'Advanced Operations', + sections: [ + { + title: 'Managing Deprecations and K8s upgrades', + href: '/deployments/deprecations', + }, + ], }, + ], + }, + { + title: 'Plural Open Source Marketplace', + sections: [ { - href: '/operations/dns-setup', - title: 'Set up Third Party DNS', + href: '/getting-started/marketplace', + title: 'Getting Started', sections: [ { - href: '/operations/dns-setup/creating-dns-zone-in-your-cloud-provider-console', - title: 'Creating a DNS Zone in Console', + title: 'Quickstart with our CLI', + href: '/getting-started/quickstart', + }, + { + href: '/getting-started/cloud-shell-quickstart', + title: 'Quickstart from your Browser', + }, + { + href: '/getting-started/admin-console', + title: 'Installing Plural Console', + }, + { + href: '/getting-started/understanding-upgrades', + title: 'Understanding Application Upgrades', }, ], }, { - href: '/operations/cost-management', - title: 'Optimize Cluster Costs', + href: '/operations/clusters', + title: 'Cluster Management', + sections: [ + { + title: 'Configure my Cluster', + href: '/operations/cluster-configuration', + }, + { + href: '/operations/uninstall', + title: 'Destroy the Cluster Safely', + }, + { + href: '/operations/cost-management', + title: 'Optimize Cluster Costs', + }, + { + title: 'Create Multiple Plural Clusters', + href: '/operations/auth-access-control/identity-and-installations/service-accounts', + }, + ], }, { - href: '/adding-new-application/getting-started-with-runbooks', - title: 'Create an Application Runbook', + href: '/operations/applications', + title: 'Application Management', sections: [ { - href: '/adding-new-application/getting-started-with-runbooks/runbook-xml', - title: ' XML Runbooks', + href: '/operations/managing-applications/add-application-to-cluster', + title: 'Add an Application to a Cluster', + }, + { + href: '/operations/managing-applications/add-users-to-application', + title: 'Add Users to an Application', + }, + { + href: '/operations/managing-applications/update-application', + title: 'Update an Application', + }, + { + href: '/operations/managing-applications/delete-application', + title: 'Delete an Application', + }, + { + href: '/operations/managing-applications/bounce-application', + title: 'Bounce an Application', + }, + { + href: '/operations/managing-applications/connect-application-db', + title: 'Connect to Application DB', + }, + { + href: '/operations/managing-applications/credentials-non-oidc', + title: 'Find Credentials for non-OIDC applications', + }, + { + href: '/operations/managing-applications/customize-application', + title: 'Customize an Application', }, { - href: '/adding-new-application/getting-started-with-runbooks/runbook-yaml', - title: ' YAML Runbooks', + href: '/adding-new-application/getting-started-with-runbooks', + title: 'Create an Application Runbook', + sections: [ + { + href: '/adding-new-application/getting-started-with-runbooks/runbook-xml', + title: ' XML Runbooks', + }, + { + href: '/adding-new-application/getting-started-with-runbooks/runbook-yaml', + title: ' YAML Runbooks', + }, + ], }, ], }, { - href: '/operations/auth-access-control/api-tokens', - title: 'Create Persistent API Tokens', + title: 'Sharing your Plural Repository', + href: '/getting-started/manage-git-repositories/sharing-git-repositories', }, { - title: 'Share your Plural Git Repository', - href: '/getting-started/manage-git-repositories/sharing-git-repositories', + href: '/operations/advanced-operations', + title: 'Advanced Operations', + sections: [ + { + href: '/operations/network-configuration', + title: 'Configure your Network', + }, + { + href: '/operations/dns-setup', + title: 'Set up Third Party DNS', + sections: [ + { + href: '/operations/dns-setup/creating-dns-zone-in-your-cloud-provider-console', + title: 'Creating a DNS Zone in Console', + }, + ], + }, + { + href: '/operations/auth-access-control/api-tokens', + title: 'Create Persistent API Tokens', + }, + ], }, { - title: 'Create Multiple Plural Clusters', - href: '/operations/auth-access-control/identity-and-installations/service-accounts', + href: '/debugging', + title: 'Debugging', + sections: [ + { + title: 'Debug issues on your Plural Cluster', + href: '/debugging/application-issues', + }, + { + href: '/debugging/health-checks', + title: ' Health Checks', + }, + { + href: '/debugging/proxies', + title: 'Proxies', + }, + { + href: '/debugging/logs', + title: 'Logs', + }, + ], }, { href: '/adding-new-application', title: 'Contribute a New Application to the Plural Catalog', sections: [ - { href: '/adding-new-application/background-app-install', title: 'Background on Application Installations'}, - { href: '/adding-new-application/plural-artifact-structure', title: 'Plural Artifact Structure'}, - { href: '/adding-new-application/templating', title: 'Plural Artifact Templating'}, - { href: '/adding-new-application/guide', title: 'Guide on Creating a New Application Artifact' }, - { href: '/adding-new-application/publishing', title: 'Guide on Publishing a Plural Artifact'}, + { + href: '/adding-new-application/background-app-install', + title: 'Background on Application Installations', + }, + { + href: '/adding-new-application/plural-artifact-structure', + title: 'Plural Artifact Structure', + }, + { + href: '/adding-new-application/templating', + title: 'Plural Artifact Templating', + }, + { + href: '/adding-new-application/guide', + title: 'Guide on Creating a New Application Artifact', + }, + { + href: '/adding-new-application/publishing', + title: 'Guide on Publishing a Plural Artifact', + }, { href: '/adding-new-application/plural-custom-resources', title: 'Plural Custom Resources', @@ -192,10 +365,6 @@ const rootNavData: NavMenu = deepFreeze([ }, ], }, - { - href: '/first-party/manage-your-microservices', - title: 'Manage your Own Services with Plural', - }, ], }, { @@ -217,24 +386,6 @@ const rootNavData: NavMenu = deepFreeze([ href: '/operations/auth-access-control/identity-and-installations', title: 'How does auth and access control work for Plural?', }, - { - href: '/debugging', - title: 'What debugging tools are available for Plural?', - sections: [ - { - href: '/debugging/health-checks', - title: ' Health Checks', - }, - { - href: '/debugging/proxies', - title: 'Proxies', - }, - { - href: '/debugging/logs', - title: 'Logs', - }, - ], - }, { href: '/faq/certifications', title: 'What certifications does Plural have?', @@ -249,16 +400,7 @@ const rootNavData: NavMenu = deepFreeze([ }, ], }, - { - title: 'Application Catalog', - sections: [ - { - href: APP_CATALOG_BASE_URL, - toMenu: 'appCatalog', - title: 'Application Catalog', - }, - ], - }, + { title: 'Reference', sections: [ diff --git a/src/generated/graphql.ts b/src/generated/graphql.ts index 75276095..b63ecf58 100644 --- a/src/generated/graphql.ts +++ b/src/generated/graphql.ts @@ -414,6 +414,8 @@ export type Cluster = { /** The ID of the cluster. */ id: Scalars['ID']['output']; insertedAt?: Maybe; + /** whether any installation in the cluster has been locked */ + locked?: Maybe; /** The name of the cluster. */ name: Scalars['String']['output']; /** The user that owns the cluster. */ @@ -424,11 +426,23 @@ export type Cluster = { provider: Provider; /** The upgrade queue for applications running on the cluster. */ queue?: Maybe; + /** the services deployed from this cluster */ + serviceCount?: Maybe; /** The source of the cluster. */ source?: Maybe; + /** whether all installations in the cluster have been synced */ + synced?: Maybe; updatedAt?: Maybe; /** pending upgrades for each installed app */ upgradeInfo?: Maybe>>; + /** CPU/Memory history for this cluster */ + usageHistory?: Maybe>>; +}; + + +/** A Kubernetes cluster that can be used to deploy applications on with Plural. */ +export type ClusterUsageHistoryArgs = { + begin: Scalars['DateTime']['input']; }; /** Input for creating or updating a cluster. */ @@ -487,6 +501,18 @@ export type ClusterInformationAttributes = { version?: InputMaybe; }; +/** A record of the utilization in a given cluster */ +export type ClusterUsageHistory = { + __typename?: 'ClusterUsageHistory'; + account?: Maybe; + cluster?: Maybe; + cpu?: Maybe; + insertedAt?: Maybe; + memory?: Maybe; + services?: Maybe; + updatedAt?: Maybe; +}; + export type Community = { __typename?: 'Community'; discord?: Maybe; @@ -846,6 +872,10 @@ export type EntityAttributes = { userId?: InputMaybe; }; +export enum ExternalOidcProvider { + GithubActions = 'GITHUB_ACTIONS' +} + export type File = { __typename?: 'File'; blob: Scalars['String']['output']; @@ -1247,6 +1277,7 @@ export type Installation = { license?: Maybe; /** The license key for the application. */ licenseKey?: Maybe; + locked?: Maybe; /** The OIDC provider for the application. */ oidcProvider?: Maybe; /** The last ping time of an installed application. */ @@ -1255,6 +1286,7 @@ export type Installation = { repository?: Maybe; /** The subscription for the application. */ subscription?: Maybe; + synced?: Maybe; /** The tag to track for auto upgrades. */ trackTag: Scalars['String']['output']; updatedAt?: Maybe; @@ -1771,6 +1803,16 @@ export type OidcStepResponse = { repository?: Maybe; }; +export type OidcTrustRelationship = { + __typename?: 'OidcTrustRelationship'; + id: Scalars['ID']['output']; + insertedAt?: Maybe; + issuer: Scalars['String']['output']; + scopes?: Maybe>; + trust: Scalars['String']['output']; + updatedAt?: Maybe; +}; + export type OnboardingChecklist = { __typename?: 'OnboardingChecklist'; dismissed?: Maybe; @@ -1984,6 +2026,8 @@ export type PlanFeatureAttributes = { export type PlanFeatures = { __typename?: 'PlanFeatures'; audit?: Maybe; + cd?: Maybe; + databaseManagement?: Maybe; userManagement?: Maybe; vpn?: Maybe; }; @@ -2679,6 +2723,7 @@ export type RootMutationType = { createTerraform?: Maybe; createTest?: Maybe; createToken?: Maybe; + createTrustRelationship?: Maybe; createUpgrade?: Maybe; createUserEvent?: Maybe; createWebhook?: Maybe; @@ -2713,6 +2758,7 @@ export type RootMutationType = { deleteStack?: Maybe; deleteTerraform?: Maybe; deleteToken?: Maybe; + deleteTrustRelationship?: Maybe; deleteUser?: Maybe; destroyCluster?: Maybe; deviceLogin?: Maybe; @@ -2725,6 +2771,7 @@ export type RootMutationType = { installStack?: Maybe>>; installStackShell?: Maybe>>; installTerraform?: Maybe; + installVersion?: Maybe; linkPublisher?: Maybe; login?: Maybe; loginToken?: Maybe; @@ -2750,6 +2797,7 @@ export type RootMutationType = { signup?: Maybe; ssoCallback?: Maybe; stopShell?: Maybe; + synced?: Maybe; transferDemoProject?: Maybe; /** transfers ownership of a cluster to a service account */ transferOwnership?: Maybe; @@ -3005,6 +3053,11 @@ export type RootMutationTypeCreateTestArgs = { }; +export type RootMutationTypeCreateTrustRelationshipArgs = { + attributes: TrustRelationshipAttributes; +}; + + export type RootMutationTypeCreateUpgradeArgs = { attributes: UpgradeAttributes; queue: Scalars['String']['input']; @@ -3161,6 +3214,11 @@ export type RootMutationTypeDeleteTokenArgs = { }; +export type RootMutationTypeDeleteTrustRelationshipArgs = { + id: Scalars['ID']['input']; +}; + + export type RootMutationTypeDeleteUserArgs = { id: Scalars['ID']['input']; }; @@ -3224,6 +3282,14 @@ export type RootMutationTypeInstallTerraformArgs = { }; +export type RootMutationTypeInstallVersionArgs = { + package: Scalars['String']['input']; + repository: Scalars['String']['input']; + type: DependencyType; + vsn: Scalars['String']['input']; +}; + + export type RootMutationTypeLinkPublisherArgs = { token: Scalars['String']['input']; }; @@ -3333,6 +3399,11 @@ export type RootMutationTypeSsoCallbackArgs = { }; +export type RootMutationTypeSyncedArgs = { + repository: Scalars['String']['input']; +}; + + export type RootMutationTypeTransferDemoProjectArgs = { organizationId: Scalars['String']['input']; }; @@ -3584,6 +3655,7 @@ export type RootQueryType = { oidcConsent?: Maybe; oidcLogin?: Maybe; oidcLogins?: Maybe; + oidcToken?: Maybe; platformMetrics?: Maybe; platformPlans?: Maybe>>; platformSubscription?: Maybe; @@ -3925,6 +3997,13 @@ export type RootQueryTypeOidcLoginsArgs = { }; +export type RootQueryTypeOidcTokenArgs = { + email: Scalars['String']['input']; + idToken: Scalars['String']['input']; + provider: ExternalOidcProvider; +}; + + export type RootQueryTypePublicKeysArgs = { after?: InputMaybe; before?: InputMaybe; @@ -4624,6 +4703,12 @@ export enum TestType { Git = 'GIT' } +export type TrustRelationshipAttributes = { + issuer: Scalars['String']['input']; + scopes?: InputMaybe>; + trust: Scalars['String']['input']; +}; + export type UpdatablePlanAttributes = { default?: InputMaybe; serviceLevels?: InputMaybe>>; @@ -4775,6 +4860,7 @@ export type User = { publisher?: Maybe; roles?: Maybe; serviceAccount?: Maybe; + trustRelationships?: Maybe>>; updatedAt?: Maybe; }; diff --git a/src/generated/pages.json b/src/generated/pages.json index 169c44a6..d0fcb5b6 100644 --- a/src/generated/pages.json +++ b/src/generated/pages.json @@ -1,4 +1,7 @@ [ + { + "path": "/adding-new-application/background-app-install" + }, { "path": "/adding-new-application/getting-started-with-runbooks" }, @@ -17,9 +20,18 @@ { "path": "/adding-new-application/module-library" }, + { + "path": "/adding-new-application/plural-artifact-structure" + }, { "path": "/adding-new-application/plural-custom-resources" }, + { + "path": "/adding-new-application/publishing" + }, + { + "path": "/adding-new-application/templating" + }, { "path": "/applications" }, @@ -71,6 +83,93 @@ { "path": "/debugging/proxies" }, + { + "path": "/deployments/addons" + }, + { + "path": "/deployments/architecture" + }, + { + "path": "/deployments/browser-quickstart" + }, + { + "path": "/deployments/ci-example" + }, + { + "path": "/deployments/ci-overview" + }, + { + "path": "/deployments/ci" + }, + { + "path": "/deployments/cli-quickstart" + }, + { + "path": "/deployments/cluster-config" + }, + { + "path": "/deployments/cluster-cost" + }, + { + "path": "/deployments/cluster-create" + }, + { + "path": "/deployments/cluster-destroy" + }, + { + "path": "/deployments/clusters" + }, + { + "path": "/deployments/cost-addons" + }, + { + "path": "/deployments/credentials" + }, + { + "path": "/deployments/debugging" + }, + { + "path": "/deployments/deprecations" + }, + { + "path": "/deployments/existing-cluster" + }, + { + "path": "/deployments/git" + }, + { + "path": "/deployments/global-services" + }, + { + "path": "/deployments/import-cluster" + }, + { + "path": "/deployments/manage-your-microservices" + }, + { + "path": "/deployments/monitoring-addons" + }, + { + "path": "/deployments/network-addons" + }, + { + "path": "/deployments/operations" + }, + { + "path": "/deployments/pipelines" + }, + { + "path": "/deployments/security-addons" + }, + { + "path": "/deployments/services-deploy" + }, + { + "path": "/deployments/services" + }, + { + "path": "/deployments/upgrades" + }, { "path": "/faq/certifications" }, @@ -80,9 +179,6 @@ { "path": "/faq/plural-paid-tiers" }, - { - "path": "/first-party/manage-your-microservices" - }, { "path": "/getting-started/admin-console" }, @@ -92,6 +188,9 @@ { "path": "/getting-started/concepts" }, + { + "path": "/getting-started/deployments" + }, { "path": "/getting-started/manage-git-repositories" }, @@ -107,6 +206,9 @@ { "path": "/getting-started/manage-git-repositories/your-plural-workspace" }, + { + "path": "/getting-started/marketplace" + }, { "path": "/getting-started/openid-connect" }, @@ -116,6 +218,9 @@ { "path": "/getting-started/quickstart" }, + { + "path": "/getting-started/understanding-upgrades" + }, { "path": "/getting-started/video-cli-quickstart" }, @@ -125,6 +230,12 @@ { "path": "/introduction" }, + { + "path": "/operations/advanced-operations" + }, + { + "path": "/operations/applications" + }, { "path": "/operations/auth-access-control/api-tokens" }, @@ -146,6 +257,9 @@ { "path": "/operations/cluster-configuration" }, + { + "path": "/operations/clusters" + }, { "path": "/operations/cost-management" }, diff --git a/yarn.lock b/yarn.lock index ada376f7..05021be5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -264,7 +264,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.21.4": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.18.6": version: 7.21.4 resolution: "@babel/code-frame@npm:7.21.4" dependencies: @@ -273,6 +273,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.22.13": + version: 7.22.13 + resolution: "@babel/code-frame@npm:7.22.13" + dependencies: + "@babel/highlight": ^7.22.13 + chalk: ^2.4.2 + checksum: 22e342c8077c8b77eeb11f554ecca2ba14153f707b85294fcf6070b6f6150aae88a7b7436dd88d8c9289970585f3fe5b9b941c5aa3aa26a6d5a8ef3f292da058 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.1, @babel/compat-data@npm:^7.20.5": version: 7.20.14 resolution: "@babel/compat-data@npm:7.20.14" @@ -317,7 +327,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.20.7, @babel/generator@npm:^7.22.3": +"@babel/generator@npm:^7.14.0, @babel/generator@npm:^7.18.13, @babel/generator@npm:^7.20.7": version: 7.22.3 resolution: "@babel/generator@npm:7.22.3" dependencies: @@ -329,6 +339,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/generator@npm:7.23.3" + dependencies: + "@babel/types": ^7.23.3 + "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 + jsesc: ^2.5.1 + checksum: b6e71cca852d4e1aa01a28a30b8c74ffc3b8d56ccb7ae3ee783028ee015f63ad861a2e386c3eb490a9a8634db485a503a33521680f4af510151e90346c46da17 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-annotate-as-pure@npm:7.18.6" @@ -408,13 +430,20 @@ __metadata: languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.22.1": +"@babel/helper-environment-visitor@npm:^7.18.9": version: 7.22.1 resolution: "@babel/helper-environment-visitor@npm:7.22.1" checksum: a6b4bb5505453bff95518d361ac1de393f0029aeb8b690c70540f4317934c53c43cc4afcda8c752ffa8c272e63ed6b929a56eca28e4978424177b24238b21bf9 languageName: node linkType: hard +"@babel/helper-environment-visitor@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-environment-visitor@npm:7.22.20" + checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 + languageName: node + linkType: hard + "@babel/helper-explode-assignable-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-explode-assignable-expression@npm:7.18.6" @@ -424,7 +453,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.18.9, @babel/helper-function-name@npm:^7.19.0, @babel/helper-function-name@npm:^7.21.0": +"@babel/helper-function-name@npm:^7.18.9, @babel/helper-function-name@npm:^7.19.0": version: 7.21.0 resolution: "@babel/helper-function-name@npm:7.21.0" dependencies: @@ -434,6 +463,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-function-name@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-function-name@npm:7.23.0" + dependencies: + "@babel/template": ^7.22.15 + "@babel/types": ^7.23.0 + checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 + languageName: node + linkType: hard + "@babel/helper-hoist-variables@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-hoist-variables@npm:7.18.6" @@ -443,6 +482,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-hoist-variables@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-hoist-variables@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-member-expression-to-functions@npm:7.18.9" @@ -547,6 +595,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-split-export-declaration@npm:^7.22.6": + version: 7.22.6 + resolution: "@babel/helper-split-export-declaration@npm:7.22.6" + dependencies: + "@babel/types": ^7.22.5 + checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.21.5": version: 7.21.5 resolution: "@babel/helper-string-parser@npm:7.21.5" @@ -554,6 +611,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-string-parser@npm:7.22.5" + checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": version: 7.19.1 resolution: "@babel/helper-validator-identifier@npm:7.19.1" @@ -561,6 +625,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-validator-option@npm:7.18.6" @@ -602,7 +673,18 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.14.0, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.4": +"@babel/highlight@npm:^7.22.13": + version: 7.22.20 + resolution: "@babel/highlight@npm:7.22.20" + dependencies: + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + checksum: 84bd034dca309a5e680083cd827a766780ca63cef37308404f17653d32366ea76262bd2364b2d38776232f2d01b649f26721417d507e8b4b6da3e4e739f6d134 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.14.0, @babel/parser@npm:^7.16.8, @babel/parser@npm:^7.20.7": version: 7.22.4 resolution: "@babel/parser@npm:7.22.4" bin: @@ -611,6 +693,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/parser@npm:7.23.3" + bin: + parser: ./bin/babel-parser.js + checksum: 4aa7366e401b5467192c1dbf2bef99ac0958c45ef69ed6704abbae68f98fab6409a527b417d1528fddc49d7664450670528adc7f45abb04db5fafca7ed766d57 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.18.6" @@ -1586,25 +1677,36 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.19.0, @babel/traverse@npm:^7.19.1, @babel/traverse@npm:^7.20.10, @babel/traverse@npm:^7.20.12, @babel/traverse@npm:^7.20.13, @babel/traverse@npm:^7.4.5": - version: 7.22.4 - resolution: "@babel/traverse@npm:7.22.4" +"@babel/template@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/template@npm:7.22.15" dependencies: - "@babel/code-frame": ^7.21.4 - "@babel/generator": ^7.22.3 - "@babel/helper-environment-visitor": ^7.22.1 - "@babel/helper-function-name": ^7.21.0 - "@babel/helper-hoist-variables": ^7.18.6 - "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.22.4 - "@babel/types": ^7.22.4 + "@babel/code-frame": ^7.22.13 + "@babel/parser": ^7.22.15 + "@babel/types": ^7.22.15 + checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.14.0, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.19.0, @babel/traverse@npm:^7.19.1, @babel/traverse@npm:^7.20.10, @babel/traverse@npm:^7.20.12, @babel/traverse@npm:^7.20.13, @babel/traverse@npm:^7.4.5": + version: 7.23.3 + resolution: "@babel/traverse@npm:7.23.3" + dependencies: + "@babel/code-frame": ^7.22.13 + "@babel/generator": ^7.23.3 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/parser": ^7.23.3 + "@babel/types": ^7.23.3 debug: ^4.1.0 globals: ^11.1.0 - checksum: 9560ae22092d5a7c52849145dd3e5aed2ffb73d61255e70e19e3fbd06bcbafbbdecea28df40a42ee3b60b01e85a42224ec841df93e867547e329091cc2f2bb6f + checksum: f4e0c05f2f82368b9be7e1fed38cfcc2e1074967a8b76ac837b89661adbd391e99d0b1fd8c31215ffc3a04d2d5d7ee5e627914a09082db84ec5606769409fe2b languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.4, @babel/types@npm:^7.22.3, @babel/types@npm:^7.22.4, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.16.8, @babel/types@npm:^7.18.13, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.19.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.4, @babel/types@npm:^7.22.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.22.4 resolution: "@babel/types@npm:7.22.4" dependencies: @@ -1615,6 +1717,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/types@npm:7.23.3" + dependencies: + "@babel/helper-string-parser": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 + to-fast-properties: ^2.0.0 + checksum: b96f1ec495351aeb2a5f98dd494aafa17df02a351548ae96999460f35c933261c839002a34c1e83552ff0d9f5e94d0b5b8e105d38131c7c9b0f5a6588676f35d + languageName: node + linkType: hard + "@csstools/css-parser-algorithms@npm:^2.2.0": version: 2.2.0 resolution: "@csstools/css-parser-algorithms@npm:2.2.0" @@ -6042,7 +6155,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.4.1": +"chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: