diff --git a/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/_index.md b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/_index.md new file mode 100644 index 0000000000..861c4ca604 --- /dev/null +++ b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/_index.md @@ -0,0 +1,6 @@ +--- +title: Kubernetes Guides for Spinnaker and Armory CD +linkTitle: Kubernetes Guides +description: > + This section contains Kubernetes-specific guides for non-admin users of Spinnaker and Armory Continuous Deployment. +--- \ No newline at end of file diff --git a/content/en/continuous-deployment/spinnaker-user-guides/automated-rollbacks.md b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/automated-rollbacks.md similarity index 97% rename from content/en/continuous-deployment/spinnaker-user-guides/automated-rollbacks.md rename to content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/automated-rollbacks.md index d16c67010a..2a1bc8e25b 100644 --- a/content/en/continuous-deployment/spinnaker-user-guides/automated-rollbacks.md +++ b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/automated-rollbacks.md @@ -1,11 +1,10 @@ --- title: Automated Kubernetes Rollbacks in Spinnaker -linkTitle: Automated Kubernetes Rollbacks -aliases: - - /spinnaker/automated_rollbacks/ - - /docs/spinnaker/automated-rollbacks/ +linkTitle: Automated Rollbacks description: > - Learn how to rollback Kubernetes deployments from Spinnaker based on complexity and number of artifacts deployed. + Learn how to use Spinnaker to rollback Kubernetes deployments based on complexity and number of artifacts deployed. +aliases: + - /spinnaker-user-guides/automated-rollbacks/ --- ## Creating a main deployment pipeline diff --git a/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/blue-green-deployment.md b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/blue-green-deployment.md new file mode 100644 index 0000000000..a1817257b8 --- /dev/null +++ b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/blue-green-deployment.md @@ -0,0 +1,324 @@ +--- +title: Use a Blue/Green Deployment Strategy with Spinnaker +linkTitle: Blue/Green +description: > + Learn how to deploy your apps from Armory Continuous Deployment or Spinnaker to Kubernetes using a blue/green deployment strategy. This strategy works with ReplicaSet and Deployment kinds. +--- + +## Overview of blue/green deployment + +Blue/Green deployment is a technique for releasing new versions of software with minimal downtime. The basic idea is to have two identical production environments, called Blue and Green. The live traffic is routed to the Blue environment, while the new version of the software is deployed to the Green environment. Once the new version has been tested and is ready for release, the traffic is switched to the Green environment, and the Blue environment becomes available for the next release. This approach allows for quick rollbacks in case of any issues with the new version, as the previous version is still available on the Blue environment. + +### Benefits + +Some benefits of using the blue/green deployment strategy include: + +1.**Minimal downtime**: By having two identical production environments, blue/green deployment allows for seamless switching between versions, minimizing downtime for users. +1. **Easy rollbacks**: If there are issues with the new version, it is simple to switch traffic back to the previous version, as it is still available on the blue environment. +1. **Improved testing**: By having a separate environment for testing new versions, blue/green deployment allows for more thorough testing before releasing to production. +1. **Increased reliability**: By keeping the previous version available, blue/green deployment provides a fallback option in case of unexpected issues with the new version. +1. **Parallel deployment**: Blue/Green deployment enables parallel deployment of new versions, meaning you can deploy a new version of your app while still running the previous version. +1. **Cost-effective**: Blue/Green deployment can be cost-effective as it enables using the same infrastructures for both versions of your app. + +For example, you have an app called `spinnaker-app` and a corresponding service called `spinnaker-service`. The first version deployed is the blue version of your app. + +{{< figure src="/images/user-guides/k8s/bg/spin-blue-start.jpg" >}} + + +You then need to update your app to a newer version, which become the green version. You run tests on the green version in order to check if everything is working as expected. + +{{< figure src="/images/user-guides/k8s/bg/spin-blue-with-green.jpg" >}} + +After checking the green version is working as expected, you switch the traffic from the blue version to the green version. + +{{< figure src="/images/user-guides/k8s/bg/spin-green.jpg" >}} + +Now the user uses the app version "green". + +With a blue/green deployment, you can easily switch back to the blue version if you find a critical bug in the green version. + +{{< figure src="/images/user-guides/k8s/bg/spin-blue-start.jpg" >}} + +## {{% heading "prereq" %}} + +You should be familiar with Kubernetes workload resource kinds [Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) and [ReplicaSet](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/). + +## Blue/Green deployments in Spinnaker + +For blue/green deployments, Spinnaker supports using Deployment and ReplicaSet kinds. + +```yaml +apiVersion: apps/v1 +kind: Deployment +``` + +```yaml +apiVersion: apps/v1 +kind: ReplicaSet +``` + +### Differences between a ReplicaSet and a Deployment + +A ReplicaSet creates and scales pods. It also ensures that pods are running on healthy nodes. A Deployment, on the other hand, is a higher-level resource object that creates and updates ReplicaSets and pods. It provides additional functionality such as rolling updates, rollbacks, and self-healing. + +In the Spinnaker UI, you can see that a Deployment resource visually contains a ReplicaSet: + +{{< figure src="/images/user-guides/k8s/bg/spinui-dep-rs.png" >}} + + +### Benefits to using Deployments over ReplicaSets + +There are several benefits to using Deployments over ReplicaSets in Kubernetes: + +1. Rolling updates: Deployments allow you to perform rolling updates to your pods, which means that you can update your app without any downtime. This is done by incrementally updating the replicas in a ReplicaSet, while keeping the others running. +1. Rollbacks: Deployments also allow you to easily roll back to a previous version of your app in case of issues with an update. +1. Self-healing: Deployments can automatically detect and replace failed pods, ensuring that your app is always running the desired number of replicas. +1. Scaling: Deployments can be easily scaled up or down by changing the number of replicas defined in the Deployment manifest. +1. Versioning: Deployments allow you to maintain multiple versions of your app, each with its own desired state and update strategy. +1. Abstraction: Deployments provide a higher-level abstraction over ReplicaSets, making it easier to manage and update your app. + +### Benefits to using ReplicaSets over Deployments + +Benefits to using ReplicaSets over Deployments in Kubernetes are: + +1. Simpler: ReplicaSets are simpler to use and understand than Deployments, as they only manage the number of replicas for a pod or set of pods. This can be useful in certain scenarios where you don't need the additional features provided by Deployments. +1. More flexibility: ReplicaSets offer more flexibility in terms of managing pods, as they don't have the additional constraints imposed by Deployments. This can be useful in scenarios where you need more fine-grained control over your pods. +1. Lower overhead: ReplicaSets have lower overhead than Deployments, as they don't have the additional logic for rolling updates, rollbacks and self-healing. This can be useful in scenarios where you have limited resources or where performance is critical. +1. Compatibility: ReplicaSets are compatible with other k8s resources such as StatefulSets and DaemonSets, while Deployment is not. + +ReplicaSets are considered a building block for Deployments. For most use cases, you should use a Deployment because it provides more robust and sophisticated management capabilities. + +## Create a blue/green deployment using Deployment + +In this example, you use the Spinnaker UI to create a blue/green deployment for nginx. You can extend this process to create pipelines that automatically deploy your services using a blue/green strategy. + +### Create a Spinnaker application and LoadBalancer + +1. [Create an application](https://spinnaker.io/docs/guides/user/applications/create/). +1. Create a LoadBalancer to handle our service traffic. + + 1. Click the **LOAD BALANCERS** tab. + 1. Click the **Create Load Balancer** button. + + {{< figure src="/images/user-guides/k8s/bg/spinui-loadbalancers.png" >}} + + 1. If you have more than one provider configured, select **Kubernetes** in the **Select Your Provider** window. Then click **Next**. + 1. In the **Deploy Manifest** window, select your Kubernetes account from the **Account** list. Then add the following in the **Manifest** text box: + + {{< readfile file="/includes/cdsh/user/bluegreen/loadbalancer.yaml" code="true" lang="yaml" >}} + + Press the **Create** button. + + {{< figure src="/images/user-guides/k8s/bg/Untitled%202.png" >}} + + 1. Wait for service creation to complete. Then verify the LoadBalancer has been created. + + {{< figure src="/images/user-guides/k8s/bg/Untitled%203.png" >}} + + {{< figure src="/images/user-guides/k8s/bg/Untitled%204.png" >}} + +### Create the blue deployment + +Create a server group for your blue deployment. + +1. Click the **CLUSTERS** tab. +1. Click the **Create Server Group** button. + + {{< figure src="/images/user-guides/k8s/bg/Untitled%205.png" >}} + +1. If you have more than one provider configured, select **Kubernetes** in the **Select Your Provider** window. Then click **Next**. +1. In the **Deploy Manifest** window, select your Kubernetes account from the **Account** list. + + Add a ConfigMap that includes a custom `index.html` for the blue version of the app. Then in the deployment config, add a volume mount for the default nginx `index.html`, which is replaced by the custom index page defined in the ConfigMap. + + Add the following in the **Manifest** text box: + + {{< readfile file="/includes/cdsh/user/bluegreen/deployment-blue.yaml" code="true" lang="yaml" >}} + + The Deployment is created in the current namespace. To specify a namespace, you can add `namespace: ${account}` in the `metadata` section. For example: + + ```yaml + apiVersion: apps/v1 + kind: Deployment + metadata: + name: nginx-deployment + namespace: ${account} + ``` + + Press the **Create** button. + + {{< figure src="/images/user-guides/k8s/bg/Untitled%206.png" >}} + + +

