diff --git a/.markdownlint.yaml b/.markdownlint.yaml index bedc3c97..5323121b 100644 --- a/.markdownlint.yaml +++ b/.markdownlint.yaml @@ -3,3 +3,6 @@ default: true # MD013/line-length - Line length MD013: false + +# MD033 - Inline HTML. Needed for tabs in docusaurus +MD033: false diff --git a/docs/tutorials/kubernetes.md b/docs/tutorials/kubernetes.md index e71c2238..2c0e83e6 100644 --- a/docs/tutorials/kubernetes.md +++ b/docs/tutorials/kubernetes.md @@ -1,15 +1,27 @@ # Kubernetes -This example illustrates how to use `dagger` to build, push and deploy Docker +This tutorial illustrates how to use `dagger` to build, push and deploy Docker images to Kubernetes. +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + ## Prerequisites -### Setup a local Kubernetes cluster +For this tutorial, you will need a Kubernetes cluster. -While dagger supports GKE and EKS, for the purpose of this example, we'll be -using [kind](https://kind.sigs.k8s.io/) to install a local Kubernetes cluster -in addition to a local container registry, no cloud account required. + + + + +[Kind](https://kind.sigs.k8s.io/docs/user/quick-start) is a tool for running local Kubernetes clusters using Docker. 1\. Install kind @@ -47,6 +59,23 @@ EOF docker network connect kind registry ``` + + + + +This tutorial can be run against a [GCP GKE](https://cloud.google.com/kubernetes-engine) cluster and [GCR](https://cloud.google.com/container-registry +) + + + + + +This tutorial can be run against a [AWS EKS](https://aws.amazon.com/eks/ +) cluster and [ECR](https://aws.amazon.com/ecr/) + + + + ## Initialize a Dagger Workspace and Environment ```shell @@ -57,13 +86,6 @@ dagger new default ## Create a basic plan - - Create a file named `.dagger/env/default/plan/manifest.cue` and add the following configuration to it. @@ -101,6 +123,17 @@ used to create a _nginx_ deployment. Next, create `.dagger/env/default/plan/main.cue`. + + + + ```cue title=".dagger/env/default/plan/main.cue" package main @@ -114,7 +147,7 @@ kubeconfig: string @dagger(input) // deploy uses the `dagger.io/kubernetes` package to apply a manifest to a // Kubernetes cluster. -deploy: kubernetes.#Apply & { +deploy: kubernetes.#Resources & { // reference the `kubeconfig` input above "kubeconfig": kubeconfig @@ -123,6 +156,65 @@ deploy: kubernetes.#Apply & { } ``` + + + + +```cue title=".dagger/env/default/plan/main.cue" +package main + +import ( + "dagger.io/kubernetes" + "dagger.io/gcp/gke" +) + +// gkeConfig used for deployment +gkeConfig: gke.#KubeConfig @dagger(input) + +kubeconfig: gkeConfig.kubeconfig + +// deploy uses the `dagger.io/kubernetes` package to apply a manifest to a +// Kubernetes cluster. +deploy: kubernetes.#Resources & { + // reference the `kubeconfig` input above + "kubeconfig": kubeconfig + + // reference to the manifest defined in `manifest.cue` + "manifest": manifest +} +``` + + + + + +```cue title=".dagger/env/default/plan/main.cue" +package main + +import ( + "dagger.io/kubernetes" + "dagger.io/aws/eks" +) + +// eksConfig used for deployment +eksConfig: eks.#KubeConfig @dagger(input) + +kubeconfig: eksConfig.kubeconfig + +// deploy uses the `dagger.io/kubernetes` package to apply a manifest to a +// Kubernetes cluster. +deploy: kubernetes.#Resources & { + // reference the `kubeconfig` input above + "kubeconfig": kubeconfig + + // reference to the manifest defined in `manifest.cue` + "manifest": manifest +} +``` + + + + This defines: - `kubeconfig` a _string_ **input**: kubernetes configuration (`~/.kube/config`) @@ -142,6 +234,38 @@ $ dagger up You can inspect the list of inputs (both required and optional) using `dagger input list`: + + + + + + ```shell $ dagger input list Input Type Description @@ -149,13 +273,80 @@ kubeconfig string ~/.kube/config file used for deployment deploy.namespace string Kubernetes Namespace to deploy to ``` -Let's provide the missing input: + + + + +```shell +$ dagger input list +Input Type Description +deploy.namespace string Kubernetes Namespace to deploy to +gkeConfig.config.region string GCP region +gkeConfig.config.project string GCP project +gkeConfig.config.serviceKey dagger.#Secret GCP service key +gkeConfig.clusterName string GKE cluster name +``` + + + + + +```shell +$ dagger input list +Input Type Description +deploy.namespace string Kubernetes Namespace to deploy to +eksConfig.config.region string AWS region +eksConfig.config.accessKey dagger.#Secret AWS access key +eksConfig.config.secretKey dagger.#Secret AWS secret key +eksConfig.clusterName string EKS cluster name +``` + + + + +Let's provide the missing inputs: + + + + ```shell # we'll use the ~/.kube/config created by `kind` dagger input text kubeconfig -f ~/.kube/config ``` + + + + +```shell +dagger input text gkeConfig.config.project +dagger input text gkeConfig.config.region +dagger input text gkeConfig.clusterName +dagger input secret gkeConfig.config.serviceKey -f +``` + + + + + +```shell +dagger input text eksConfig.config.region +dagger input text eksConfig.clusterName +dagger input secret eksConfig.config.accessKey +dagger input secret eksConfig.config.secretKey +``` + + + + ### Deploying Now is time to deploy to kubernetes.