+ +You can verify the resource creation using `kubectl` or a cluster visualizer like [Lens](https://k8slens.dev/). + +{{< figure src="/images/user-guides/k8s/bg/Untitled%208.png" >}} + +{{< figure src="/images/user-guides/k8s/bg/Untitled%209.png" >}} + + +You should see your deployment the LoadBalancer attached. + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2010.png" >}} + + +When you click in the LoadBalancer icon, a tab opens. Click the **Ingress** URL to open a browser window to the deployment. + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2011.png" >}} + + +You should see the blue deployment page. + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2012.png" >}} + + +### Create the green deployment + +1. Click the **CLUSTERS** tab. +1. Click the **Create Server Group** button. +1. If you have more than one provider configured, select **Kubernetes** in the **Select Your Provider** window. Then click **Next**. +1. In the **Deploy Manifest** window, select your Kubernetes account from the **Account** list. Add the following in the **Manifest** text box: + + {{< readfile file="/includes/cdsh/user/bluegreen/deployment-green.yaml" code="true" lang="yaml" >}} + + Press the **Create** button. + +

+Refresh the Spinnaker UI page. You should see the new version listed inside your deployment and also how the LoadBalancer is transferring the network traffic to the green version. + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2014.png" >}} + + +If the deployment is successful, the green version has 100% of the resources. +{{< figure src="/images/user-guides/k8s/bg/Untitled%2015.png" >}} + + +If you go to our previous ingress url, we gonna see the new version deployed +{{< figure src="/images/user-guides/k8s/bg/Untitled%2016.png" >}} + + +If something goes wrong with new version, LoadBalancer will point again to blue version. If the deployment is completed successfully, but you can rollback to the last version, you can go to CLUSTERS section, select the deployment, click in Deployment Action, and click in Undo Rollout, select previous revision and submit the request. +{{< figure src="/images/user-guides/k8s/bg/Untitled%2017.png" >}} + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2018.png" >}} + + +If we go back to the app ingress url, we have again the blue deployment +{{< figure src="/images/user-guides/k8s/bg/Untitled%2019.png" >}} + + +Congrats! you achieved a blue/green deployment successfully. Now we can translate all previous steps in a pipeline to automatize this process for any new release/deployment + +## Create a blue/green deployment using ReplicaSet + +The process to execute a blue/green deployment is pretty similar to use directly Deployment, basically we gonna use explicitly the ReplicaSet resource in our manifests. As we explained before Deployment is a high abstraction of ReplicaSets. + +So lets start, creating an app and going to LOAD BALANCERS section to create our loadbalancer resource to allow us handle the network and expose our app. +{{< figure src="/images/user-guides/k8s/bg/Untitled%2020.png" >}} + + +{{< readfile file="/includes/cdsh/user/bluegreen/loadbalancer.yaml" code="true" lang="yaml" >}} + +Wait until complete, and you will be able to see our resource in LOAD BALANCERS screen +{{< figure src="/images/user-guides/k8s/bg/Untitled%2021.png" >}} + + +Now, let’s go to create our app with blue version, only using ReplicaSet resource. Go to CLUSTERS section and click on Create Server Group action +{{< figure src="/images/user-guides/k8s/bg/Untitled%2022.png" >}} + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2023.png" >}} + + +{{< readfile file="/includes/cdsh/user/bluegreen/replicaset-blue.yaml" code="true" lang="yaml" >}} + +Note: Again, first we added a ConfigMap to allow us create a html view and let us exemplify in a visual way our app versioned. Then with volumeMount we shared the nginx default index.html, and later is replaced with our ConfigMap. + +This time we need redirect our LoadBalancer manually. Let’s go to our LoadBalancer, click on it, click in “Service Actions” and edit +{{< figure src="/images/user-guides/k8s/bg/Untitled%2024.png" >}} + + +In manifest edit window, add the selector section at final for our app and our version, in this case “app: nginx”, “version: blue” +{{< figure src="/images/user-guides/k8s/bg/Untitled%2025.png" >}} + + +Now, we are able to see the resource assigned to our loadBalancer, and if we click in the LoadBalancer icon, a sidebar with ingress url will be displayed, click on it and we gonna see our app deployed successfully +{{< figure src="/images/user-guides/k8s/bg/Untitled%2026.png" >}} + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2027.png" >}} + + +Here we have a difference with deployment resource. If we go to check our cluster resources, and you look for Deployments resource, we don’t gonna see any “nginx” resource, but replicaset resource will contain our resource: +{{< figure src="/images/user-guides/k8s/bg/Untitled%2028.png" >}} + + +Now, proceed to deploy our green version over our replicaSet resource, again going to CLUSTERS section, + +{{< readfile file="/includes/cdsh/user/bluegreen/replicaset-green.yaml" code="true" lang="yaml" >}} + + + +Now, our replicaSet resource will display the new version, with new pods create, but LoadBalancer is still pointing to blue version. +{{< figure src="/images/user-guides/k8s/bg/Untitled%2029.png" >}} + + +Now go again to our LoadBalancer, click on it, service actions, and change the version selector parameter to green +{{< figure src="/images/user-guides/k8s/bg/Untitled%2030.png" >}} + + +If we go to our ingress url, we gonna see our green version displayed! +{{< figure src="/images/user-guides/k8s/bg/Untitled%2031.png" >}} + + +If we want rollback, just point the LoadBalancer to blue version editing again the selector, and delete the green replicaset created. + +If green version is working as expected, finally, go back to CLUSTERS section, and we can delete the blue version replicaSet resource that is running +{{< figure src="/images/user-guides/k8s/bg/Untitled%2032.png" >}} + + +## Use a blue/green strategy in a pipeline + +Create a pipeline, in configuration pipeline, go to “Pipeline Actions”, and click in “Edit as JSON”, paste: + +{{< readfile file="/includes/cdsh/user/bluegreen/deployment-pipeline.json" code="true" lang="json" >}} + +Now, let’s see the pipeline +{{< figure src="/images/user-guides/k8s/bg/Untitled%2033.png" >}} + + +- In configuration stage, we added a parameter where we can select the version to be deployed between green or blue app +{{< figure src="/images/user-guides/k8s/bg/Untitled%2034.png" >}} + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2035.png" >}} + + +Then we have the creation of our LoadBalancer if not exists to be used in the deployment stages to handle the network traffic. + +Next stages will check if green or blue deployment was selected + +Finally we have the deploy for blue or green version, if we take a look in each stage, we can see that we can configure directly the strategy and select the loadbalancer to cutover our blue or green box if the deployment is successful, if fails, it will rollback automatically. +{{< figure src="/images/user-guides/k8s/bg/Untitled%2036.png" >}} + + +Note: If you take a look in the manifests for each Manifest Deployment stage type, you can see the same manifests that we used previously creating each piece, step by step. + +Let us execute, and deploy the green app version +{{< figure src="/images/user-guides/k8s/bg/Untitled%2037.png" >}} + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2038.png" >}} + + +Going to same url, where we deployed blue version previously +{{< figure src="/images/user-guides/k8s/bg/Untitled%2039.png" >}} + + +If the deployment is completed successfully, but you can rollback to the last version, you can go to CLUSTERS section, select the deployment, click in Deployment Action, and click in Undo Rollout, select previous revision and submit the request. Or just re-deploy the blue deployment over green. + + +{{< figure src="/images/user-guides/k8s/bg/Untitled%2040.png" >}} + + +The next JSON is to use ReplicaSets instead deployments: + +{{< readfile file="/includes/cdsh/user/bluegreen/replicaset-pipeline.json" code="true" lang="json" >}} \ No newline at end of file diff --git a/content/en/continuous-deployment/spinnaker-user-guides/kubernetes-deployments.md b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kubernetes-deployments.md similarity index 94% rename from content/en/continuous-deployment/spinnaker-user-guides/kubernetes-deployments.md rename to content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kubernetes-deployments.md index d1118d2a6c..20c72bf509 100644 --- a/content/en/continuous-deployment/spinnaker-user-guides/kubernetes-deployments.md +++ b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kubernetes-deployments.md @@ -1,14 +1,13 @@ --- title: Deploy a Docker Image to Kubernetes -linkTitle: Deploy a Docker Image to Kubernetes -aliases: - - /spinnaker/kubernetes_deployments/ - - /docs/spinnaker/kubernetes-deployments/ +linkTitle: Deploy a Docker Image description: > Learn how to use Spinnaker's Kubernetes V2 provider to deploy your Docker image. +aliases: + - /spinnaker-user-guides/kubernetes-deployments/ --- -## Kubernetes Deployments +## Kubernetes deployments Spinnaker delegates the deployment of containers to Kubernetes. Kubernetes then proceeds with a rolling update deployment which is effectively a rolling blue/green deployment. Pods are created in batches and when a pod is deemed [healthy](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/) it starts receiving traffic. diff --git a/content/en/continuous-deployment/spinnaker-user-guides/kubernetes-v2.md b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kubernetes-v2.md similarity index 95% rename from content/en/continuous-deployment/spinnaker-user-guides/kubernetes-v2.md rename to content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kubernetes-v2.md index 8132f96d74..b17cdde809 100644 --- a/content/en/continuous-deployment/spinnaker-user-guides/kubernetes-v2.md +++ b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kubernetes-v2.md @@ -1,12 +1,10 @@ --- -title: Deploy Applications to Kubernetes -# This is different from user-guides/kubernetes - no redirect -aliases: - - /spinnaker_user_guides/kubernetes-v2/ - - /spinnaker_user_guides/kubernetes_v2/ - - /spinnaker-user-guides/kubernetes_v2/ +title: Use Spinnaker to Deploy Apps to Kubernetes +linkTitle: Deploy Apps description: > Learn how to use Spinnaker's Kubernetes V2 provider to deploy your applications. +aliases: + - /spinnaker-user-guides/kubernetes-v2/ --- ## Overview of Spinnaker's Kubernetes V2 Provider diff --git a/content/en/continuous-deployment/spinnaker-user-guides/kustomize-manifests.md b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kustomize-manifests.md similarity index 97% rename from content/en/continuous-deployment/spinnaker-user-guides/kustomize-manifests.md rename to content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kustomize-manifests.md index d4d332a52f..30950f7d96 100644 --- a/content/en/continuous-deployment/spinnaker-user-guides/kustomize-manifests.md +++ b/content/en/continuous-deployment/spinnaker-user-guides/kuberntes-guides/kustomize-manifests.md @@ -1,8 +1,10 @@ --- title: Use Kustomize for Manifest-Based Kubernetes Deployments in Spinnaker -linkTitle: Use Kustomize for App Manifests +linkTitle: Kustomize App Manifests description: > Learn how to use Kustomize within your Spinnaker pipeline to generate a custom Kubernetes deployment manifest artifact. You can use this artifact in a downstream stage to deploy your application. +aliases: + - /spinnaker-user-guides/kustomize-manifests/ --- ## Overview of Kustomize diff --git a/content/en/includes/cdsh/user/bluegreen/deployment-blue.yaml b/content/en/includes/cdsh/user/bluegreen/deployment-blue.yaml new file mode 100644 index 0000000000..a03295f28c --- /dev/null +++ b/content/en/includes/cdsh/user/bluegreen/deployment-blue.yaml @@ -0,0 +1,49 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: blue-index-html +data: + index.html: | + + + + + !!! Welcome to Nginx Blue Deployment !!! + + + + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment +spec: + replicas: 2 + selector: + matchLabels: + app: nginx + template: + metadata: + labels: + app: nginx + version: blue + spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 + volumeMounts: + - mountPath: /usr/share/nginx/html/index.html # mount index.html to /usr/share/nginx/html/index.html + subPath: index.html + readOnly: true + name: index-html + volumes: + - name: index-html + configMap: + name: blue-index-html # place ConfigMap `index-html` on /usr/share/nginx/html/index.html + items: + - key: index.html + path: index.html diff --git a/content/en/includes/cdsh/user/bluegreen/deployment-green.yaml b/content/en/includes/cdsh/user/bluegreen/deployment-green.yaml new file mode 100644 index 0000000000..71a7e22aed --- /dev/null +++ b/content/en/includes/cdsh/user/bluegreen/deployment-green.yaml @@ -0,0 +1,51 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: green-index-html +data: + index.html: | + + + + + !!! Welcome to Nginx Green Deployment !!! + + + + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + annotations: + traffic.spinnaker.io/load-balancers: '["service nginx"]' +spec: + selector: + matchLabels: + app: nginx + replicas: 2 # tells deployment to run 2 pods matching the template + template: + metadata: + labels: + app: nginx + version: green + spec: + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 + volumeMounts: + - mountPath: /usr/share/nginx/html/index.html # mount index.html to /usr/share/nginx/html/index.html + subPath: index.html + readOnly: true + name: index-html + volumes: + - name: index-html + configMap: + name: green-index-html # place ConfigMap `index-html` on /usr/share/nginx/html/index.html + items: + - key: index.html + path: index.html diff --git a/content/en/includes/cdsh/user/bluegreen/deployment-pipeline.json b/content/en/includes/cdsh/user/bluegreen/deployment-pipeline.json new file mode 100644 index 0000000000..626dcfa274 --- /dev/null +++ b/content/en/includes/cdsh/user/bluegreen/deployment-pipeline.json @@ -0,0 +1,301 @@ +{ + "keepWaitingPipelines": false, + "lastModifiedBy": "anonymous", + "limitConcurrent": true, + "parameterConfig": [ + { + "default": "", + "description": "Select deployment", + "hasOptions": true, + "label": "", + "name": "deployment", + "options": [ + { + "value": "blue" + }, + { + "value": "green" + } + ], + "pinned": false, + "required": true + } + ], + "schema": "1", + "spelEvaluator": "v4", + "stages": [ + { + "account": "spinnaker", + "cloudProvider": "kubernetes", + "manifests": [ + { + "apiVersion": "v1", + "data": { + "index.html": "\n\n\n\n!!! Welcome to Nginx Blue Deployment !!!\n\n\n\n\n" + }, + "kind": "ConfigMap", + "metadata": { + "name": "blue-index-html" + } + }, + { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "nginx-deployment" + }, + "spec": { + "replicas": 2, + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx", + "version": "blue" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "name": "nginx", + "ports": [ + { + "containerPort": 80 + } + ], + "volumeMounts": [ + { + "mountPath": "/usr/share/nginx/html/index.html", + "name": "index-html", + "readOnly": true, + "subPath": "index.html" + } + ] + } + ], + "volumes": [ + { + "configMap": { + "items": [ + { + "key": "index.html", + "path": "index.html" + } + ], + "name": "blue-index-html" + }, + "name": "index-html" + } + ] + } + } + } + } + ], + "moniker": { + "app": "nginx" + }, + "name": "Blue Deployment", + "refId": "1", + "requisiteStageRefIds": [ + "3" + ], + "skipExpressionEvaluation": false, + "source": "text", + "trafficManagement": { + "enabled": true, + "options": { + "enableTraffic": true, + "namespace": "your-namespace", + "services": [ + "service nginx" + ], + "strategy": "redblack" + } + }, + "type": "deployManifest" + }, + { + "completeOtherBranchesThenFail": false, + "continuePipeline": false, + "failPipeline": true, + "name": "Check If Blue", + "preconditions": [ + { + "context": { + "expression": "${parameters.deployment.equals('blue')}" + }, + "failPipeline": false, + "type": "expression" + } + ], + "refId": "3", + "requisiteStageRefIds": [ + "6" + ], + "restrictExecutionDuringTimeWindow": false, + "type": "checkPreconditions" + }, + { + "failOnFailedExpressions": false, + "name": "Check If Green", + "preconditions": [ + { + "context": { + "expression": "${parameters.deployment.equals('green')}" + }, + "failPipeline": false, + "type": "expression" + } + ], + "refId": "4", + "requisiteStageRefIds": [ + "6" + ], + "type": "checkPreconditions" + }, + { + "account": "spinnaker", + "cloudProvider": "kubernetes", + "manifests": [ + { + "apiVersion": "v1", + "data": { + "index.html": "\n\n\n\n!!! Welcome to Nginx Green Deployment !!!\n\n\n\n\n" + }, + "kind": "ConfigMap", + "metadata": { + "name": "green-index-html" + } + }, + { + "apiVersion": "apps/v1", + "kind": "Deployment", + "metadata": { + "name": "nginx-deployment" + }, + "spec": { + "replicas": 2, + "selector": { + "matchLabels": { + "app": "nginx" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx", + "version": "green" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "name": "nginx", + "ports": [ + { + "containerPort": 80 + } + ], + "volumeMounts": [ + { + "mountPath": "/usr/share/nginx/html/index.html", + "name": "index-html", + "readOnly": true, + "subPath": "index.html" + } + ] + } + ], + "volumes": [ + { + "configMap": { + "items": [ + { + "key": "index.html", + "path": "index.html" + } + ], + "name": "green-index-html" + }, + "name": "index-html" + } + ] + } + } + } + } + ], + "moniker": { + "app": "nginx" + }, + "name": "Green Deployment", + "refId": "5", + "requisiteStageRefIds": [ + "4" + ], + "skipExpressionEvaluation": false, + "source": "text", + "trafficManagement": { + "enabled": true, + "options": { + "enableTraffic": true, + "namespace": "your-namespace", + "services": [ + "service nginx" + ], + "strategy": "redblack" + } + }, + "type": "deployManifest" + }, + { + "account": "spinnaker", + "cloudProvider": "kubernetes", + "manifests": [ + { + "apiVersion": "v1", + "kind": "Service", + "metadata": { + "name": "nginx" + }, + "spec": { + "ports": [ + { + "port": 80, + "protocol": "TCP" + } + ], + "selector": { + "name": "nginx" + }, + "type": "LoadBalancer" + } + } + ], + "moniker": { + "app": "nginx" + }, + "name": "Create LoadBalancer", + "refId": "6", + "requisiteStageRefIds": [], + "skipExpressionEvaluation": false, + "source": "text", + "trafficManagement": { + "enabled": false, + "options": { + "enableTraffic": false, + "services": [] + } + }, + "type": "deployManifest" + } + ], + "triggers": [] +} \ No newline at end of file diff --git a/content/en/includes/cdsh/user/bluegreen/loadbalancer.yaml b/content/en/includes/cdsh/user/bluegreen/loadbalancer.yaml new file mode 100644 index 0000000000..119a73c864 --- /dev/null +++ b/content/en/includes/cdsh/user/bluegreen/loadbalancer.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: Service +metadata: + name: nginx +spec: + ports: + - port: 80 + protocol: TCP + selector: + name: nginx + type: LoadBalancer diff --git a/content/en/includes/cdsh/user/bluegreen/replicaset-blue.yaml b/content/en/includes/cdsh/user/bluegreen/replicaset-blue.yaml new file mode 100644 index 0000000000..8f952f1789 --- /dev/null +++ b/content/en/includes/cdsh/user/bluegreen/replicaset-blue.yaml @@ -0,0 +1,51 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: blue-index-html +data: + index.html: | + + + + + !!! Welcome to Nginx Blue Deployment !!! + + + + + +--- + +apiVersion: apps/v1 +kind: ReplicaSet +metadata: + name: nginx-replicaset +spec: + replicas: 3 + selector: + matchLabels: + app: nginx + version: blue + template: + metadata: + labels: + app: nginx + version: blue + spec: + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 + volumeMounts: + - mountPath: /usr/share/nginx/html/index.html # mount index.html to /usr/share/nginx/html/index.html + subPath: index.html + readOnly: true + name: index-html + volumes: + - name: index-html + configMap: + name: blue-index-html # place ConfigMap `index-html` on /usr/share/nginx/html/index.html + items: + - key: index.html + path: index.html \ No newline at end of file diff --git a/content/en/includes/cdsh/user/bluegreen/replicaset-green.yaml b/content/en/includes/cdsh/user/bluegreen/replicaset-green.yaml new file mode 100644 index 0000000000..596170ad6b --- /dev/null +++ b/content/en/includes/cdsh/user/bluegreen/replicaset-green.yaml @@ -0,0 +1,50 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: green-index-html +data: + index.html: | + + + + + !!! Welcome to Nginx Green Deployment !!! + + + + + +--- +apiVersion: apps/v1 +kind: ReplicaSet +metadata: + name: nginx-replicaset +spec: + replicas: 3 + selector: + matchLabels: + app: nginx + version: green + template: + metadata: + labels: + app: nginx + version: green + spec: + containers: + - name: nginx + image: nginx:1.14.2 + ports: + - containerPort: 80 + volumeMounts: + - mountPath: /usr/share/nginx/html/index.html # mount index.html to /usr/share/nginx/html/index.html + subPath: index.html + readOnly: true + name: index-html + volumes: + - name: index-html + configMap: + name: green-index-html # place ConfigMap `index-html` on /usr/share/nginx/html/index.html + items: + - key: index.html + path: index.html diff --git a/content/en/includes/cdsh/user/bluegreen/replicaset-pipeline.json b/content/en/includes/cdsh/user/bluegreen/replicaset-pipeline.json new file mode 100644 index 0000000000..db454de11a --- /dev/null +++ b/content/en/includes/cdsh/user/bluegreen/replicaset-pipeline.json @@ -0,0 +1,304 @@ +{ + "appConfig": {}, + "keepWaitingPipelines": false, + "lastModifiedBy": "anonymous", + "limitConcurrent": true, + "parameterConfig": [ + { + "default": "", + "description": "Select deployment", + "hasOptions": true, + "label": "", + "name": "deployment", + "options": [ + { + "value": "blue" + }, + { + "value": "green" + } + ], + "pinned": false, + "required": true + } + ], + "schema": "1", + "spelEvaluator": "v4", + "stages": [ + { + "account": "spinnaker", + "cloudProvider": "kubernetes", + "manifests": [ + { + "apiVersion": "v1", + "data": { + "index.html": "\n\n\n\n!!! Welcome to Nginx Blue Deployment !!!\n\n\n\n\n" + }, + "kind": "ConfigMap", + "metadata": { + "name": "blue-index-html" + } + }, + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "metadata": { + "name": "nginx-replicaset" + }, + "spec": { + "replicas": 3, + "selector": { + "matchLabels": { + "app": "nginx", + "version": "blue" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx", + "version": "blue" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "name": "nginx", + "ports": [ + { + "containerPort": 80 + } + ], + "volumeMounts": [ + { + "mountPath": "/usr/share/nginx/html/index.html", + "name": "index-html", + "readOnly": true, + "subPath": "index.html" + } + ] + } + ], + "volumes": [ + { + "configMap": { + "items": [ + { + "key": "index.html", + "path": "index.html" + } + ], + "name": "blue-index-html" + }, + "name": "index-html" + } + ] + } + } + } + } + ], + "moniker": { + "app": "nginx" + }, + "name": "Blue Deployment", + "refId": "1", + "requisiteStageRefIds": [ + "3" + ], + "skipExpressionEvaluation": false, + "source": "text", + "trafficManagement": { + "enabled": true, + "options": { + "enableTraffic": true, + "namespace": "your-namespace", + "services": [ + "service nginx" + ], + "strategy": "redblack" + } + }, + "type": "deployManifest" + }, + { + "completeOtherBranchesThenFail": false, + "continuePipeline": false, + "failPipeline": true, + "name": "Check If Blue", + "preconditions": [ + { + "context": { + "expression": "${parameters.deployment.equals('blue')}" + }, + "failPipeline": false, + "type": "expression" + } + ], + "refId": "3", + "requisiteStageRefIds": [ + "6" + ], + "restrictExecutionDuringTimeWindow": false, + "type": "checkPreconditions" + }, + { + "failOnFailedExpressions": false, + "name": "Check If Green", + "preconditions": [ + { + "context": { + "expression": "${parameters.deployment.equals('green')}" + }, + "failPipeline": false, + "type": "expression" + } + ], + "refId": "4", + "requisiteStageRefIds": [ + "6" + ], + "type": "checkPreconditions" + }, + { + "account": "spinnaker", + "cloudProvider": "kubernetes", + "manifests": [ + { + "apiVersion": "v1", + "data": { + "index.html": "\n\n\n\n!!! Welcome to Nginx Green Deployment !!!\n\n\n\n\n" + }, + "kind": "ConfigMap", + "metadata": { + "name": "green-index-html" + } + }, + { + "apiVersion": "apps/v1", + "kind": "ReplicaSet", + "metadata": { + "name": "nginx-replicaset" + }, + "spec": { + "replicas": 3, + "selector": { + "matchLabels": { + "app": "nginx", + "version": "green" + } + }, + "template": { + "metadata": { + "labels": { + "app": "nginx", + "version": "green" + } + }, + "spec": { + "containers": [ + { + "image": "nginx:1.14.2", + "name": "nginx", + "ports": [ + { + "containerPort": 80 + } + ], + "volumeMounts": [ + { + "mountPath": "/usr/share/nginx/html/index.html", + "name": "index-html", + "readOnly": true, + "subPath": "index.html" + } + ] + } + ], + "volumes": [ + { + "configMap": { + "items": [ + { + "key": "index.html", + "path": "index.html" + } + ], + "name": "green-index-html" + }, + "name": "index-html" + } + ] + } + } + } + } + ], + "moniker": { + "app": "nginx" + }, + "name": "Green Deployment", + "refId": "5", + "requisiteStageRefIds": [ + "4" + ], + "skipExpressionEvaluation": false, + "source": "text", + "trafficManagement": { + "enabled": true, + "options": { + "enableTraffic": true, + "namespace": "your-namespace", + "services": [ + "service nginx" + ], + "strategy": "redblack" + } + }, + "type": "deployManifest" + }, + { + "account": "spinnaker", + "cloudProvider": "kubernetes", + "manifests": [ + { + "apiVersion": "v1", + "kind": "Service", + "metadata": { + "name": "nginx" + }, + "spec": { + "ports": [ + { + "port": 80, + "protocol": "TCP" + } + ], + "selector": { + "name": "nginx" + }, + "type": "LoadBalancer" + } + } + ], + "moniker": { + "app": "nginx" + }, + "name": "Create LoadBalancer", + "refId": "6", + "requisiteStageRefIds": [], + "skipExpressionEvaluation": false, + "source": "text", + "trafficManagement": { + "enabled": false, + "options": { + "enableTraffic": false, + "services": [] + } + }, + "type": "deployManifest" + } + ], + "triggers": [] +} \ No newline at end of file diff --git a/static/images/user-guides/k8s/bg/Untitled 10.png b/static/images/user-guides/k8s/bg/Untitled 10.png new file mode 100644 index 0000000000..9f72529b75 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 10.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 11.png b/static/images/user-guides/k8s/bg/Untitled 11.png new file mode 100644 index 0000000000..bdd878a152 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 11.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 12.png b/static/images/user-guides/k8s/bg/Untitled 12.png new file mode 100644 index 0000000000..dc4dd3b324 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 12.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 13.png b/static/images/user-guides/k8s/bg/Untitled 13.png new file mode 100644 index 0000000000..dbab8cfc0e Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 13.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 14.png b/static/images/user-guides/k8s/bg/Untitled 14.png new file mode 100644 index 0000000000..166e49f4d7 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 14.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 15.png b/static/images/user-guides/k8s/bg/Untitled 15.png new file mode 100644 index 0000000000..023f530ff3 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 15.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 16.png b/static/images/user-guides/k8s/bg/Untitled 16.png new file mode 100644 index 0000000000..fa84400821 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 16.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 17.png b/static/images/user-guides/k8s/bg/Untitled 17.png new file mode 100644 index 0000000000..005f9cb52c Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 17.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 18.png b/static/images/user-guides/k8s/bg/Untitled 18.png new file mode 100644 index 0000000000..d3832f9ae1 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 18.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 19.png b/static/images/user-guides/k8s/bg/Untitled 19.png new file mode 100644 index 0000000000..ba17b85934 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 19.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 2.png b/static/images/user-guides/k8s/bg/Untitled 2.png new file mode 100644 index 0000000000..6b7126143a Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 2.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 20.png b/static/images/user-guides/k8s/bg/Untitled 20.png new file mode 100644 index 0000000000..7fb2679078 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 20.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 21.png b/static/images/user-guides/k8s/bg/Untitled 21.png new file mode 100644 index 0000000000..074bb61ab9 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 21.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 22.png b/static/images/user-guides/k8s/bg/Untitled 22.png new file mode 100644 index 0000000000..ab7b0e8983 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 22.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 23.png b/static/images/user-guides/k8s/bg/Untitled 23.png new file mode 100644 index 0000000000..877a3fb849 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 23.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 24.png b/static/images/user-guides/k8s/bg/Untitled 24.png new file mode 100644 index 0000000000..c728f14f0d Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 24.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 25.png b/static/images/user-guides/k8s/bg/Untitled 25.png new file mode 100644 index 0000000000..8763b3eda0 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 25.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 26.png b/static/images/user-guides/k8s/bg/Untitled 26.png new file mode 100644 index 0000000000..584fc14cca Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 26.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 27.png b/static/images/user-guides/k8s/bg/Untitled 27.png new file mode 100644 index 0000000000..6f84d6b4e1 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 27.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 28.png b/static/images/user-guides/k8s/bg/Untitled 28.png new file mode 100644 index 0000000000..8e999ad99c Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 28.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 29.png b/static/images/user-guides/k8s/bg/Untitled 29.png new file mode 100644 index 0000000000..914c995f7d Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 29.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 3.png b/static/images/user-guides/k8s/bg/Untitled 3.png new file mode 100644 index 0000000000..1ae124fc2a Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 3.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 30.png b/static/images/user-guides/k8s/bg/Untitled 30.png new file mode 100644 index 0000000000..dd8d424f2c Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 30.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 31.png b/static/images/user-guides/k8s/bg/Untitled 31.png new file mode 100644 index 0000000000..35fc5e74cd Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 31.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 32.png b/static/images/user-guides/k8s/bg/Untitled 32.png new file mode 100644 index 0000000000..b9147721d5 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 32.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 33.png b/static/images/user-guides/k8s/bg/Untitled 33.png new file mode 100644 index 0000000000..59bbf25e74 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 33.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 34.png b/static/images/user-guides/k8s/bg/Untitled 34.png new file mode 100644 index 0000000000..07158c2886 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 34.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 35.png b/static/images/user-guides/k8s/bg/Untitled 35.png new file mode 100644 index 0000000000..6c6981157f Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 35.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 36.png b/static/images/user-guides/k8s/bg/Untitled 36.png new file mode 100644 index 0000000000..45e812bd68 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 36.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 37.png b/static/images/user-guides/k8s/bg/Untitled 37.png new file mode 100644 index 0000000000..c6878046c5 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 37.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 38.png b/static/images/user-guides/k8s/bg/Untitled 38.png new file mode 100644 index 0000000000..b9cdad2bda Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 38.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 39.png b/static/images/user-guides/k8s/bg/Untitled 39.png new file mode 100644 index 0000000000..397d102a46 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 39.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 4.png b/static/images/user-guides/k8s/bg/Untitled 4.png new file mode 100644 index 0000000000..df5154d67d Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 4.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 40.png b/static/images/user-guides/k8s/bg/Untitled 40.png new file mode 100644 index 0000000000..850637576d Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 40.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 5.png b/static/images/user-guides/k8s/bg/Untitled 5.png new file mode 100644 index 0000000000..f52930426d Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 5.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 6.png b/static/images/user-guides/k8s/bg/Untitled 6.png new file mode 100644 index 0000000000..0157bcb81a Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 6.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 7.png b/static/images/user-guides/k8s/bg/Untitled 7.png new file mode 100644 index 0000000000..f1453334d6 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 7.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 8.png b/static/images/user-guides/k8s/bg/Untitled 8.png new file mode 100644 index 0000000000..1490b3a184 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 8.png differ diff --git a/static/images/user-guides/k8s/bg/Untitled 9.png b/static/images/user-guides/k8s/bg/Untitled 9.png new file mode 100644 index 0000000000..58a3001c40 Binary files /dev/null and b/static/images/user-guides/k8s/bg/Untitled 9.png differ diff --git a/static/images/user-guides/k8s/bg/spin-blue-start.jpg b/static/images/user-guides/k8s/bg/spin-blue-start.jpg new file mode 100644 index 0000000000..c65e347d4f Binary files /dev/null and b/static/images/user-guides/k8s/bg/spin-blue-start.jpg differ diff --git a/static/images/user-guides/k8s/bg/spin-blue-with-green.jpg b/static/images/user-guides/k8s/bg/spin-blue-with-green.jpg new file mode 100644 index 0000000000..37ba5cf0e4 Binary files /dev/null and b/static/images/user-guides/k8s/bg/spin-blue-with-green.jpg differ diff --git a/static/images/user-guides/k8s/bg/spin-green.jpg b/static/images/user-guides/k8s/bg/spin-green.jpg new file mode 100644 index 0000000000..6a0647c6dc Binary files /dev/null and b/static/images/user-guides/k8s/bg/spin-green.jpg differ diff --git a/static/images/user-guides/k8s/bg/spinui-dep-rs.png b/static/images/user-guides/k8s/bg/spinui-dep-rs.png new file mode 100644 index 0000000000..5366e5f219 Binary files /dev/null and b/static/images/user-guides/k8s/bg/spinui-dep-rs.png differ diff --git a/static/images/user-guides/k8s/bg/spinui-loadbalancers.png b/static/images/user-guides/k8s/bg/spinui-loadbalancers.png new file mode 100644 index 0000000000..3bd2076240 Binary files /dev/null and b/static/images/user-guides/k8s/bg/spinui-loadbalancers.png differ