diff --git a/content/en/kanvas/concepts/helm-kanvas-snapshot.md b/content/en/kanvas/concepts/helm-kanvas-snapshot.md new file mode 100644 index 0000000000..32814e308d --- /dev/null +++ b/content/en/kanvas/concepts/helm-kanvas-snapshot.md @@ -0,0 +1,90 @@ +--- +title: Helm Kanvas Snapshot +description: Helm CLI plugin to visually render a snapshot of your Helm charts. +display_title: false +categories: [kanvas] +--- + +# Helm Kanvas Snapshot + +## Extension Overview + +The **Kanvas Snapshot Helm Plugin** allows users to generate a visual snapshot of their Helm charts directly from the command line. It simplifies the process of creating Meshery Snapshots, providing a visual representation of packaged Helm charts. This plugin integrates with Meshery Cloud and GitHub Actions to automate the workflow of snapshot creation, which is especially useful for Helm users who need to quickly visualize their chart configurations. + +Helm charts can be complex, especially when custom configurations are applied via `values.yaml` files. This Meshery extension bridges the gap between Helm chart configurations and their visual representation by converting Helm charts into **Kanvas Snapshots**. These snapshots can be received either via email or as a URL displayed directly in the terminal. + +### Features + +1. **Snapshot Generation:** Create visual snapshots of Helm charts, complete with associated resources. +2. **Synchronous/Asynchronous Delivery:** Choose between receiving snapshots via email or directly in the terminal. +3. **Seamless Integration:** Leverages Meshery Cloud and GitHub Actions to handle snapshot rendering. +4. **Support for Packaged Charts:** Works with both packaged `.tar.gz` charts and unpackaged Helm charts. + +## Installation and Use + +To install the Meshery Snapshot Helm Plugin, use the following steps: + +### Prerequisites + +- `helm` must be installed on your system. +- (Optional) A free [Meshery Cloud](https://cloud.meshery.io) user account. + +**Plugin Installation** + +1. Run the following command to install the Helm Kanvas Snapshot plugin: + +
+  
+
helm plugin install https://github.com/meshery/helm-kanvas-snapshot
+
+
+ +3. Verify the installation by running: + + +
+  
+
helm plugin list
+
+
+ + You should see the Kanvas Snapshot listed as `helm-kanvas-snapshot`. + +4. Set up the required environment variables (see the [Environment Variables](#environment-variables) section). + +### Usage + +Once the plugin is installed, you can generate a snapshot using either a packaged or unpackaged Helm chart. + + +
+  
+
helm snapshot --f <chart-URI> [--name <snapshot-name>] [--email <email>]
+
+
+ +- **`-f`**, **`--file`**: (required) path or URL to the Helm chart (required). +- **`--name`**: (optional) name for the snapshot. If not provided, a name will be auto-generated based on the chart name. +- **`-e`**, **`--email`**: (optional) email address to notify when snapshot is ready. If not provided, a link to the snapshot will be displayed in the terminal. + +**Example** + +To generate a snapshot for a Helm chart located at `https://meshery.io/charts/v0.8.0-meshery.tar.gz`, you can use: + +
+  
+
helm snapshot -f https://meshery.io/charts/v0.8.0-meshery.tar.gz --name meshery-chart
+
+
+ +
+ +## About Meshery Extensions + +[Meshery Extensions](https://meshery.io/extensions) are plugins or add-ons that enhance the functionality of the Meshery platform beyond its core capabilities. Meshery supports different types of extensions ([docs](/extensions/)): + +- [Adapters](/concepts/architecture/adapters): Adapters allow Meshery to interface with the different cloud native infrastructure. +- [Load Generators](/extensibility/load-generators): for performance characterization and benchmarking +- [Integrations](/extensibility/integrations): model-based support for a broad variety of design and orchestration of cloud and cloud native platforms, tools, and technologies. +- [Providers](/extensibility/providers): for connecting to different cloud providers and infrastructure platforms +- [UI Plugins](/extensibility/ui): Meshery UI has a number of extension points that allow users to customize their experience with third-party plugins. diff --git a/content/en/kanvas/concepts/images/helm-chart-color.svg b/content/en/kanvas/concepts/images/helm-chart-color.svg new file mode 100644 index 0000000000..bf5e404751 --- /dev/null +++ b/content/en/kanvas/concepts/images/helm-chart-color.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/content/en/kanvas/concepts/images/kanvas-icon-color.svg b/content/en/kanvas/concepts/images/kanvas-icon-color.svg new file mode 100644 index 0000000000..72b80c5389 --- /dev/null +++ b/content/en/kanvas/concepts/images/kanvas-icon-color.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/en/kanvas/concepts/images/kanvas-snapshot.png b/content/en/kanvas/concepts/images/kanvas-snapshot.png new file mode 100644 index 0000000000..7347bfd39a Binary files /dev/null and b/content/en/kanvas/concepts/images/kanvas-snapshot.png differ diff --git a/content/en/kanvas/concepts/images/meshsync.svg b/content/en/kanvas/concepts/images/meshsync.svg new file mode 100644 index 0000000000..0f0200a098 --- /dev/null +++ b/content/en/kanvas/concepts/images/meshsync.svg @@ -0,0 +1 @@ +meshsync \ No newline at end of file diff --git a/content/en/kanvas/concepts/kanvas-snapshot.md b/content/en/kanvas/concepts/kanvas-snapshot.md new file mode 100644 index 0000000000..211cc6d199 --- /dev/null +++ b/content/en/kanvas/concepts/kanvas-snapshot.md @@ -0,0 +1,212 @@ +--- +title: Kanvas Snapshot +description: Screenshot service provided via Kanvas to capture a snapshot of your infrastructure at any given time. +display_title: false +categories: [kanvas] +aliases: +- /kanvas/concepts/snapshot +--- + +# Kanvas Snapshot + +Kanvas Snapshot is a screenshot service provided via Kanvas for your designs. Visualize changes to your code-base with each pull request made. The SnapShot GitHub Action is configurable from within your Cloud account. + +
+How the SnapShot service works + +

Functional Sequence Diagram

+ + +
+ +

Installing Kanvas Snapshot: Github Pull Request

+ +Connect MeshMap to your GitHub repo and see changes pull request-to-pull request. Get snapshots of your infrastructure directly in your PRs. + + +## Configurating the SnapShot Service + +The Snapshot service does not need access to your Meshery deployment. It is a standalone service. + +### When Infrastructure is located in the file-system + +```yaml +name: "Kanvas Snapshot With File-located in Fs" +on: # rebuild any PRs and main branch changes + pull_request: + push: + branches: + - main + - master + - "releases/*" + +jobs: + test: # make sure the action works on a clean machine without building + runs-on: ubuntu-latest + steps: + - name: Set PR number # To comment the final status on the Pull-request opened in any repository + run: | + export pull_number=$(jq --raw-output .pull_request.number "$GITHUB_EVENT_PATH") + echo "PULL_NO=$pull_number" >> $GITHUB_ENV + - uses: actions/checkout@v3 # the repository where your infrastructure is located + - uses: actions/checkout@v3 #this step would go and would be no longer needed to be written + with: + path: action + repository: layer5labs/kanvas-snapshot + - id: test_result + uses: layer5labs/MeshMap-Snapshot@v0.0.4 + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} # github's personal access token example: "ghp_...." + providerToken: ${{ secrets.PROVIDER_TOKEN }} # Meshery Cloud Authentication token, signin to meshery-cloud to get one, example: ey..... + prNumber: ${{ env.PULL_NO }} # auto-filled from the above step + application_type: "Kubernetes Manifest" # your application type, could be any of three: "Kubernetes Manifest", "Docker Compose", "Helm Chart" + filePath: "action/__tests__/manifest-test" # relative file-path from the root directory in the github-runner env, you might require to checkout the repository as described in step 2 +``` + + +### When Infrastructure is identified via URL + +```yaml +name: "Kanvas Snapshot With URL-Upload" +on: # rebuild any PRs and main branch changes + pull_request: + push: + branches: + - main + - master + - "releases/*" + +jobs: + test: # make sure the action works on a clean machine without building + runs-on: ubuntu-latest + steps: + - name: Set PR number # To comment the final status on the Pull-request opened in any repository + run: | + export pull_number=$(jq --raw-output .pull_request.number "$GITHUB_EVENT_PATH") + echo "PULL_NO=$pull_number" >> $GITHUB_ENV + - uses: actions/checkout@v3 #this step would go and would be no longer needed to be written + with: + path: action + repository: layer5labs/kanvas-snapshot + - id: test_result + uses: layer5labs/MeshMap-Snapshot@v0.0.4 + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} # github's personal access token example: "ghp_...." + providerToken: ${{ secrets.PROVIDER_TOKEN }} # Meshery Cloud Authentication token, signin to meshery-cloud to get one, example: ey..... + prNumber: ${{ env.PULL_NO }} # auto-filled from the above step + application_type: "Helm Chart" # your application type, could be any of three: "Kubernetes Manifest", "Docker Compose", "Helm Chart" + application_url: "https://github.com/meshery/meshery.io/raw/master/charts/meshery-v0.6.88.tgz" +``` + +#### FileSystem Approach Notes + +The filesystem-approach asks for your relative file-path and automatically merges all the yaml files together to bundle up into one. So you might like to give the root directory where all the yamls are located. It doesn't move recursevely in internal folders, so only the first level yaml files are checked. + +## List of Input variables supported: + +```yaml +designId: # id of input #deprecated + description: "The design uuid, example: 3c116d0a-49ea-4294-addc-d9ab34210662" + required: false + default: "{}" +applicationId: #deprecated + description: "The application uuid, example: 3c116d0a-49ea-4294-addc-d9ab34210662" + required: false +githubToken: + description: "Github PAT token" + required: true +providerToken: + description: "Meshery Authentication Provider Token" + required: true +prNumber: + description: "The Pull request on which comment has to be made" + required: false + default: 0 +filePath: + description: "The relative filepath of the location where the manifests are stored" + required: false +application_type: + description: "Application upload type, any of the three, Kubernetes Manifest, Docker Compose, Helm Chart" + required: true +application_url: + description: "Application's source url where the manifests or data is stored" + required: false +``` + +## Customizing Snapshot Workflow Triggers in Kanvas Snapshot + +You can configure your workflows to run when specific activity on GitHub happens, at a scheduled time, or when an event outside of GitHub occurs. + +### About events that trigger workflows + +GitHub Actions provides a variety of events that can trigger workflows, allowing you to automate your software development process. Each event corresponds to a specific activity, such as creating a pull request, pushing code to a repository, or releasing a new version. + +### Supported Events + +The Kanvas Snapshot Action supports all of the events listed in the GitHub documentation: +For detailed information about each event, including its properties and payloads, refer to the [GitHub Actions documentation](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows). + +### Workflow Syntax for Event Filtering + +When defining workflows, you can use the `on` keyword to specify which events trigger the workflow. You can further filter the triggering conditions by using the `types`, `branches`, `tags`, and other options. For example: + +```yaml +on: + push: + branches: + - main + pull_request: + types: + - opened + - synchronize +``` + +Specific events that are relevant to the Kanvas Snapshot Action are: + +- **push:** This event is triggered when code is pushed to the repository. It is the most common event used to trigger workflows. +- **pull_request:** This event is triggered when a pull request is opened or updated. It is often used to trigger workflows that run tests or linters on the pull request's code. + +- **workflow_dispatch:** This event is triggered when a workflow is manually triggered. It can be used to trigger workflows on demand, such as for publishing a new release or addressing critical bugs. + +For a comprehensive list of events that can be used in GitHub Actions, please refer to the Supported Events section above. + +## What Happens to Workflow Customizations on Upgrade? + +Customizations to the trigger criteria for the Kanvas Snapshot actions are preserved when upgrading to a new version of the action. However, there may be some cases where customizations are lost, such as when the syntax for specifying the trigger criteria changes in a new version of the action. + +Here are some examples of cases where customizations may be lost: + +- You currently have a workflow that is triggered on the push event, and the syntax for specifying the push event changes in a new version of the action. + +- You have a workflow that is triggered on a custom event, and the custom event is no longer supported in a new version of the action. + +It is always a good practice to test your workflows after upgrading to a new version of the Kanvas Snapshot Action to make sure that your customizations are still working as expected. + +## Usage: + +After testing you can [create a v1 tag](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md) to reference the stable and latest V1 action + +# General Upgrade Guide + +[Kanvas Snapshot Release Page](https://github.com/layer5labs/kanvas-snapshot/releases) + + +``` + - id: test_result + uses: layer5labs/MeshMap-Snapshot@v0.0.5 # <-- Update the version to latest from the Kanvas-Snapshot release page + with: + ... +``` + +## Upgrade/Migrate Guide - For Meshery + +1. Given changes done in `action.yml` in Kanvas Snapshot, updating the workflows is required. +2. Given changes done other than in `action.yml` in Kanvas Snapshot, the update in the `.github/worflows` is not a hard requirement, but doesnt hurt. + diff --git a/content/en/kanvas/concepts/kanvas.md b/content/en/kanvas/concepts/kanvas.md new file mode 100644 index 0000000000..c0d360f657 --- /dev/null +++ b/content/en/kanvas/concepts/kanvas.md @@ -0,0 +1,43 @@ +--- +title: Kanvas +aliases: +- /kanvas/concepts/kanvas +description: Collaborative cloud native visual designer to design and manage infrastructure and applications. +display_title: false +categories: [kanvas] +--- + +# Kanvas BETA + +Kanvas is a GitOps-infused cloud native visual designer for Kubernetes and cloud native applications. Kanvas works with your Kubernetes clusters so that you design and manage your infrastructure and applications between members of your team. Kanvas has two modes: Designer and Visualizer. Create and share your own Kubernetes deployments and patterns in Kanvas Designer. Deploy your designs and manage your infrastructure using Kanvas Visualizer. It includes multi-user collaboration features that allow teams to work together seamlessly towards achieving their goals in a more timely manner. Kanvas aims at removing all the challenging aspects of collaboration from the equation so that everyone on your team can be on the same page when it comes to managing cloud-native infrastructure projects. + +### Guide to use Kanvas' features +Explore the following features of Kanvas in the [Kanvas Docs](https://docs.kanvas.new): + +- **Publishing a Design** – Publish your first design. +- **Sharing a Design** – Share your design with friends. +- **Importing a Design** – Import a design from the catalog or locally. +- **Merging Designs** – Combine multiple designs into one. +- **Importing an Application** – Import different types of applications. +- **Component Shapes** – Understand what each component shape signifies. +- **Edge Shapes** – Learn what each edge represents. + +### Kanvas For GitOps + +Kanvas is a valuable GitOps tool for DevOps teams as it allows them to configure, and manage infrastructure resources. This enables streamlining the process of deploying and undeploying large resources and reduces the time and effort required to set up and maintain environments. Additionally, Kanvas provides features such as visualization, collaboration, and snapshots, which can make cloud native business faster. Kanvas also helps DevOps teams maintain a high level of control, and governance by providing a way to define and manage their infrastructure as code. This reduces human error by overcoming the traditional way of configuring YAMLs and ensures compliance with best practices and industry standards. + +### Kanvas For Developers + +For developers, Kanvas is valuable as it enables them to manage their infrastructure in an effortless manner. This allows developers to concentrate on coding and delivering features instead of infrastructure management. Furthermore, Kanvas offers efficient management of multiple Kubernetes clusters and manifests, guaranteeing consistency and up-to-dateness across development, staging, and production environments. This minimizes the potential for errors, workloads, and inconsistencies in the configurations, as it detects clusters automatically. This ensures the infrastructure is always available. + +
Kanvas Designer Walkthrough:
+ + + +See on YouTube: [Kanvas Designer Walkthrough](https://www.youtube.com/watch?v=qaoYRP3oLok) + + + diff --git a/content/en/kanvas/tutorials/artifacthub/_index.md b/content/en/kanvas/tutorials/artifacthub/_index.md new file mode 100644 index 0000000000..ff29c5acb4 --- /dev/null +++ b/content/en/kanvas/tutorials/artifacthub/_index.md @@ -0,0 +1,3 @@ +--- +title: Artifacthub +--- \ No newline at end of file diff --git a/content/en/kanvas/tutorials/artifacthub/publish-to-artifacthub.md b/content/en/kanvas/tutorials/artifacthub/publish-to-artifacthub.md new file mode 100644 index 0000000000..61e35aa1ee --- /dev/null +++ b/content/en/kanvas/tutorials/artifacthub/publish-to-artifacthub.md @@ -0,0 +1,44 @@ +--- +title: Publishing Meshery Designs to ArtifactHub +model: artifacthub +params: + kind: design +categories: [tutorials] +description: Step by step example for how to export Meshery Designs and publish them to an ArtifactHub repository. +aliases: +- /kanvas/tutorials/publish-to-artifacthub +--- + +## Introduction + +In this tutorial, we'll see how to export a Design from Meshery which we will use to populate an ArtifactHub repository. + +## Prerequisites + +- Access to the _Meshery Playground_. If you don't have an account, sign up at [Meshery Playground](https://playground.meshery.io/). + +## Steps + +### 1. Click on MeshMap +![](/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_1.png) + + +### 2. Find the Design in the Side Panel +![](/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_2.png) + + +### 3. Click on Export Design +![](/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_3.png) + + +### 4. Click on EXPORT under OCI +![](/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_4.png) + +### Prepare your ArtifactHub repo +You will need to have an ArtifactHub repository already created with `Kind` as `Meshery Designs`. See [ArtifactHub documentation](https://artifacthub.io/docs/topics/repositories/meshery-designs/) for more information on managing repositories. + +### Push Design to ArtifactHub repository +At this point you should have downloaded your design as a `tar` archive. This archive contains a second archive which holds the metadata files to publish to your ArtifactHub repository. Expand the first `tar` archive and locate the resulting files. Expand the second archive you find there and you will have a folder containing two files: `artifacthub-pkg.yml` and `design.yml`. Move these files to your prepared ArtifactHub repository and push it upstream. + +### Verify Repository in ArtifactHub +Once the files are pushed to the ArtifactHub repo you will need to wait until ArtifactHub indexes it. You can verify the status of the repository in the ArtifactHub control panel. \ No newline at end of file diff --git a/content/en/kanvas/tutorials/aws/_index.md b/content/en/kanvas/tutorials/aws/_index.md new file mode 100644 index 0000000000..a7f9beedbd --- /dev/null +++ b/content/en/kanvas/tutorials/aws/_index.md @@ -0,0 +1,3 @@ +--- +title: AWS +--- \ No newline at end of file diff --git a/content/en/kanvas/tutorials/aws/deploy-aws-ec2-instances-with-meshery.md b/content/en/kanvas/tutorials/aws/deploy-aws-ec2-instances-with-meshery.md new file mode 100644 index 0000000000..f9014350d4 --- /dev/null +++ b/content/en/kanvas/tutorials/aws/deploy-aws-ec2-instances-with-meshery.md @@ -0,0 +1,159 @@ +--- +title: Deploy AWS EC2 Instances with Meshery +description: Learn how to deploy and manage AWS EC2 instances through Kubernetes with Meshery, utilizing AWS Controllers for Kubernetes (ACK) to enhance cloud resource management +model: aws +params: + kind: EC2 +categories: [tutorials] +aliases: +- /kanvas/tutorials/deploy-aws-ec2-instances-with-meshery +--- + +### Introduction + +Meshery is a powerful multi-cloud management platform that enables you to configure, deploy, and manage AWS resources, such as EC2 instances. In order to manage AWS resources, Meshery uses [AWS Controllers for Kubernetes (ACK)](https://aws.amazon.com/blogs/containers/aws-controllers-for-kubernetes-ack/). ACK facilitates the bridge between Kubernetes and AWS services, enabling Meshery to manage AWS resources and Meshery enabling you to benefit from the enhanced experience that Meshery and its extensions offer. + +Meshery has a number of extensions, adapters, and plugins. In this tutorial, we will use the [Kanvas](/extensions/kanvas) extension to provide an intuitive, visual experience for configuring and deploying an AWS EC2 instance. Among other aspects, Kanvas provides an alternative to command-line tools like `kubectl` by offering infrastructure as design. Once you connect your Kubernetes cluster to Meshery, you can configure, deploy, and manage AWS resources directly from the Kanvas interface, making deployments more intuitive and collaborative + +In this guide, you’ll explore how to deploy AWS resources, including setup and architecture details. This guide also covers how to access pre-configured designs from [Meshery Catalog](https://meshery.io/catalog) and demonstrates how to visualize deployed resources using Kanvas' operator mode, offering a comprehensive understanding of AWS resource management. + +### Prerequisites + +1. [Self Hosted Meshery Installation](/installation). +1. **AWS Account**: An active AWS account is required for accessing AWS resources. +1. **Kubernetes Cluster**: A running Kubernetes cluster, such as Minikube or EKS. + +### Table of Contents + +- [Introduction](#introduction) +- [Prerequisites](#prerequisites) +- [Table of Contents](#table-of-contents) +- [Overview of Deployment Steps](#overview-of-deployment-steps) +- [1. Connect your Kubernetes Cluster to Meshery](#1-connect-your-kubernetes-cluster-to-meshery) +- [2. Configure and Deploy the EC2 Controller](#2-configure-and-deploy-the-ec2-controller) + - [Configure the AWS Secret](#configure-the-aws-secret) + - [Configure the EC2 Controller Pod to Use the Secret](#configure-the-ec2-controller-pod-to-use-the-secret) + - [Deploy EC2 Controller Design](#deploy-ec2-controller-design) +- [3. Deploy the VPC Workflow](#3-deploy-the-vpc-workflow) +- [4. Deploy EC2 Instance](#4-deploy-ec2-instance) +- [Conclusion](#conclusion) + +### Overview of Deployment Steps + +**1. Integrate Your Kubernetes Cluster with Meshery** + +Begin by connecting your Kubernetes cluster to Meshery, establishing the foundation for interaction with AWS resources via ACK. + +**2. Set Up Essential AWS Resources** + +Use Meshery to deploy foundational resources such as VPCs, subnets, and other networking components necessary for your EC2 instance within AWS. + +**3. Verify and Monitor Deployment** + +Once deployment is complete, verify the EC2 instances via the AWS Management Console or Meshery’s visualization mode, where you’ll gain an interactive view of your deployed resources. + +### 1. Connect your Kubernetes Cluster to Meshery + +To begin, connect your Kubernetes cluster to Meshery. This guide uses `minikube`, which supports two deployment options for Meshery: + +- **In-Cluster Deployment**: Deploys Meshery within the Kubernetes cluster using Helm inside the meshery namespace. + +- **Out-of-Cluster Deployment**: Runs Meshery in Docker containers, allowing external connectivity to the Minikube cluster. + +For this guide, the `in-cluster deployment` method is used. Follow this [setup guide for Meshery on Minikube](/installation/kubernetes/minikube) to deploy Meshery in-cluster. After the deployment, open the Meshery UI at `localhost:9081` to verify that the cluster is listed. Click on the cluster name to ping and confirm connectivity. + +![Connect Minikube Cluster](/kanvas/tutorials/images/aws-controllers/aws-connection.png) + +### 2. Configure and Deploy the EC2 Controller + +In this section, you will set up the EC2 controller and configure it to connect to your AWS account. This process involves creating a Kubernetes secret that contains your AWS access keys and configuring the controller pod to consume this secret. While these configurations are already included in our designs, the steps will be demonstrated for clarity. + +1. **Clone the EC2 Controller Design**: Start by [cloning the EC2 controller design](https://meshery.io/catalog/deployment/ec2-controller-design-8f7e1431-3885-4ebf-9ef7-d2ec64bd4eb5.html) from the catalog. To do this, click on **Clone** on the catalog page. Once cloned, open the design in the playground, and you will see it displayed on the Kanvas. + + ![EC2 Controller Chart](/kanvas/tutorials/images/aws-controllers/controller-chart.png) + +2. **Set the Deployment Namespace**: This design has been configured to be deployed in the `ack-system` namespace. + +This EC2 controller design includes: + + - **The EC2 Controller Pod**: This runs the main EC2 controller. This pod is responsible for managing the lifecycle of EC2 instances and their associated resources. + - **Custom Resource Definitions (CRDs)**: These CRDs define the desired state of various AWS resources, such as VPCs, subnets, NAT gateways, and other networking components.By utilizing these CRDs, the EC2 controller can interact with the AWS API to create, update, and manage these resources. + - **Service Account**: The service account associated with the controller pod has the necessary IAM permissions. These permissions allow the controller to perform essential functions, such as creating and managing AWS resources. + - **AWS Credentials secret**: The AWS credentials secret stores your AWS access keys and secret access keys securely. This secret is essential for authenticating the AWS controller with your AWS account. + +#### Configure the AWS Secret + +To connect the EC2 controller to AWS, create a Kubernetes secret containing your AWS credentials. + +1. Double-click the Secret component to open its configuration. + +1. Under **Data**, add the base 64 encoded values of your AWS keys. + - **AWS_ACCESS_KEY_ID**: `` + - **AWS_SECRET_ACCESS_KEY**: `` + + Encode your AWS key and secret with a [base64 encoder](https://www.base64encode.org/), then enter them in the configuration. + + ![Configure Secret](/kanvas/tutorials/images/aws-controllers/configure-secret.png) + +#### Configure the EC2 Controller Pod to Use the Secret + +While this step is already handled in the design, but it's worth clarifying how the controller pod connects to the secret through environment variables. + +1. Double-click the EC2 controller pod to open its configuration tab. + +1. In the **Containers** section, scroll to **env** and click the **+** to add two environment variables: + + - **AWS_ACCESS_KEY_ID**: For the name, put in `AWS_ACCESS_KEY_ID`, click on the `secret Key Ref` dropdown and put in the **key** as `AWS_ACCESS_KEY_ID` and the secret resource **name** as `aws_creds`. + - **AWS_SECRET_ACCESS_KEY**: Set the `AWS_SECRET_ACCESS_KEY` similarly, using the same secret key reference. + +#### Deploy EC2 Controller Design + +After configuring your design, the next step is deployment. To learn more about deploying your designs in Meshery, see [Deploying Meshery Designs](https://cloud.meshery.io/academy/learning-paths/11111111-1111-1111-1111-111111111111/mastering-meshery/introduction-to-meshery?chapter=deploying-meshery-designs). To deploy the resources, follow these steps: + +1. Click the **Actions** button at the top of the Kanvas and click **Deploy**. + +1. Once the deployment is complete, click **Open in Visualizer** to switch to Operator mode and see a pre-filtered view of your just deployed resources in the cluster. Alternatively, you can click *Operate* at the top of the Kanvas to enter **Operator** mode. + + ![Operator Mode](/kanvas/tutorials/images/aws-controllers/controller-operator-mode.png) + +To get the filtered view shown above, click the filter icon and adjust the following settings: + + - For `view Selector` select `single namespace` + - For `Kinds` select `Deployment, Pod, secret` + - For `namespace` select `ack-system` + +### 3. Deploy the VPC Workflow + +This step involves deploying all the necessary resources to create the VPC and other networking components for the EC2 instance. The resources included in this network topology include: + +- 1 VPC +- 1 Internet Gateway +- 1 NAT Gateway +- 1 Elastic IP +- 2 Route Tables (Public and Private) +- 2 Subnets (1 Public, 1 Private) +- 1 Security Group + +1. Start by [cloning the design](https://cloud.meshery.io/catalog/content/catalog/vpc-workflow-design-50cac19e-209c-4acf-b91c-4784281db033) from the catalog. + +2. Once cloned, open the design in the playground, and you will see it displayed on the Kanvas. + +3. You can adjust CIDR blocks, region, and other parameters as needed through the configuration tab. This design is configured to be deployed in the `us-east-1` region. + +4. Click the **Actions** button to deploy. + +5. After deployment, verify the setup in your AWS Management Console. + +### 4. Deploy EC2 Instance + +With the VPC and networking resources set up, deploy the EC2 instances within the VPC using the following steps. + +1. [Clone the EC2 instances design](https://cloud.meshery.io/catalog/content/catalog/ec2-instances-design-a344f109-2d92-41da-8644-3bc285c3ca9e) from the catalog. + +2. Open the design on the Playground and deploy the instances. + +3. Navigate to the AWS Management Console to confirm the instances' successful deployment. + +### Conclusion + +This guide covered the steps to deploy and manage EC2 instances using Meshery. It demonstrated how to leverage pre-configured catalog designs, configure and deploy resources, set up the controller and necessary secrets, configure VPC networking resources, and ultimately deploy the EC2 instances. It also showed how to visualize Kubernetes resources using Kanvas's operator mode. This process highlights the ease of managing AWS resources visually through Meshery’s Kanvas interface, eliminating the need for CLI commands. diff --git a/content/en/kanvas/tutorials/azure/_index.md b/content/en/kanvas/tutorials/azure/_index.md new file mode 100644 index 0000000000..561106c0ca --- /dev/null +++ b/content/en/kanvas/tutorials/azure/_index.md @@ -0,0 +1,3 @@ +--- +title: Azure +--- \ No newline at end of file diff --git a/content/en/kanvas/tutorials/azure/deploy-azure-resources-with-meshery.md b/content/en/kanvas/tutorials/azure/deploy-azure-resources-with-meshery.md new file mode 100644 index 0000000000..fc13a2941b --- /dev/null +++ b/content/en/kanvas/tutorials/azure/deploy-azure-resources-with-meshery.md @@ -0,0 +1,148 @@ +--- +title: Deploy Azure resources with Meshery +description: Learn how to deploy and manage Azure resources through Kubernetes with Meshery, utilizing ASO operator to enhance cloud resource management +model: azure +params: + kind: resources +categories: [tutorials] +aliases: +- /kanvas/tutorials/deploy-azure-resources-with-meshery +--- + +### Introduction + +Meshery now supports managing Azure resources declaratively through Kubernetes by integrating with Azure Service Operator (ASO). With this capability, you can visually design, deploy, and manage a variety of Azure resources—such as Storage Accounts, Key Vaults, SQL Servers, and more—directly from Meshery’s UI. In this tutorial, you’ll install the ASO operator (without CRD pattern configurations, as Meshery will handle them), create a Service Principal and a Kubernetes secret with your Azure credentials, and use Meshery to provision Azure resources seamlessly into your subscription. + + +### Prerequisites + +Before you begin, ensure you have the following: + +1. **Meshery Installed** + A self-hosted Meshery instance running on your Kubernetes cluster (in-cluster or out-of-cluster). +2. **Kubernetes Cluster** + A running Kubernetes cluster (v1.16+) with `kubectl` configured. +3. **Azure Subscription** + An active Azure subscription where Storage Accounts will be provisioned. +4. **Azure CLI** + Installed and authenticated (`az login`) in your local shell. +5. **cert-manager** + Installed in your Kubernetes cluster (required by Azure Service Operator). + + +### Table of Contents + +1. [Create Azure Service Principal](#1-create-azure-service-principal) +2. [Connect Meshery to Your Cluster](#2-connect-meshery-to-your-cluster) +3. [Install Azure Service Operator (Operator Only)](#3-install-azure-service-operator-operator-only) + + * 3.1 [Deploy ASO Operator](#31-deploy-aso-operator) + * 3.2 [Create Azure Credentials Secret](#32-create-azure-credentials-secret) +4. [Deploy ASO Operator using Kanvas](#4-deploy-aso-using-kanvas) +5. [Start deploying azure resources in Kanvas](#5-start-deployment-of-azure-resources-using-kanvas) +6. [Conclusion](#6-conclusion) + +### 1. Create Azure Service Principal + +If you do not already have a Service Principal (SP) for Meshery, create one using the Azure CLI: + +
+az ad sp create-for-rbac -n azure-service-operator --role contributor --scopes /subscriptions/<AZURE_SUBSCRIPTION_ID> + +
+ +This command outputs the following credentials: + +* `appId`: Application ID (Client ID) +* `displayName`: Service Principal Name +* `name`: Azure Service Principal URL +* `password`: Client Secret +* `tenant`: Tenant ID + +To export them, manually enter: + +
+export AZURE_CLIENT_ID=<appId> +export AZURE_CLIENT_SECRET=<password> +export AZURE_TENANT_ID=<tenant> +export AZURE_SUBSCRIPTION_ID=<subscriptionId> + +
+ + +### 2. Connect Meshery to Your Cluster + +If you haven’t already connected your cluster to Meshery, run: + +
+mesheryctl system start + +
+ + +Then open the Meshery UI (default: [`http://localhost:9081`](http://localhost:9081)) and ensure your cluster appears under **Lifecycle → Connections**. + + + +### 3. Install Azure Service Operator (Operator Only) + +#### Prerequisite + +Create a cert-manager that is necessary for deployment of Azure Service operator + +
+kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.14.1/cert-manager.yaml + +
+ + +#### 3.1 Deploy ASO Operator + +Apply the official ASO operator manifest (Meshery will manage CRDs): + +
+kubectl apply -f https://github.com/Azure/azure-service-operator/releases/download/v2.13.0/azureserviceoperator_v2.13.0.yaml + +
+ +#### 3.2 Create Azure Credentials Secret + +Azure Service Operator requires a Kubernetes secret with your Azure identity: + +
+kubectl create secret generic azure-credentials --namespace azureserviceoperator-system --from-literal=AZURE_CLIENT_ID=$AZURE_CLIENT_ID --from-literal=AZURE_CLIENT_SECRET=$AZURE_CLIENT_SECRET --from-literal=AZURE_TENANT_ID=$AZURE_TENANT_ID --from-literal=AZURE_SUBSCRIPTION_ID=$AZURE_SUBSCRIPTION_ID + +
+ + +### 4. Deploy Azure Service Operator using Kanvas + +1. In the Meshery UI, navigate to **Kanvas**. +2. Click **Catalog**, filter by **Azure**, and select the **Azure Operator** design. +3. Click **Clone** to add it to your canvas. +4. Update the secret **aso-controller-settings** in the design template. The details are also mentioned in the catalog +5. Click **Actions → Deploy**. + + + +### 5. Start deployment of Azure resources using Kanvas + +* Go to Kanvas and start by picking up Azure components and putting it to design area. +* Click **Actions → Deploy**. +* **Azure Portal**: Confirm the new Storage Account appears in your specified resource group. + + + +### 6. Conclusion + +You have successfully: + +* Created an Azure Service Principal for Meshery +* Connected your Kubernetes cluster to Meshery +* Installed the Azure Service Operator (Meshery managed CRDs) +* Created a Kubernetes secret for Azure credentials +* Designed and deployed Azure resources using Meshery’s Kanvas + +--- + +If you want to learn more about Azure Service Operator, visit the [official ASO documentation](https://azure.github.io/azure-service-operator/). diff --git a/content/en/kanvas/tutorials/azure/deploy-azure-storage-account-with-meshery.md b/content/en/kanvas/tutorials/azure/deploy-azure-storage-account-with-meshery.md new file mode 100644 index 0000000000..6277f8dbef --- /dev/null +++ b/content/en/kanvas/tutorials/azure/deploy-azure-storage-account-with-meshery.md @@ -0,0 +1,141 @@ +--- +title: Deploy Azure Storage Account with Meshery +description: Learn how to deploy and manage Azure Storage account through Kubernetes with Meshery, utilizing ASO operator to enhance cloud resource management +model: azure +params: + kind: StorageAccount +categories: [tutorials] +aliases: +- /kanvas/tutorials/deploy-azure-storage-account-with-meshery +--- + +### Introduction + +Meshery enables you to manage Azure Storage Accounts declaratively through Kubernetes by leveraging the Azure Service Operator (ASO). In this tutorial, you'll install the ASO operator (without CRD pattern configurations, which Meshery will manage), create a Service Principal and a Kubernetes secret with your Azure credentials, and use Meshery's UI to visually design and deploy a Storage Account resource to your Azure subscription. + + +### Prerequisites + +Before you begin, ensure you have the following: + +1. **Meshery Installed** + A self-hosted Meshery instance running on your Kubernetes cluster (in-cluster or out-of-cluster). +2. **Kubernetes Cluster** + A running Kubernetes cluster (v1.16+) with `kubectl` configured. +3. **Azure Subscription** + An active Azure subscription where Storage Accounts will be provisioned. +4. **Azure CLI** + Installed and authenticated (`az login`) in your local shell. +5. **cert-manager** + Installed in your Kubernetes cluster (required by Azure Service Operator). + + +### Table of Contents + +1. [Create Azure Service Principal](#1-create-azure-service-principal) +2. [Connect Meshery to Your Cluster](#2-connect-meshery-to-your-cluster) +3. [Install Azure Service Operator (Operator Only)](#3-install-azure-service-operator-operator-only) + + * 3.1 [Deploy ASO Operator](#31-deploy-aso-operator) + * 3.2 [Create Azure Credentials Secret](#32-create-azure-credentials-secret) +4. [Design and Deploy an Azure Storage Account](#4-design-and-deploy-an-azure-storage-account) +5. [Verify Deployment](#5-verify-deployment) +6. [Conclusion](#6-conclusion) + +### 1. Create Azure Service Principal + +If you do not already have a Service Principal (SP) for Meshery, create one using the Azure CLI: + +
+az ad sp create-for-rbac -n azure-service-operator --role contributor --scopes /subscriptions/<AZURE_SUBSCRIPTION_ID> + +
+ +This command outputs the following credentials: + +* `appId`: Application ID (Client ID) +* `displayName`: Service Principal Name +* `name`: Azure Service Principal URL +* `password`: Client Secret +* `tenant`: Tenant ID + +To export them, manually enter: + +
+export AZURE_CLIENT_ID=<appId> +export AZURE_CLIENT_SECRET=<password> +export AZURE_TENANT_ID=<tenant> +export AZURE_SUBSCRIPTION_ID=<subscriptionId> + +
+ + +### 2. Connect Meshery to Your Cluster + +If you haven’t already connected your cluster to Meshery, run: + +
+mesheryctl system start + +
+ + +Then open the Meshery UI (default: [`http://localhost:9081`](http://localhost:9081)) and ensure your cluster appears under **Lifecycle → Connections**. + + + +### 3. Install Azure Service Operator (Operator Only) + +#### 3.1 Deploy ASO Operator + +Apply the official ASO operator manifest (Meshery will manage CRDs): + +
+kubectl apply -f https://github.com/Azure/azure-service-operator/releases/download/v2.13.0/azureserviceoperator_v2.13.0.yaml + +
+ +#### 3.2 Create Azure Credentials Secret + +Azure Service Operator requires a Kubernetes secret with your Azure identity: + +
+kubectl create secret generic azure-credentials --namespace azureserviceoperator-system --from-literal=AZURE_CLIENT_ID=$AZURE_CLIENT_ID --from-literal=AZURE_CLIENT_SECRET=$AZURE_CLIENT_SECRET --from-literal=AZURE_TENANT_ID=$AZURE_TENANT_ID --from-literal=AZURE_SUBSCRIPTION_ID=$AZURE_SUBSCRIPTION_ID + +
+ + +### 4. Design and Deploy an Azure Storage Account + +1. In the Meshery UI, navigate to **Kanvas**. +2. Click **Catalog**, filter by **Azure**, and select the **StorageAccount** design. +3. Click **Clone** to add it to your canvas. +4. Configure the following properties: + + * `resourceGroupName` + * `location` (e.g., `eastus`) + * `accountName` + * `accessTier` (`Hot` or `Cool`) +5. Click **Actions → Deploy**. + + + +### 5. Verify Deployment + +* **Azure Portal**: Confirm the new Storage Account appears in your specified resource group. + + + +### 6. Conclusion + +You have successfully: + +* Created an Azure Service Principal for Meshery +* Connected your Kubernetes cluster to Meshery +* Installed the Azure Service Operator (Meshery managed CRDs) +* Created a Kubernetes secret for Azure credentials +* Designed and deployed an Azure Storage Account using Meshery’s Kanvas + +--- + +If you want to learn more about Azure Service Operator, visit the [official ASO documentation](https://azure.github.io/azure-service-operator/). diff --git a/content/en/kanvas/tutorials/images/app-deploy.png b/content/en/kanvas/tutorials/images/app-deploy.png new file mode 100644 index 0000000000..25c515e1b2 Binary files /dev/null and b/content/en/kanvas/tutorials/images/app-deploy.png differ diff --git a/content/en/kanvas/tutorials/images/aws-controllers/aws-connection.png b/content/en/kanvas/tutorials/images/aws-controllers/aws-connection.png new file mode 100644 index 0000000000..5168f5ea98 Binary files /dev/null and b/content/en/kanvas/tutorials/images/aws-controllers/aws-connection.png differ diff --git a/content/en/kanvas/tutorials/images/aws-controllers/configure-secret.png b/content/en/kanvas/tutorials/images/aws-controllers/configure-secret.png new file mode 100644 index 0000000000..c7ee3c95a6 Binary files /dev/null and b/content/en/kanvas/tutorials/images/aws-controllers/configure-secret.png differ diff --git a/content/en/kanvas/tutorials/images/aws-controllers/configure.png b/content/en/kanvas/tutorials/images/aws-controllers/configure.png new file mode 100644 index 0000000000..7532dc3671 Binary files /dev/null and b/content/en/kanvas/tutorials/images/aws-controllers/configure.png differ diff --git a/content/en/kanvas/tutorials/images/aws-controllers/controller-chart.png b/content/en/kanvas/tutorials/images/aws-controllers/controller-chart.png new file mode 100644 index 0000000000..77a8b097ee Binary files /dev/null and b/content/en/kanvas/tutorials/images/aws-controllers/controller-chart.png differ diff --git a/content/en/kanvas/tutorials/images/aws-controllers/controller-operator-mode.png b/content/en/kanvas/tutorials/images/aws-controllers/controller-operator-mode.png new file mode 100644 index 0000000000..dcfe6d51ae Binary files /dev/null and b/content/en/kanvas/tutorials/images/aws-controllers/controller-operator-mode.png differ diff --git a/content/en/kanvas/tutorials/images/click-deploy.png b/content/en/kanvas/tutorials/images/click-deploy.png new file mode 100644 index 0000000000..c54f043bb0 Binary files /dev/null and b/content/en/kanvas/tutorials/images/click-deploy.png differ diff --git a/content/en/kanvas/tutorials/images/click-import.png b/content/en/kanvas/tutorials/images/click-import.png new file mode 100644 index 0000000000..121f200f8a Binary files /dev/null and b/content/en/kanvas/tutorials/images/click-import.png differ diff --git a/content/en/kanvas/tutorials/images/configuration-menu-design-import.png b/content/en/kanvas/tutorials/images/configuration-menu-design-import.png new file mode 100644 index 0000000000..f4b1562797 Binary files /dev/null and b/content/en/kanvas/tutorials/images/configuration-menu-design-import.png differ diff --git a/content/en/kanvas/tutorials/images/delete.png b/content/en/kanvas/tutorials/images/delete.png new file mode 100644 index 0000000000..78d4218785 Binary files /dev/null and b/content/en/kanvas/tutorials/images/delete.png differ diff --git a/content/en/kanvas/tutorials/images/deploy-app.png b/content/en/kanvas/tutorials/images/deploy-app.png new file mode 100644 index 0000000000..627b524a3b Binary files /dev/null and b/content/en/kanvas/tutorials/images/deploy-app.png differ diff --git a/content/en/kanvas/tutorials/images/deploy-success.png b/content/en/kanvas/tutorials/images/deploy-success.png new file mode 100644 index 0000000000..83d0b4da04 Binary files /dev/null and b/content/en/kanvas/tutorials/images/deploy-success.png differ diff --git a/content/en/kanvas/tutorials/images/deploy.png b/content/en/kanvas/tutorials/images/deploy.png new file mode 100644 index 0000000000..19864a7b40 Binary files /dev/null and b/content/en/kanvas/tutorials/images/deploy.png differ diff --git a/content/en/kanvas/tutorials/images/design-auto-save.png b/content/en/kanvas/tutorials/images/design-auto-save.png new file mode 100644 index 0000000000..dad2532cc0 Binary files /dev/null and b/content/en/kanvas/tutorials/images/design-auto-save.png differ diff --git a/content/en/kanvas/tutorials/images/design-cronjob.png b/content/en/kanvas/tutorials/images/design-cronjob.png new file mode 100644 index 0000000000..418f0380ed Binary files /dev/null and b/content/en/kanvas/tutorials/images/design-cronjob.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/add-custom-html.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/add-custom-html.png new file mode 100644 index 0000000000..6fc987f8cb Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/add-custom-html.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/copy-url.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/copy-url.png new file mode 100644 index 0000000000..4465fb6e12 Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/copy-url.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embedded-design-preview.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embedded-design-preview.png new file mode 100644 index 0000000000..57ea904316 Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embedded-design-preview.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embeddesign-HTML.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embeddesign-HTML.png new file mode 100644 index 0000000000..93ec48f6e2 Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embeddesign-HTML.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embeddesign.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embeddesign.png new file mode 100644 index 0000000000..2d23daaaa5 Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/embeddesign.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/expand-designs-kanvas.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/expand-designs-kanvas.png new file mode 100644 index 0000000000..63053f5ebd Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/expand-designs-kanvas.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/meshery-design-custom-html.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/meshery-design-custom-html.png new file mode 100644 index 0000000000..674b422899 Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/meshery-design-custom-html.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/quickaction-exportdesign.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/quickaction-exportdesign.png new file mode 100644 index 0000000000..367f33590d Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/quickaction-exportdesign.png differ diff --git a/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/upload-js-wordpress.png b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/upload-js-wordpress.png new file mode 100644 index 0000000000..f45d3126df Binary files /dev/null and b/content/en/kanvas/tutorials/images/embedding-design-in-wordpress/upload-js-wordpress.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-13.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-13.png new file mode 100644 index 0000000000..7533f4d2b7 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-13.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-18.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-18.png new file mode 100644 index 0000000000..970827c5cb Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-18.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-42.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-42.png new file mode 100644 index 0000000000..597fc3d425 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-42.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-56.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-56.png new file mode 100644 index 0000000000..63a93bf106 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-56.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-57.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-57.png new file mode 100644 index 0000000000..33b9dcabdb Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-57.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-00.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-00.png new file mode 100644 index 0000000000..ece33875f0 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-00.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-19.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-19.png new file mode 100644 index 0000000000..3510a2b591 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-19.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-25.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-25.png new file mode 100644 index 0000000000..057b94230c Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-25.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-27.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-27.png new file mode 100644 index 0000000000..7ae0a8fa60 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-27.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-29.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-29.png new file mode 100644 index 0000000000..a62396b541 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-29.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-03.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-03.png new file mode 100644 index 0000000000..abed6e82df Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-03.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-19.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-19.png new file mode 100644 index 0000000000..f4655fe70c Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-19.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-25.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-25.png new file mode 100644 index 0000000000..9a08d2721d Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-25.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-26.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-26.png new file mode 100644 index 0000000000..2aa43e649e Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-26.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-17_20-01.png b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-17_20-01.png new file mode 100644 index 0000000000..f0ba2b0c9c Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-17_20-01.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_16-59.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_16-59.png new file mode 100644 index 0000000000..89a5440a48 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_16-59.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-03.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-03.png new file mode 100644 index 0000000000..9268845d3b Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-03.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-16.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-16.png new file mode 100644 index 0000000000..18131bc659 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-16.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-20.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-20.png new file mode 100644 index 0000000000..48b8130be8 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-20.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-51.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-51.png new file mode 100644 index 0000000000..04df81f35e Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-51.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-55.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-55.png new file mode 100644 index 0000000000..5e0f4f8d29 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-55.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-00.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-00.png new file mode 100644 index 0000000000..957cb46e79 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-00.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-03.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-03.png new file mode 100644 index 0000000000..a2584e54a2 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-03.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-08.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-08.png new file mode 100644 index 0000000000..58fbe46e6a Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-08.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-09.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-09.png new file mode 100644 index 0000000000..d2b64cacc7 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-09.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-21.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-21.png new file mode 100644 index 0000000000..f8aec9c047 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-21.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-23.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-23.png new file mode 100644 index 0000000000..d9641e41ff Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-23.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-26.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-26.png new file mode 100644 index 0000000000..5f5fab8a8f Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-26.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-27.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-27.png new file mode 100644 index 0000000000..ca103e4b8a Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-27.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-32.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-32.png new file mode 100644 index 0000000000..3ff1e85a19 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-32.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_22-20.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_22-20.png new file mode 100644 index 0000000000..fe90508bf5 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_22-20.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_22-22.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_22-22.png new file mode 100644 index 0000000000..8c475d279d Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_22-22.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-28_15-03.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-28_15-03.png new file mode 100644 index 0000000000..27bb14eb11 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-28_15-03.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-28_15-10.png b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-28_15-10.png new file mode 100644 index 0000000000..128b8d6f55 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-deployments/2025-02-28_15-10.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-20.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-20.png new file mode 100644 index 0000000000..d2c1e8b6f4 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-20.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-32.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-32.png new file mode 100644 index 0000000000..1d8f5dfe37 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-32.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-35.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-35.png new file mode 100644 index 0000000000..a2275fcdfb Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-35.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-54.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-54.png new file mode 100644 index 0000000000..a924a078a3 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-54.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-54_1.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-54_1.png new file mode 100644 index 0000000000..fee9438ccd Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-54_1.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-57.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-57.png new file mode 100644 index 0000000000..7ab0c941e9 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-57.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-52.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-52.png new file mode 100644 index 0000000000..51abb0a723 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-52.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-54.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-54.png new file mode 100644 index 0000000000..feb3d6803d Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-54.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-56.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-56.png new file mode 100644 index 0000000000..7a681c60d5 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-56.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_17-38.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_17-38.png new file mode 100644 index 0000000000..c450bd819a Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_17-38.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-18.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-18.png new file mode 100644 index 0000000000..dfb265856b Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-18.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-22.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-22.png new file mode 100644 index 0000000000..37e930b430 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-22.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-25.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-25.png new file mode 100644 index 0000000000..34cdb0c5dd Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-25.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-05.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-05.png new file mode 100644 index 0000000000..b2e5c1edfa Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-05.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-10.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-10.png new file mode 100644 index 0000000000..b8eb2be5d3 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-10.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-11.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-11.png new file mode 100644 index 0000000000..b50e80df33 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-11.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-33.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-33.png new file mode 100644 index 0000000000..3c5a3da391 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-33.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-35.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-35.png new file mode 100644 index 0000000000..8bd5be9b45 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-35.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-37.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-37.png new file mode 100644 index 0000000000..8a49f061f2 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-37.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-45.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-45.png new file mode 100644 index 0000000000..1871a90d66 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-45.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-48.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-48.png new file mode 100644 index 0000000000..a2882ca4dc Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-48.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-53.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-53.png new file mode 100644 index 0000000000..ca582491bf Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-53.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-29_20-37.png b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-29_20-37.png new file mode 100644 index 0000000000..7c5b94b9f8 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-pods/2024-02-29_20-37.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-request-flow/k8s-request-flow.png b/content/en/kanvas/tutorials/images/kubernetes-request-flow/k8s-request-flow.png new file mode 100644 index 0000000000..e7044e16b9 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-request-flow/k8s-request-flow.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_01.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_01.png new file mode 100644 index 0000000000..6594a5bbeb Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_01.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_02.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_02.png new file mode 100644 index 0000000000..04ef4d19a3 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_02.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_03.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_03.png new file mode 100644 index 0000000000..df7c99ceab Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_03.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_04.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_04.png new file mode 100644 index 0000000000..340eb56735 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_04.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_05.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_05.png new file mode 100644 index 0000000000..830dc000e5 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_05.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_06.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_06.png new file mode 100644 index 0000000000..ec6feeb2fd Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_06.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_07.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_07.png new file mode 100644 index 0000000000..a6bc699a64 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_07.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_08.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_08.png new file mode 100644 index 0000000000..b779375d7b Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-04_08.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-05_11.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-05_11.png new file mode 100644 index 0000000000..3c71dc6d64 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-05_11.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-05_12.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-05_12.png new file mode 100644 index 0000000000..0d85675b2a Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-05_12.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_13.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_13.png new file mode 100644 index 0000000000..18e12b9510 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_13.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_14.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_14.png new file mode 100644 index 0000000000..e2a5a20455 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_14.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_15.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_15.png new file mode 100644 index 0000000000..c6d82c3236 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_15.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_17.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_17.png new file mode 100644 index 0000000000..dc4dae17da Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_17.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_18.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_18.png new file mode 100644 index 0000000000..0995a0eafb Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-09-06_18.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_1.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_1.png new file mode 100644 index 0000000000..fab878fbad Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_1.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_2.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_2.png new file mode 100644 index 0000000000..b5d2838174 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_2.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_3.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_3.png new file mode 100644 index 0000000000..22d0eb186f Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_3.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_4.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_4.png new file mode 100644 index 0000000000..bb6387e3af Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_4.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_5.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_5.png new file mode 100644 index 0000000000..f7457e2da5 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_5.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_6.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_6.png new file mode 100644 index 0000000000..7d0d7a2d11 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_6.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_7.png b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_7.png new file mode 100644 index 0000000000..43b90280bc Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/2025-12-13_7.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/edit-01.png b/content/en/kanvas/tutorials/images/kubernetes-services/edit-01.png new file mode 100644 index 0000000000..d5e4312ed3 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/edit-01.png differ diff --git a/content/en/kanvas/tutorials/images/kubernetes-services/metadata.png b/content/en/kanvas/tutorials/images/kubernetes-services/metadata.png new file mode 100644 index 0000000000..468fdb22b6 Binary files /dev/null and b/content/en/kanvas/tutorials/images/kubernetes-services/metadata.png differ diff --git a/content/en/kanvas/tutorials/images/navigate-kanvas.png b/content/en/kanvas/tutorials/images/navigate-kanvas.png new file mode 100644 index 0000000000..83f9da2937 Binary files /dev/null and b/content/en/kanvas/tutorials/images/navigate-kanvas.png differ diff --git a/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_1.png b/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_1.png new file mode 100644 index 0000000000..accd8faa80 Binary files /dev/null and b/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_1.png differ diff --git a/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_2.png b/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_2.png new file mode 100644 index 0000000000..274df675f3 Binary files /dev/null and b/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_2.png differ diff --git a/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_3.png b/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_3.png new file mode 100644 index 0000000000..aaa1660f00 Binary files /dev/null and b/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_3.png differ diff --git a/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_4.png b/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_4.png new file mode 100644 index 0000000000..579a7f9220 Binary files /dev/null and b/content/en/kanvas/tutorials/images/publish-to-artifacthub/2024-07-30_4.png differ diff --git a/content/en/kanvas/tutorials/images/publish-to-artifacthub/add_repo.png b/content/en/kanvas/tutorials/images/publish-to-artifacthub/add_repo.png new file mode 100644 index 0000000000..c95c385c05 Binary files /dev/null and b/content/en/kanvas/tutorials/images/publish-to-artifacthub/add_repo.png differ diff --git a/content/en/kanvas/tutorials/images/publish-to-artifacthub/artifacthub_control_panel.png b/content/en/kanvas/tutorials/images/publish-to-artifacthub/artifacthub_control_panel.png new file mode 100644 index 0000000000..2b00a2bdca Binary files /dev/null and b/content/en/kanvas/tutorials/images/publish-to-artifacthub/artifacthub_control_panel.png differ diff --git a/content/en/kanvas/tutorials/images/publish-to-artifacthub/kind_design_repo.png b/content/en/kanvas/tutorials/images/publish-to-artifacthub/kind_design_repo.png new file mode 100644 index 0000000000..45e2d72336 Binary files /dev/null and b/content/en/kanvas/tutorials/images/publish-to-artifacthub/kind_design_repo.png differ diff --git a/content/en/kanvas/tutorials/images/save-app.png b/content/en/kanvas/tutorials/images/save-app.png new file mode 100644 index 0000000000..1ff90dd85c Binary files /dev/null and b/content/en/kanvas/tutorials/images/save-app.png differ diff --git a/content/en/kanvas/tutorials/images/save.png b/content/en/kanvas/tutorials/images/save.png new file mode 100644 index 0000000000..271eecc144 Binary files /dev/null and b/content/en/kanvas/tutorials/images/save.png differ diff --git a/content/en/kanvas/tutorials/images/scale.png b/content/en/kanvas/tutorials/images/scale.png new file mode 100644 index 0000000000..b0e52e1e99 Binary files /dev/null and b/content/en/kanvas/tutorials/images/scale.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/app-canvas.png b/content/en/kanvas/tutorials/images/screenshots/app-canvas.png new file mode 100644 index 0000000000..058d58868c Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/app-canvas.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-1.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-1.png new file mode 100644 index 0000000000..29d63f0ecc Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-1.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-2.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-2.png new file mode 100644 index 0000000000..d24be44b86 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-2.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-3.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-3.png new file mode 100644 index 0000000000..d7c354f37c Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-3.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-4.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-4.png new file mode 100644 index 0000000000..f890346823 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-4.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-5.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-5.png new file mode 100644 index 0000000000..2ccd077e6d Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-5.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-6.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-6.png new file mode 100644 index 0000000000..d8cdbc24af Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-6.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-7.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-7.png new file mode 100644 index 0000000000..58013387f7 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-7.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-8.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-8.png new file mode 100644 index 0000000000..1e3d289f48 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-8.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/cassandra-9.png b/content/en/kanvas/tutorials/images/screenshots/cassandra-9.png new file mode 100644 index 0000000000..50e420d69c Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/cassandra-9.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/operate-layers-expand.png b/content/en/kanvas/tutorials/images/screenshots/operate-layers-expand.png new file mode 100644 index 0000000000..03d3b6cbc1 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/operate-layers-expand.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/operate-layers.png b/content/en/kanvas/tutorials/images/screenshots/operate-layers.png new file mode 100644 index 0000000000..6845066963 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/operate-layers.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/operate-logs-menu.png b/content/en/kanvas/tutorials/images/screenshots/operate-logs-menu.png new file mode 100644 index 0000000000..b3830a0db0 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/operate-logs-menu.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/operate-logs.png b/content/en/kanvas/tutorials/images/screenshots/operate-logs.png new file mode 100644 index 0000000000..09a31fa2d1 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/operate-logs.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/operate.png b/content/en/kanvas/tutorials/images/screenshots/operate.png new file mode 100644 index 0000000000..057215e416 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/operate.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/redis-leader-deployment.png b/content/en/kanvas/tutorials/images/screenshots/redis-leader-deployment.png new file mode 100644 index 0000000000..29f23efec8 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/redis-leader-deployment.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-deploy.png b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-deploy.png new file mode 100644 index 0000000000..4d1cbbaaf8 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-deploy.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-deployment.png b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-deployment.png new file mode 100644 index 0000000000..be41f150a5 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-deployment.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-dryrun.png b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-dryrun.png new file mode 100644 index 0000000000..5a3e579494 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-dryrun.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-finalize.png b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-finalize.png new file mode 100644 index 0000000000..bd0da6ffee Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-finalize.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-identify.png b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-identify.png new file mode 100644 index 0000000000..cb8f0a4a56 Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-identify.png differ diff --git a/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-validate.png b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-validate.png new file mode 100644 index 0000000000..5491d928ed Binary files /dev/null and b/content/en/kanvas/tutorials/images/screenshots/redis-php-guestbook-validate.png differ diff --git a/content/en/kanvas/tutorials/images/select-cronjob.png b/content/en/kanvas/tutorials/images/select-cronjob.png new file mode 100644 index 0000000000..04525a5647 Binary files /dev/null and b/content/en/kanvas/tutorials/images/select-cronjob.png differ diff --git a/content/en/kanvas/tutorials/images/tool-bar.png b/content/en/kanvas/tutorials/images/tool-bar.png new file mode 100644 index 0000000000..f0ab3704fb Binary files /dev/null and b/content/en/kanvas/tutorials/images/tool-bar.png differ diff --git a/content/en/kanvas/tutorials/images/toolbar-cronjob.png b/content/en/kanvas/tutorials/images/toolbar-cronjob.png new file mode 100644 index 0000000000..c5fbbc2aad Binary files /dev/null and b/content/en/kanvas/tutorials/images/toolbar-cronjob.png differ diff --git a/content/en/kanvas/tutorials/images/view.png b/content/en/kanvas/tutorials/images/view.png new file mode 100644 index 0000000000..a103230d9f Binary files /dev/null and b/content/en/kanvas/tutorials/images/view.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp1.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp1.png new file mode 100644 index 0000000000..5c7e72a918 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp1.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp10.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp10.png new file mode 100644 index 0000000000..014e970973 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp10.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp11.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp11.png new file mode 100644 index 0000000000..6f95af0279 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp11.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp12.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp12.png new file mode 100644 index 0000000000..818b604b90 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp12.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp13.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp13.png new file mode 100644 index 0000000000..196f096374 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp13.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp14.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp14.png new file mode 100644 index 0000000000..e5e0b3aa02 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp14.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp15.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp15.png new file mode 100644 index 0000000000..e7c84c1a03 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp15.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp16.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp16.png new file mode 100644 index 0000000000..ab52709370 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp16.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp17.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp17.png new file mode 100644 index 0000000000..d458e0b368 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp17.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp18.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp18.png new file mode 100644 index 0000000000..884730bb76 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp18.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp19.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp19.png new file mode 100644 index 0000000000..b524a68453 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp19.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp2.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp2.png new file mode 100644 index 0000000000..00b4d95f67 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp2.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp20.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp20.png new file mode 100644 index 0000000000..b21b9f0d37 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp20.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp21.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp21.png new file mode 100644 index 0000000000..29baf884e5 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp21.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp22.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp22.png new file mode 100644 index 0000000000..4fd801c215 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp22.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp23.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp23.png new file mode 100644 index 0000000000..3d5ab1c5cb Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp23.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp3.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp3.png new file mode 100644 index 0000000000..fe5b1b2b72 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp3.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp4.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp4.png new file mode 100644 index 0000000000..4cffd3454d Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp4.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp5.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp5.png new file mode 100644 index 0000000000..ac84840697 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp5.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp6.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp6.png new file mode 100644 index 0000000000..df785b83a9 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp6.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp7.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp7.png new file mode 100644 index 0000000000..f2585d3764 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp7.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp8.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp8.png new file mode 100644 index 0000000000..9ccca20c25 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp8.png differ diff --git a/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp9.png b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp9.png new file mode 100644 index 0000000000..e9db705062 Binary files /dev/null and b/content/en/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp9.png differ diff --git a/content/en/kanvas/tutorials/kubernetes/_index.md b/content/en/kanvas/tutorials/kubernetes/_index.md new file mode 100644 index 0000000000..933a0fa614 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/_index.md @@ -0,0 +1,3 @@ +--- +title: Kubernetes +--- \ No newline at end of file diff --git a/content/en/kanvas/tutorials/kubernetes/deploy-apache-cassandra-with-statefulset.md b/content/en/kanvas/tutorials/kubernetes/deploy-apache-cassandra-with-statefulset.md new file mode 100644 index 0000000000..c8c4d86796 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/deploy-apache-cassandra-with-statefulset.md @@ -0,0 +1,126 @@ +--- +title: Deploying Apache Cassandra with a StatefulSet in Meshery Playground +model: kubernetes +params: + kind: deployments +categories: [tutorials] +description: Deploy Apache Cassandra with a StatefulSet using Meshery Playground in an interactive live cluster environment. +aliases: +- /kanvas/tutorials/deploy-apache-cassandra-with-statefulset +--- + +### Introduction + +In this tutorial, we will learn how to deploy a **Apache Cassandra with a StatefulSet** using Meshery Playground. Meshery Playground is an interactive and collaborative live cluster environment that simplifies the deployment process and enhances user experience by providing visual tools for managing Kubernetes resources. + +> **NOTE:** If this is your first time working with Meshery Playground, consider starting with the [Exploring Kubernetes Pods with Meshery Playground](/kanvas/tutorials/kubernetes-pods) tutorial first. + +### Prerequisites + +- Basic understanding of Kubernetes concepts. +- Access to the _Meshery Playground_. If you don't have an account, sign up at [Meshery Playground](https://play.meshery.io/). + +### Lab Scenario + +- Import the Apache Service and Apache StatefulSet manifest files into Meshery Playground. + +- Create a Cassandra ring using the visual tools provided by Meshery. + +- Deploy these resources on the playground. + +In this lab, you will import the Service and StatefulSet manifest files into Meshery Playground. You will visualize these Kubernetes resources and Cassandra Ring using the visual tools provided by Meshery. Finally, you will deploy these resources on the Playground. + +### Objective + +Learn how to import manifest files, visualize Kubernetes resources, create new resource components, and deploy the application using Meshery Playground. + +### Steps + +#### Download the Kubernetes Configuration Files + +Go ahead and download these yaml files [cassandra-service.yaml](https://kubernetes.io/examples/application/cassandra/cassandra-service.yaml) and [cassandra-statefulset.yaml](https://kubernetes.io/examples/application/cassandra/cassandra-statefulset.yaml) + +These YAML files contain the Cassandra Service and Cassandra StatefulSet manifests + +#### Access Meshery Playground + +1. Log in to the [Meshery Playground](https://play.meshery.io/) using your credentials. On successful login, you should be at the dashboard. Press the **X** on the _Where do you want to start?_ popup to close it (if required). + +2. Click **Explore** in the Cloud Native Playground tile to navigate to _MeshMap_ + +#### Import the Files to Meshery Playground + +1. In the left sidebar, click on the upward arrow symbol(import icon) to import the designs into Meshery. + +2. In the modal that appears: + - Enter a name for your design in the "Design File Name" field (e.g.`cassandra-service`). + + - Select `Kubernetes Manifest` from the "Design Type" dropdown menu. + + ![Import modal](/kanvas/tutorials/images/screenshots/cassandra-1.png) + + - Choose `File Upload` for the upload method, and select the file you just downloaded. + + - Then, click on `Import` + + ![Import cassandra-service](/kanvas/tutorials/images/screenshots/cassandra-2.png) + +3. Under the "Designs" tab, you will see that we have successfully imported the `cassandra-service` design. + + When you click on the names of the designs on the `Designs` tab, you can see the visual representations of the various Kubernetes resources and their relationships on the canvas. + + ![Imported designs on canvas](/kanvas/tutorials/images/screenshots/cassandra-3.png) + +4. Now, follow the same steps to import the `cassandra-statefulset` file. + + ![cassandra-statefulset](/kanvas/tutorials/images/screenshots/cassandra-4.png) + +#### Merging the Designs + +Next, we will combine the Service and StatefulSet designs into a single design file. By merging these designs, we can manage and deploy both resources together. + +To merge the Service deployment design with the StatefulSet deployment design: + +1. Click and drag the `cassandra-service` design from the left panel and drop it onto the design canvas of the `cassandra-statefulset`. + + ![drag and drop design](/kanvas/tutorials/images/screenshots/cassandra-5.png) + +2. This action will open a merge modal asking if you want to merge the design, Click on `Merge`. + + ![merge modal](/kanvas/tutorials/images/screenshots/cassandra-6.png) + +3. Click on `Save As` and enter `cassandra-service-statefulset` as the new file name. + + ![save design](/kanvas/tutorials/images/screenshots/cassandra-7.png) + +#### Visualizing the Deployed Resources + +To view the resources deployed we will use the Visualize section of the _MeshMap_. In this section, you can apply filters to display the specific resources you want to see. + +1. Move to the Visualize tab. +2. Click the filter icon and choose the appropriate filters + + - For "Kinds" select `StatefulSet`, `Service` and `StorageClass` + - For the "label" select `dev=tutorial` + +3. You can also use the icons on the right sidebar to filter the resources. + + After selecting your filters, you should see a view displaying only your relevant resources, as shown in the image below. + + ![Filter resources](/kanvas/tutorials/images/screenshots/cassandra-8.png) + +#### Resource Details + +You can click on any resource to view more details about it in the "Details" section on the right sidebar. + +**Deployment** + +![Get more details about deployment](/kanvas/tutorials/images/screenshots/cassandra-9.png) + +#### Deleting Resources + +To delete the resources, use the `Undeploy` option from the Action dropdown in the _Design_ tab. + +#### Conclusion + +Congratulations! You’ve successfully completed the tutorial on deploying Apache Cassandra on Kubernetes using StatefulSets in Meshery Playground. This hands-on experience should have given you valuable insights into managing Cassandra instances with persistent storage, automatic discovery, and seamless scalability. You also explored how Kubernetes' StatefulSet feature ensures robust application state management and high availability in Meshery Playground. \ No newline at end of file diff --git a/content/en/kanvas/tutorials/kubernetes/deploy-php-redis.md b/content/en/kanvas/tutorials/kubernetes/deploy-php-redis.md new file mode 100644 index 0000000000..310d2973f6 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/deploy-php-redis.md @@ -0,0 +1,133 @@ +--- +title: Deploying PHP Guestbook application with Redis in Meshery +model: kubernetes +params: + kind: deployments +categories: [tutorials] +description: In this tutorial, we will deploy guest book built with PHP and Redis in Kubernetes. We will make use of Meshery Playground in an interactive live cluster environment. +aliases: +- /kanvas/tutorials/deploy-php-redis +--- + +### Introduction + +In this tutorial, we will learn how to deploy a **PHP Guestbook application with Redis** using Meshery Playground. Meshery Playground is an interactive and collaborative live cluster environment that simplifies the deployment process and enhances user experience by providing visual tools for managing Kubernetes resources. + +> **NOTE:** If this is your first time working with Meshery Playground, consider starting with the [Exploring Kubernetes Pods with Meshery Playground](/kanvas/tutorials/kubernetes-pods) tutorial first. + +### Prerequisites +- Basic understanding of Kubernetes concepts. +- Meshery Playground access. If you don't have an account, sign up at [Meshery Playground](https://play.meshery.io). + +### Lab Scenario +- Import the PHP and Redis manifest files into Meshery Playground. +- Deploy these resources on the playground. + - Start up a Redis leader. + - Start up two Redis followers. + - Start up the guestbook frontend. +- Expose and view the Frontend Service. + + +### Objective +Learn how to import manifest files, visualize Kubernetes resources, create new resource components, and deploy the application using Meshery Playground. + + +### Steps + +#### Download the Kubernetes Configuration Files + +To get started we will need some yaml files that will contain the configurations for the pods and services that will run on Meshery. You can download them to see what the look like. +1. [redis-leader-deployment.yaml](https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml) +2. [redis-leader-service.yaml](https://k8s.io/examples/application/guestbook/redis-leader-service.yaml) +3. [redis-follower-deployment.yaml](https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml) +4. [redis-follower-service.yaml](https://k8s.io/examples/application/guestbook/redis-follower-service.yaml) +5. [frontend-deployment.yaml](https://k8s.io/examples/application/guestbook/frontend-deployment.yaml) +6. [frontend-service.yaml](https://k8s.io/examples/application/guestbook/frontend-service.yaml) + +These YAML files contain the Service definitions and Deployment configurations for the PHP app with Redis. + +#### Accessing Meshery Playground + +1. Log in to the [Meshery Playground](https://play.meshery.io) using your credentials. On successful login, you should be at the dashboard. Press the **X** on the _Where do you want to start?_ popup to close it (if required). + +2. Click **Explore** in the Cloud Native Playground tile to navigate to _MeshMap_ + + +#### Import the Files to Meshery Playground + +1. In the left sidebar, click on the upward arrow symbol(import icon) to import the designs into Meshery. + +2. On doing so, a modal appears.In the modal that appears, enter a name for your design in the "Design File Name" field (e.g.`redis-leader-deployment`). + +3. Now select `Kubernetes Manifest` from the "Design Type" dropdown menu. + +4. Then choose `URL Import` for the upload method. + +5. Now input the URL. + +6. Then, click on `Import` + +![Import redis-leader-deployment](/kanvas/tutorials/images/screenshots/redis-leader-deployment.png) + + +Now, follow the same steps (1-6) to import the rest of the files. + +Under the “Designs” tab, you will see that we have successfully imported the manifest as designs, then you can drag and drop them in the canvas. This will "Merge" all the designs since it's all just one application + +![merging all designs](/kanvas/tutorials/images/screenshots/app-canvas.png) + +#### 4. **Deploy the files:** + +1. Click Actions in the top right corner and click on Deploy. +![Import redis-php-guestbook-deploy](/kanvas/tutorials/images/screenshots/redis-php-guestbook-deploy.png) + +1. The design will be validated to make sure there are no errors. +![Import redis-php-guestbook-validate](/kanvas/tutorials/images/screenshots/redis-php-guestbook-validate.png) +1. Choose the Kubernetes cluster you want to deploy to. +![Import redis-php-guestbook-identify](/kanvas/tutorials/images/screenshots/redis-php-guestbook-identify.png) +1. A Dry-Run will be triggered. +![Import redis-php-guestbook-dryrun](/kanvas/tutorials/images/screenshots/redis-php-guestbook-dryrun.png) +1. Finally your deployment and click Deploy to deploy the application to the cluster. +![Import redis-php-guestbook-finalize](/kanvas/tutorials/images/screenshots/redis-php-guestbook-finalize.png) +1. On successful deployment you will see the following modal asking you to open you deployment in visualizer +![Import redis-php-guestbook-finalize](/kanvas/tutorials/images/screenshots/redis-php-guestbook-deployment.png) + + +#### 5. **Updating the Deployments:** + +```bash +kubectl set image deployment/ =new-image:tag +``` + + +#### 6. Open the files in Operate + +1. Once deployment is successful user can click on Open in Operate, or click on notification on top right click on the deployment successful notification and click on Open in Operate, or directly click on the Operate tab beside Design on the design and visualize the design inside operate mode. +![Operate](/kanvas/tutorials/images/screenshots/operate.png) + +2. Click on the Layers option below to view all available filters. +![Operate layers](/kanvas/tutorials/images/screenshots/operate-layers.png) +Now you can utilize this filter to visualize your design. +![Operate layers expanded](/kanvas/tutorials/images/screenshots/operate-layers-expand.png) + +3. After selecting your filters, you should see a view displaying only your relevant resources. + + +#### 7. Using built-in terminal for logs + +1. Right click on a pod, to open the circular-content menu. +![Operate logs menu](/kanvas/tutorials/images/screenshots/operate-logs-menu.png) + +2. Select the logs option from circular-context menu, this will start the session for logs + +3. Now you can use the in built terminal to view logs +![Operate logs ](/kanvas/tutorials/images/screenshots/operate-logs.png) + + +#### 8. Deleting the resources + +To delete the resources, use the **Undeploy** option from the _Design_ view. + + +### Conclusion +Congratulations! You've successfully completed the lab on exploring Kubernetes Deployments using Meshery Playground. This hands-on experience has equipped you with practical knowledge on deploying, updating, and monitoring applications in a Kubernetes environment. Continue exploring more scenarios in the Meshery Playground to enhance your skills in container orchestration. \ No newline at end of file diff --git a/content/en/kanvas/tutorials/kubernetes/exploring-kubernetes-cronjobs.md b/content/en/kanvas/tutorials/kubernetes/exploring-kubernetes-cronjobs.md new file mode 100644 index 0000000000..7e21548f00 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/exploring-kubernetes-cronjobs.md @@ -0,0 +1,190 @@ +--- +title: Exploring Kubernetes CronJobs +model: kubernetes +params: + kind: cronjobs +categories: [tutorials] +description: In this tutorial, we will explore how to use Meshery Playground, an interactive live cluster environment, to perform hands-on labs for managing Kubernetes CronJobs. +aliases: +- /kanvas/tutorials/exploring-kubernetes-cronjobs +--- + +Introduction: +In this tutorial, we will explore Kubernetes CronJobs, a resource that allows you to run jobs periodically at specified intervals. We will use Meshery Playground, an interactive live cluster environment, to perform hands-on labs for working with CronJobs in Kubernetes. + +Prerequisites: +- Basic understanding of Kubernetes concepts. +- Meshery Playground access. If you don't have an account, you can sign up at [Meshery Playground](https://play.meshery.io). + +Lab Scenario: Scheduled Backups using CronJobs + +Objective: +Learn how to use Kubernetes CronJobs to schedule and automate periodic backups of a sample application. + +### Steps: + +#### 1. **Accessing Meshery Playground:** + - Log in to the [Meshery Playground](https://play.meshery.io) using your credentials. + - Once logged in, navigate to the Meshery Playground dashboard. + +#### 2. **Deploying an Application:** + - Deploy a simple application that needs periodic backups. You can use a web application or any other application of your choice. + + +# Deploying a web application + +To deploy a web application on Meshery, follow these steps: + + +1. Navigate to the Configuration menu in Meshery. +2. Select "Designs" from the menu. +3. Click on the "Import Design" button. +[![Configuration menu](/kanvas/tutorials/images/configuration-menu-design-import.png)](/kanvas/tutorials/images/configuration-menu-design-import.png) +4. Fill in the required details for your application or design, including the Design File Name, Design Type, and choose your preferred upload method: + - For File Upload, click "Browse" to locate and select the design file. + - For URL Import, paste the link to the design. +5. Click the "Import" button to initiate the upload process. +[![Click import button](/kanvas/tutorials/images/click-import.png)](/kanvas/tutorials/images/click-import.png) +6. Upon successful import, a pop-up message will confirm the completion, and it will also indicate that your design has been automatically saved in Meshery. +[![Design is auto-saved](/kanvas/tutorials/images/design-auto-save.png)](/kanvas/tutorials/images/design-auto-save.png) +7. Locate your design and click the deploy button to initiate the deployment process. +[![Located App](/kanvas/tutorials/images/app-deploy.png)](/kanvas/tutorials/images/app-deploy.png) +8. Once the popup window opens, wait for the dry run to complete, and then click the deploy button. +[![Dry Run](/kanvas/tutorials/images/click-deploy.png)](/kanvas/tutorials/images/click-deploy.png) +9. Upon successful deployment, a confirmation pop-up will appear, indicating that your app has been successfully deployed. +[![Deployment Success](/kanvas/tutorials/images/deploy-success.png)](/kanvas/tutorials/images/deploy-success.png) + + + + +#### 3. **Creating a CronJob for Backups:** + +- Create a CronJob that runs a backup script at a specified interval to back up the application data. + + + +1. Open the Kanvas tab located in the left panel. +2. Upon opening Kanvas, ensure that you are on the Design tab, which can be found at the top center of the canvas. +3. Navigate to the Design option located in the top menu of the left panel. Using the search bar, type in the name of your app, which in this instance is the Minecraft App. +4. Once your app appears in the list, click on it to upload the design file onto the canvas. +[![Navigate Kanvas](/kanvas/tutorials/images/navigate-kanvas.png)](/kanvas/tutorials/images/navigate-kanvas.png) +5. Locate the control panel at the bottom of the canvas and choose the Kubernetes option. +6. Using the search bar, enter "Cron Job" and click on the corresponding icon to display it on the canvas. +[![Select CronJob item](/kanvas/tutorials/images/select-cronjob.png)](/kanvas/tutorials/images/select-cronjob.png) +7. Once the cronjob component appears on the canvas, click on it to open the toolbar and begin configuration. +[![CronJob Toolbar](/kanvas/tutorials/images/toolbar-cronjob.png)](/kanvas/tutorials/images/toolbar-cronjob.png) +8. Fill out the details for the CronJob i.e Name field: "backup-cronjob". Under **Spec**, enter the specifications, i.e schedule: "0 * * * *" to run every hour. +[![CronJob Toolbar](/kanvas/tutorials/images/tool-bar.png)](/kanvas/tutorials/images/tool-bar.png) +9. Locate the **Save As** icon in the top right, once the pop up modal opens, give your design a name, then click save. +[![Save CronJob](/kanvas/tutorials/images/save.png)](/kanvas/tutorials/images/save.png) + +10. Thereafter click on the **Action** drop down menu also located in the top right and click on the **Deploy** option. +[![Deploy CronJob](/kanvas/tutorials/images/deploy.png)](/kanvas/tutorials/images/deploy.png) +11. In the pop-up window, review and correct any errors as necessary. Then, click the deploy button. +[![Deploy CronJob](/kanvas/tutorials/images/deploy-app.png)](/kanvas/tutorials/images/deploy-app.png) +12. You'll receive a confirmation message indicating that your app has been successfully deployed. + +#### 4. **Verifying CronJob Execution:** + - Monitor the execution of the CronJob and verify that backups are created at the specified intervals. + +To view the resources created for the CronJob, we will utilize the Visualize tab of the Kanvas. A view will be created with necessary filters to display the relevant resources. + + 1. Ensure that you are on the Visualize tab, located at the top center of the canvas. + 2. Give the view a name. + 3. Click on the filter icon. + 4. Choose appropriate filters; for this lab, select the kind item that was set earlier during the CronJob creation, i.e., 'CronJob'. + 5. Click the filter icon again to close. This action should display a filtered view with only your resources, similar to the screenshot below: + [![Vizualize CronJob](/kanvas/tutorials/images/view.png)](/kanvas/tutorials/images/view.png) + + + + + +#### 5. **Scaling and Updating CronJobs:** + - Explore how to scale the CronJob or update its schedule by modifying the CronJob configuration. + + 1. Return to the Designer tab + 2. Select the CronJob Design: + Choose the design that contains the CronJob you want to scale from the list of existing designs. + 3. Locate the CronJob Component: + Within the design canvas, identify the representation of the CronJob you wish to scale. It should be labeled as "CronJob" or have a specific icon associated with CronJobs. + [![Vizualize CronJob](/kanvas/tutorials/images/design-cronjob.png)](/kanvas/tutorials/images/design-cronjob.png) + 4. Select the CronJob Component: + Click on the CronJob component to open the toolbar.. + 5. Continue to configure your cronjob with your preffered specifications that match your desired scaling options. + 6. Adjust the Number of Replicas or Parallelism: + Within the toolbar, locate the field related to the number of replicas or parallelism for the CronJob. Adjust this value to scale the CronJob up or down according to your requirements. + [![Vizualize CronJob](/kanvas/tutorials/images/scale.png)](/kanvas/tutorials/images/scale.png) + + 7. Save Changes: + After verifying the adjustments, save the changes made to the CronJob settings within the Kanvas Designer interface to ensure they are retained for future reference. + [![Save CronJob](/kanvas/tutorials/images/save.png)](/kanvas/tutorials/images/save.png) + + +Use Meshery Playground to visualize the changes and observe the impact on the scheduled backups. + +#### 6. **Clean-Up:** + - Delete the CronJob and application resources after completing the lab. + +1. Identify the CronJob Component: + Within the design canvas, find the representation of the CronJob you wish to delete. It should be labeled as "CronJob" or have a specific icon associated with CronJobs. +2. Select the CronJob Component: + Click on the CronJob component to open the tooltip. This action will enable access to the delete icon. Click to delete the CronJob. + [![Save CronJob](/kanvas/tutorials/images/delete.png)](/kanvas/tutorials/images/delete.png) +3. Save Changes: + After deleting the CronJob, save the changes made within the Kanvas Designer interface to reflect the cleanup. + [![Save CronJob](/kanvas/tutorials/images/save-app.png)](/kanvas/tutorials/images/save-app.png) + + + + +#### 7. **Saving and Sharing** + Share your scenario with other Meshery users or the community for collaborative learning. + + +1. Save Your Scenario: + - Click the save option in Kanvas Designer and give your scenario a descriptive name. + +2. Make Design Public: + - Toggle the visibility of your design to "Public" to allow others to view it. + +3. Share Your Design: + - Copy the shareable link or invite collaborators directly from Kanvas Designer. + +4. Invite Friends to Collaborate: + - Share the link with friends or collaborators to enable collaboration on your design. + +5. Confirm Sharing Settings: + - Ensure sharing settings align with your preferences, such as viewing, editing, or commenting permissions. + +6. Save Changes: + - Save any changes made to the sharing settings to apply them. + + + +### Conclusion +Congratulations! You've successfully completed the lab on exploring Kubernetes CronJobs using Meshery Playground. This hands-on experience has provided valuable insights into scheduling and automating tasks in Kubernetes using CronJobs. Explore more scenarios in the Meshery Playground to enhance your skills in cloud-native technologies. diff --git a/content/en/kanvas/tutorials/kubernetes/kubernetes-configmaps-secrets.md b/content/en/kanvas/tutorials/kubernetes/kubernetes-configmaps-secrets.md new file mode 100644 index 0000000000..6b368d99b1 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/kubernetes-configmaps-secrets.md @@ -0,0 +1,156 @@ +--- +title: Understanding Kubernetes ConfigMaps and Secrets with Meshery +model: kubernetes +params: + kind: configmaps +categories: [tutorials] +description: In this tutorial, we will explore how to effectively use Kubernetes ConfigMaps and Secrets for managing configuration data and sensitive information. Leveraging Meshery Playground, an interactive live cluster environment, we'll perform hands-on labs to understand the practical aspects of working with ConfigMaps and Secrets in Kubernetes. +aliases: +- /kanvas/tutorials/kubernetes-configmaps-secrets +--- + +## Introduction + +In this tutorial, we will work with Kubernetes ConfigMaps and Secrets. _ConfigMaps_ are used to manage configuration data, while _Secrets_ are used for sensitive information such as passwords. Using Meshery Playground, an interactive live cluster environment, we'll perform hands-on exercises to gain practical knowledge into working with these Kubernetes objects. + +> **_NOTE:_** If this is your fist time working with Meshery Playground start with the [Kubernetes Pods with Meshery](/kanvas/tutorials/images/kubernetes-pods.md). + +## Prerequisites + +- Basic understanding of containerization and Kubernetes concepts. +- Access to the _Meshery Playground_. If you don't have an account, sign up at [Meshery Playground](https://play.meshery.io/). + +## Lab Scenario + + - Start with an existing design of a simple MySQL pod. + - Add a _ConfigMap_ to set the database name to be created on MySQL pod deployment. + - Use a _Secret_ to set the MySQL root password. + +## Objective + +Learn how to create and manage _Kubernetes ConfigMaps and Secrets_ within the context of a microservices architecture. + +## Steps + +### Access Meshery Playground + +- Log in to the [Meshery Playground](http://playground.meshery.io/) using your credentials. On successful login, you should be at the dashboard. Press the **X** on the _Where do you want to start?_ popup to close it (if required). +- Click **Kanvas** in the navigation menu to navigate to _Kanvas_. + +> **_NOTE:_** Kanvas is still in beta. + +### Clone the starter design + +For this tutorial we will start with an existing design and later add _ConfigMap_ and _Secret_ components to it. The design is a simple MySQL pod. + +Select the **Catalog** tab and search for the word _'tutorial'_ (1). Click on the **[Tutorial] Simple MySQL Pod** (2) design and when prompted click **Clone** (3). + +![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-17_20-01.png) + +Label the pod with a unique key-value pair for easier filtering later. For example, _user:johndoe_. Use the same key-value pair fot labelling all the other resources. The tutorial uses _environment:tutorial_, do not use the same. + + +### Create and configure a ConfigMap + +Click Kubernetes from the dock and select Config Map from the list. This will put the ConfigMap component on the canvas. + +![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-03.png) + +Click the _ConfigMap_ component to load the configuration window. + + 1. Change the **Name** if required. (Using a unique name helps with easier identification later) + 2. Click **+** next to Data and set the ConfigMap data as a key value pair. In this example, the _Key_ is **CREATEDB** and the _Value_ is **myDB**. + + ![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-13.png) + + 3. Click on the **label**. + 4. Set a label for easier filtering later during Visualization. + + ![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-18.png) + + 5. Click outside the window to close it. + +Make a note of the ConfigMap component _name_ and _key_ for use later. + + +### Create and configure a Secret + + Before you proceed, choose a password and convert it into base64 format. Use an online tool to do so. For this example the password is **strongpassword** and the base64 of it is **c3Ryb25ncGFzc3dvcmQ=** + +Click Kubernetes from the dock and select Secret from the list. This will put the Secret component on the canvas. + +![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-19.png) + +Click on the _Secret_ component to load the configuration window. + + 1. Set a _name_. + 2. Set _Type_ as **Opaque**. + 3. Click **+** next to _Data_ and add the secret as a key value pair. For this tutorial, the _Key_ is **SUPERSECRETPASSWORD** and the _Value_ is **c3Ryb25ncGFzc3dvcmQ=**. + + ![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-25.png) + + 4. Click **Labels**. + 5. Set the same label as used earlier in the ConfigMap. + 6. Click outside the window to close it. + + ![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_18-26.png) + +### Configure the Pod to use the ConfigMap and Secret + +Click on the _Pod_ component to load its configuration window. We will set the Secret first and then the ConfigMap. + + 1. Scroll down to _Container_ and expand _Containers-0_. + + ![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-42.png) + + 2. Scroll down to _Env_. An existing environment variable for the MySQL root password is already set. We will modify this to retrieve the password from the Secret. + 3. Expand _Env-0_ and delete the contents of _Value_. + 4. Expand _Value From_, expand _Secret Key Ref_ and set the _Key_ to the name of the key in the Secret and the _Name_ to the name of the Secret which in this example is **SUPERSECRETPASSWORD** and **mysql-secret-eb**. + + ![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-56.png) + + 5. Next, click **+** next to Env to add a second environment variable. + + ![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_00-57.png) + + 6. Expand _Env-1_ and set _Name_ to **MYSQL_DATABASE**. + 7. Expand _Value From_, expand _Secret Key Ref_ and set the _Key_ to the name of the key in the ConfigMap and the _Name_ to the name of the ConfigMap which in this example is **CREATEDB** and **mysql-config-map-by**. + + ![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-00.png) + + +### Validate and Deploy the Design + +Click **Actions** and then Select **Validate** to ensure there are no errors. Then, select the **Deploy** tab on the same window and click **Deploy**. + +### Verify the Secret and the ConfigMap + +Move to the Visualize tab. + +Filter to show the resources pod, configmap and secret and use the lables set earlier to display only your resources. In this example, that is _environment:tutorials_. + +![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-19.png) + +Select the Pod (1) and then choose Actions (2) to the right. Click Open Interactive Terminal (3) to open the terminal to the container. + +![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-25.png) + +Run the following command in the terminal to verify that you are able to use the MySQL root password set as secret to login to MySQL. When prompted enter the root password (in plain text), i.e. _strongpassword_ for this tutorial. + +`mysql -uroot -p` + +![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-27.png) + +Run the following MySQL command to verify that the database set as a ConfigMap was indeed created. + +`show databases;` + +![Configure the ConfigMap](/kanvas/tutorials/images/kubernetes-configmaps-secrets/2024-04-16_01-29.png) + +### Deleting the resources + +To delete the resources, use the **Undeploy** option from the _Design_ view. + + +## Conclusion +Congratulations! You've successfully completed a tutorial on Kubernetes ConfigMaps and Secrets using the Meshery Playground. This hands-on experience should have equipped you with practical knowledge on managing configuration data and sensitive information in Kubernetes. Continue exploring more such scenarios in the Meshery Playground to enhance your skills. diff --git a/content/en/kanvas/tutorials/kubernetes/kubernetes-deployments.md b/content/en/kanvas/tutorials/kubernetes/kubernetes-deployments.md new file mode 100644 index 0000000000..12472fa11d --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/kubernetes-deployments.md @@ -0,0 +1,112 @@ +--- +title: Exploring Kubernetes Deployments with Meshery +model: kubernetes +params: + kind: deployments +categories: [tutorials] +description: Explore a Kubernetes Deployment using Meshery Playground, an interactive live environment, through a series of hands-on exercises. +aliases: +- /kanvas/tutorials/kubernetes-deployments +--- + +### Introduction + +In this tutorial, we'll learn about Kubernetes **Deployments**. Using Meshery Playground, an interactive live environment, we'll perform hands-on exercises to gain practical experience in deploying, managing, and understanding a Kubernetes _Deployment_ without writing any YAML. + +> **NOTE:** If this is your first time working with Meshery Playground, consider starting with the [Exploring Kubernetes Pods with Meshery Playground](/kanvas/tutorials/kubernetes-pods) tutorial first. + +### Prerequisites + +- Basic understanding of containerization and Kubernetes concepts. +- Access to the _Meshery Playground_. If you don't have an account, sign up at [Meshery Playground](https://play.meshery.io/). + +### Lab Scenario + +Launch a sample app in a Kubernetes cluster using _Deployments_. + +### Objective + +Learn how to create, manage, and explore _Kubernetes Deployments_ within the context of a microservices architecture. + +### Steps + +#### Access Meshery Playground + +- Log in to the [Meshery Playground](https://playground.meshery.io) using your credentials. On successful login, you should be at the dashboard. Press the **X** on the _Where do you want to start?_ popup to close it (if required). +- Click **Kanvas** from the left menu to navigate to the _Kanvas_ design page. + + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_16-59.png) + +> **_NOTE:_** Kanvas is still in beta. + +#### Create a Deployment + +1. In the _Kanvas Design_ page, start by renaming the design to a name of your choice for easier identification later. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-03.png) +2. From the floating dock below, click the **Kubernetes** icon and then click **Deployment** from the list. This will create the _Deployment_ component on the design canvas. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-16.png) +3. Click once to select the _Deployment_ component and choose **Configure**. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-20.png) +4. Change the **Name** of the deployment and the **Namespace** if required. For this demonstration, we will leave them as they are and deploy this to the _default_ namespace. +5. A deployment consists of replicas. We must set a value for **Replicas**. If nothing is set, the default is 1. For this example we will set it to **2**. We must also set the _Selector_ property. To do this, expand **Selector** and click **MatchLabels**. Set a _matchLabel_ pair. Here we have set `tutorial:deployment`. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-51.png) +6. Next, expand **Templates** and open **Metadata** configuration modal. On the _metadata_ modal, click **+** next to **Labels** and set the label to the same key-value pair as in the previous step. Here it is `tutorial:deployment`. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-21.png) +7. While still under **Template** and click **Spec** to load the _spec_ configuration modal. Then scroll down and click **+** next to **Containers**. This will create a container. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_17-55.png) +8. Expand **Containers-1** and fill in the mandatory details such as _Image_ and _Name_. For this example we set the **Image** to `meshery/meshery-milestone:latest` and **Name** to `meshery-milestone`. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-00.png) +9. Click on an empty area in the canvas to close the configuration modals. This completes designing the _Deployment_ and should looks similar to the screenshot below. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-32.png) + +#### Validating and deploying the Deployment + +In the next set of steps we will validate the design and deploying it. + +1. To validate the design, click **Actions** and then **Validate** from the top menu. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-03.png) + + This should show a pop-up with details such as the number of components, annotations and validation errors (if any). Ensure there are no errors before deploying. If there are errors, fix them before moving forward. + +2. To deploy, click **Actions** and then **Deploy** to load the deployment workflow. The first step is design validation which should already be marked as done. Click **Next**. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-08.png) + +3. In the following step, select the _Deployment Targets_ where you want to deploy this. When done click **Next**. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-09.png) + +4. In the third step, a _Dry Run_ is performed. Fix any errors displayed here. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-23.png) + +5. Finally, click **Deploy** in the next step. You may choose to open the design in _Operate_ mode after this step to explore the resources by checking the **Open in Operator** checkbox. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-26.png) + +6. Click **Finish** to close the workflow. + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_18-27.png) + +You should see a few alerts on the bottom right about the deployment. + +#### Viewing and Operating the Deployment + +To view and perform operations on the resources deployed, i.e. the _Deployment_ in this exmaple, we will use the **Operate** functionality of _Kanvas_. You can open the design in _Operate_ mode during the _Deploy_ workflow or later by click the **Operate** tab. It will load the deployed resources in _Operate_ view similar to the screenshot below. +![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-28_15-03.png) + +You can click on any of the resources to view various details and actions applicable to them. For example, click on the _Deployment_ i.e. `deployment-bl` in this case (shown with a green border in the image below), to view deployment details such as _Age_, _Kind_, _Pods_, _Replicas_, _Namespace_ etc. +![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-28_15-10.png) + +Take some time to explore other resources such as _Pod_, _Container_ etc. + + +#### Deleting the Deployment + +To delete the deployment, click **Actions** and select **Undeploy**. +![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_22-20.png) + +Follow the _Undeploy_ workflow (similar to the _Deploy_ workflow) and click **Undeploy** in the Finalize Deployment step. +![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_22-22.png) + +### Conclusion + +Congratulations! You've successfully completed the lab on Exploring Kubernetes Deployments with Meshery Playground. + +Continue exploring more scenarios in the Meshery Playground to enhance your skills. + diff --git a/content/en/kanvas/tutorials/kubernetes/kubernetes-pods.md b/content/en/kanvas/tutorials/kubernetes/kubernetes-pods.md new file mode 100644 index 0000000000..4d008e3334 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/kubernetes-pods.md @@ -0,0 +1,164 @@ +--- +title: Exploring Kubernetes Pods with Meshery +model: kubernetes +params: + kind: pods +categories: [tutorials] +description: Explore Kubernetes Pods using Meshery in an interactive live cluster environment, through a series of hands-on exercises. +aliases: +- /kanvas/tutorials/kubernetes-pods +--- + +### Introduction + +In this tutorial, we'll learn the fundamentals of Pods, the smallest deployable units in the Kubernetes ecosystem. Using Meshery Playground, an interactive live cluster environment, we'll perform hands-on labs to gain practical experience in deploying, managing, and understanding some of the concepts related to Pods. + +> **_NOTE:_** This tutorial demonstrates stand alone pods, i.e. pods not managed through deployments. + +### Prerequisites + +- Basic understanding of containerization and Kubernetes concepts. +- Access to the _Meshery Playground_. If you don't have an account, sign up at [Meshery Playground](https://play.meshery.io/). + +### Lab Scenario + +Deploy and explore an NGINX pod in a Kubernetes cluster. Additionally, expose the pod through a service. + +### Objective + +Learn how to create, manage, and explore _Kubernetes Pods and Services_ within the context of a microservices architecture. + +### Steps + +#### Access Meshery Playground + +- Log in to the [Meshery Playground](https://play.meshery.io) using your credentials. On successful login, you should be at the dashboard. Press the **X** on the _Where do you want to start?_ popup to close it (if required). +- Click **Explore** in the Cloud Native Playground tile to navigate to _Kanvas_. + +> **_NOTE:_** Kanvas is still in beta. + +#### Create a simple stand-alone Pod + +1. In the Kanvas screen, rename the design from _Untitled Design_ to a name of choice. This helps in identifying the design later easily. +2. Click **Components** tab. +3. Search for **Pod** in the list of components. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-20.png) +4. Scroll down, _select and drag_ the **Pod** component from the search results to the design canvas on the right. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-32.png) +5. You should now have a pod in the design canvas for further configuration. It has a default name assigned to it. + Click the pod component to load the configuration modal. +6. Rename the pod, if necessary. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-22_18-35.png) + +#### Add a container to the Pod + +The pod at this stage does not have a container, so we will add one. This is similar to defining the containers in the _spec:_ section of a YAML file. For this hands-on we will make some basic and necessary configurations only. + +7. Scroll down within the Pod configuration modal to the Containers section. Click **+** to add a container. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-54.png) +8. Expand **Containers-0**. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-54_1.png) +9. Next, fill out some of the required container specifications. Start by entering the container image, we will use _nginx:latest_ for this exercise. +10. Give the container a name. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-23_11-57.png) +11. Additionally, we will also give it a label. This will server many advantages later in this exercise. To do so, click the label icon on the modal. +12. Click **+** next to _Labels_. +13. Set any label of choice. Preferably, give a unique label since the playground is a shared environment. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-18.png) +14. Click outside to close the modal. + +#### Validating and Deploying the Pod + +The next step in this process is to validate the design, after which we can deploy it. + +To do this, click **Validate** on the top. +![](/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-52.png) + +This should show a pop-up with details such as the number of components, annotations and errors (if any). +![](/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-54.png) + +Ensure there are no errors before deploying. To deploy, click the **Deploy** (1) tab in the pop-up modal and then click **Deploy** (2) again. +![](/kanvas/tutorials/images/kubernetes-pods/2024-02-23_19-56.png) + +You should see a few alerts on the bottom right about the deployment. + +#### Visualizing the Pod + +To view the resources deployed we will use the **Visualize** section of the _Kanvas_. A view is created with necessary filters to show the relevant resources. + +1. Click **Visualize** to begin. +2. Give the view a name (rename). +3. Click the filter icon. +4. Choose appropriate filters, for this hands-on choose the label that was set earlier during the pod creation. This helps in showing limited resources in the view. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-22.png) + +Click the filter icon again to close. This should show a filtered view with only your resources something similar to the screenshot below: +![](/kanvas/tutorials/images/kubernetes-pods/2024-02-25_18-25.png) + +#### Pod state and information + +Select the **Details** tab and select the pod from the view to view details about the pod. +The details tab shows the following: + +- Pod state, a green check means **running**. +- The namespace where the pod is running. +- Image details of the container in the pod like image tag and name. +- It also shows the number of restarts and uptime. + +![](/kanvas/tutorials/images/kubernetes-pods/2024-02-25_17-38.png) + +#### Connecting to the Pods / containers + +Meshery Playground provides terminal capabilities to connect to the container(s) and stream logs. The following steps demonstrate this. + +1. Select the **Pod** (or container). If you have multiple containers in a pod, select a container. +2. Select the **Actions** tab to the right. +3. Click **Open Interactive Terminal**. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-05.png) + This displays the terminal on the screen. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-10.png) +4. To view streaming logs, click **Stream Container Logs** to the right and an additional logs view is added to the terminal window. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-11.png) + +#### Exposing a Pod with a Service + +> **_NOTE:_** As of this writing, Meshery Playground supports only NodePort at the moment. + +1. Go back to the _Design_ view. +2. From **Components** search for _service_ and the drag the service component to the design canvas. +3. Click the _service_ component to load the configuration modal. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-33.png) +4. Rename it if required. +5. Change _Type_ to **NodePort** for this tutorial. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-35.png) +6. Click **+** to add a Port. +7. Expand the **Ports-0** service port to make changes. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-37.png) +8. For this tutorial we set the **Target Port** value to 80. +9. We also set the **Port** value to 80. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-45.png) +10. Click **+** next to Selector and add the key value pair **app:9870**. This is the same pair that is used as label in the Pod. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-48.png) +11. Finally label this service too, with the same key value pair. This also helps in filtering resources specific to us in the Visualize screen. + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-28_11-53.png) +12. Move your mouse over the service component until you see the green dots on all four sides. Move your mouse over one of the green dots to reveal an arrow, then click the arrow. Select **Network** option, and then move your mouse to the pod to create the _relationship_. It should look similar to the screenshot below: + ![](/kanvas/tutorials/images/kubernetes-pods/2024-02-29_20-37.png) +13. Validate the design. Click **Validate** from the top menu to do so. + +#### Updating the deployment + +In order to apply the updated design (which contains a service now), we must undeploy and deploy the design. + +- Select **Undeploy** and click **Undeploy** again. +- To deploy the updated components, select **Deploy** and click **Deploy**. + +#### Deleting and Recreating Pods + +To delete the resources such as Pods, use the **Undeploy** option from the _Design_ view. + +To recreate, use the **Deploy** option. + +### Conclusion + +Congratulations! You've successfully completed the lab on exploring Kubernetes Pods using Meshery Playground. This hands-on experience should have provided valuable insights into the deployment, management, and interaction with Pods in a Kubernetes environment. Continue exploring more scenarios in the Meshery Playground to enhance your skills. + diff --git a/content/en/kanvas/tutorials/kubernetes/kubernetes-request-flow.md b/content/en/kanvas/tutorials/kubernetes/kubernetes-request-flow.md new file mode 100644 index 0000000000..9186295fa6 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/kubernetes-request-flow.md @@ -0,0 +1,129 @@ +--- +title: Kubernetes Request Flow – A Visual Guide +description: A visual walkthrough of how user requests flow through Kubernetes components using Meshery Kanvas. +model: kubernetes +params: + kind: deployments +categories: [tutorials] +aliases: +- /kanvas/tutorials/kubernetes-request-flow +--- +In this tutorial, we will explore the exact journey a request takes inside a Kubernetes cluster from the moment a user hits "Enter" in their browser, to the moment a response is sent back. We will understand the fundamental data path of a request - from the user to the container, using a **diagram built in Meshery Kanvas**. + +> **_Note:_** This tutorial is completely visual and beginner-friendly. No YAML or CLI is required. + + +### Prerequisites + +- Basic understanding of Kubernetes objects (Service, Pod, Container) +- Access to the _Meshery Playground_. If you don't have an account, sign up at [Meshery Playground](https://play.meshery.io/). + + +### Lab Scenario + +We will explore a simple application architecture in Kubernetes. +- A **User** sending a request +- A **Service (ClusterIP)** routing the request +- A **Deployment** managing a **Pod** +- The **Pod** running **two containers**: one for logic and one for database interactions + +This is a common real-world pattern seen in microservices architectures and backend systems. + + +### Objective + + We will visually explore how all the kubernetes components come together using Meshery Kanvas, and learn how this understanding can simplify debugging and designing applications. + + +## Walkthrough in Meshery Kanvas + +### Accessing the Visual Guide Design + +- Start by opening the prebuilt design from here: + [![Kubernetes Flow Diagram](/kanvas/tutorials/images/kubernetes-request-flow/k8s-request-flow.png)](https://kanvas.new/extension/meshmap?mode=design&design=629b6039-ebb3-4bd8-9b1b-19184fade225) + +> Click the image above to open the interactive design in Meshery Kanvas. + +- Once inside Kanvas, we will see a complete layout of how a request flows through the Kubernetes architecture. We are going to understand what’s happening in this architecture. +- If it looks a bit overwhelming at first, zoom in/out or drag around the canvas to get comfortable with the layout. + + +### Understanding the Components + +#### 1. User + +- This isn't a Kubernetes object, but it's been included to show where the request begins, like someone opening the app in a browser or making an API call. + +#### 2. Service (ClusterIP) + +- This is the entry point into the cluster. +- It forwards traffic to the Pods. While this visual is a placeholder, in a real Kubernetes Service, we would typically define a type (like ClusterIP or NodePort) and use selectors to route traffic to matching Pods. This is how services know where to forward requests. +- A Kubernetes Service acts like a load balancer inside the cluster. + +#### 3. Deployment + +- It handles the app's lifecycle — scaling, rolling updates, and keeping replicas alive. It also ensures self-healing (restarts crashed Pods). +- The Deployment here is meant to represent how Kubernetes manages Pods and acts as a layer of abstraction so we don't interact with Pods directly. +- Typically, we would see replica counts and labels defined. These labels are crucial because they are how the Deployment matches with Pods. + +#### 4. Pod + +- Pods are where the app lives, the actual workloads. +- Each Pod has one or more containers. Even if we are running just one container, Kubernetes still wraps it in a Pod. +- In a real Pod spec, we would see metadata, container definitions, and possibly resource limits. + +#### 5. Containers (Inside the Pod) + +- In this design, we have two containers inside the Pod like roommates sharing the same space and network. +- Container 1: **Application Logic** – the app’s backend or frontend code. +- Container 2: **DB Layer** – a simple service handling persistence, cache, or a local DB. +- This is super helpful if we are trying to understand how traffic flows into our app or how containers talk to each other inside the Pod. +- In a real design, containers show details like image names, ports, and environment variables. This layout is simplified, but helps visualize the app structure. + + +### Why This Flow Matters + +At first glance, Kubernetes might seem like a maze of abstract objects like Services, Deployments, Pods. But once we visualize how a simple request flows from a user all the way to the container, things start to click. + +Understanding this path helps us: + +- Debug faster — "Why am I not getting a response?" becomes easier to track when we know who is responsible for routing and serving. + +- Scale smarter — Once we know where the load hits, we can add replicas where it actually matters. + +- Design better — From tracing logs to optimizing performance, knowing the flow helps us place the right tools in the right spots. + +Think of this request path as the backbone of your Kubernetes understanding. Everything else like Ingress, HPA (Horizontal Pod Autoscalers), or Service Meshes builds upon this foundation. + + +### Operate This Flow + +- If we want to go beyond just “viewing” the flow, we can switch to **Meshery Kanvas → Operate Mode** to interact with real Kubernetes clusters. +This lets us: + +- Swap containers inside Pods +- Change replica counts for Deployments +- Observe how traffic would flow with different setups + +All of this happens visually, without having to write or apply any YAML. + + +## Want to Try Building It Yourself? + +If we want to recreate this flow from scratch, we can drag and drop the same components inside Meshery Kanvas → Design Mode. It’s a great way to test our understanding and see how things fit together. + + +### Diagram Screenshot + +[![Kubernetes Flow Diagram](/kanvas/tutorials/images/kubernetes-request-flow/k8s-request-flow.png)](/kanvas/tutorials/images/kubernetes-request-flow/k8s-request-flow.png) + +> Note: You can design this yourself using the components in Meshery Kanvas. + + +## Conclusion + +Congratulations! You have now visually walked through one of the most fundamental flows in Kubernetes: how a request reaches your app and how each component plays its part. This foundation is key for deeper learning from Ingress Controllers to autoscalers and service meshes. Keep exploring, keep designing in the Meshery Playground to enhance your skills. + + + + diff --git a/content/en/kanvas/tutorials/kubernetes/kubernetes-services.md b/content/en/kanvas/tutorials/kubernetes/kubernetes-services.md new file mode 100644 index 0000000000..b4a16c43d9 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/kubernetes-services.md @@ -0,0 +1,189 @@ +--- +title: Exploring Kubernetes Services with Meshery +model: kubernetes +params: + kind: services +categories: [tutorials] +description: Explore Kubernetes Services using Meshery using Meshery Playground, an interactive live environment, through a series of hands-on exercises. +aliases: +- /kanvas/tutorials/kubernetes-services +--- + +### Introduction + +In this tutorial, we'll learn to implement Kubernetes **Services**, the resources responsible for exposing applications inside and outside the cluster. Using Meshery Playground, an interactive live cluster environment, we'll perform hands-on labs to gain practical experience with the Kubernetes Services, without writing any YAML. + +> **NOTE:** If this is your first time working with Meshery Playground, consider starting with the [Exploring Kubernetes Pods with Meshery Playground](/kanvas/tutorials/kubernetes-pods) tutorial first or [Exploring Kubernetes Deployments with Meshery](/kanvas/tutorials/kubernetes-deployments). + + +### Prerequisites + +- Basic understanding of containerization and Kubernetes concepts. +- Access to the _Meshery Playground_. If you don't have an account, sign up at [Meshery Playground](https://playground.meshery.io/). + +### Lab Scenario + +Deploy a simple application or a simple Pod and expose it using ClusterIP, NodePort, and LoadBalancer services. Each service will route traffic to the pods via a common label selector. We’ll inspect the service details in Operator mode to confirm their types and behavior. + +### Objective + +Learn how to create, manage, and explore _Kubernetes Services_ to expose applications within the context of a microservices architecture. + +### Steps + +#### Access Meshery Playground +- Log in to the [Meshery Playground](https://playground.meshery.io/) using your credentials. +- On successful login, you should be at the dashboard. +- Click **Kanvas** from the left menu to navigate to the [_Kanvas_ design](https://kanvas.new/extension/meshmap) page. + + ![](/kanvas/tutorials/images/kubernetes-deployments/2025-02-27_16-59.png) + +> **_NOTE:_** Kanvas is still in beta. + + +#### Create a Deployment + +1. In the _Kanvas Design_ page, start by renaming the design to a name of your choice for easier identification later. + + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-04_02.png) + +2. From the floating dock below, click the **Kubernetes** icon and then click **Deployment** from the list. This will create the _Deployment_ component on the design canvas. + + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-04_03.png) + +3. Click or Drag the _Deployment_ component onto the canvas and the **Configure** tab automatically opens. + + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-04_04.png) + +4. Change the **Name** of the deployment and the **Namespace** if required. For this demonstration, we will leave them as they are and deploy this to the _default_ namespace. + +5. Set **Replicas** to `2`. Under **Selector** and **MatchLabels**, Set a _matchLabel_ pair. Here we have set `app:9988110`. + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-04_05.png) + +6. Under **Template → Metadata → Labels**, add the same label `app:9988110`. + ![](/kanvas/tutorials/images/kubernetes-services/metadata.png) + + +7. While still under **Template**, click **Spec** to load the _spec_ configuration modal. Then scroll down and click **+ Add Item** next to **Containers**. This will create a container **Containers 1**. Click on it and add: +- **Image**: `meshery/meshery-milestone:latest` +- **Name**: `meshery-milestone` + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-04_06.png) + +8. Click outside to close the modal. The deployment is now ready and it will look similar to this: + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-04_07.png) + + +9. Validate and Deploy the design: Click Validate (**Actions** toolbar), ensure that there are no errors and then click Deploy. Wait for the deployment to complete (Notifications will appear on bottom right). + +##### You have now deployed a Deployment with 2 pods running in the cluster. + +--- + +#### Add a ClusterIP Service + +1. From **Components**, search for **Service** and drag it to the canvas, rename the service, here I will go with `service-clusterip`. Click on the service component to open its config modal. + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-04_08.png) + +2. In the service configuration modal: +- Set **Type** to `ClusterIP`. +- Click on **+ Add Item** under Ports to add a port called **Ports 1**. Click on it and add: + - **Port**: `80` + - **TargetPort**: `80` (These match the container port that our image serves on.) +- Also add the same key value pair as before under **Selector**: `app:9988110` +- We will also add the same label as the deployment for easier identification in Operator Mode. + ![](/kanvas/tutorials/images/kubernetes-services/edit-01.png) + + +3. Connect the Service to the Deployment: Click over the service component until green dots appear, click the arrow and select network. Drag to the deployment. This creates a Network link. + ![](/kanvas/tutorials/images/kubernetes-services/2025-12-13_1.png) + +From the Actions Tab, Undeploy the deployment first and then, validate and dry-run the new design, resolve any errors that may arise. Now, deploy the design. A pop up in the bottom right will confirm that the design is successfully configured. + + ![](/kanvas/tutorials/images/kubernetes-services/2025-12-13_2.png) + +Switch to Operator mode, explore the Service details. Select the `service-clusterip` resource to see its details. + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-05_11.png) + +Notice the ClusterIP listed under Addresses and that no external IP or NodePort is assigned. This confirms that a ClusterIP service provides an internal IP reachable only within the cluster. +This Service has a ClusterIP (10.98.146.20) and a selector (app=9988110). Any Pod with that label automatically becomes part of the Service’s backend. This label-to-Pod binding is how a ClusterIP Service internally routes traffic to its backing workloads. + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-05_12.png) + + +--- + +#### Add a NodePort Service + +To allow external access, we’ll use a NodePort service. For simplicity, I will switch from using deployment to Pod for our next Service. + +1. Back in Design mode, we will drag a Pod from the dock onto the canvas. Scroll down within the Pod configuration modal to the Containers section. Click **+** to add a container. Expand **Containers-1**. Next, fill out some of the required container specifications. Start by entering the container image, we will use _meshery/meshery-milestone:latest_ for this exercise. Give the container a name and a unique label (This unique label will be used by the service selector.). + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-06_13.png) + +2. Now, drag a Service component onto the canvas and rename it to `service-nodeport`. + +3. Under the config modal, set **Type** to `NodePort` and the same selector as the Pod label, so that our Service is able to connect with our Pod. + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-06_14.png) + +4. Click on **+ Add Item** under Ports to reveal **Ports 1**, expand **Ports 1** and add: +- **Port**: `80` +- **TargetPort**: `80` +- **NodePort**: `30091` (or leave blank to auto-assign). + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-06_15.png) + + +5. Validate and deploy from the Action tab at the top right. + ![](/kanvas/tutorials/images/kubernetes-services/2025-12-13_3.png) + +Now switch to Operator mode, click on any component to view details(like type or selector) about the Service or the Pod. + ![](/kanvas/tutorials/images/kubernetes-services/2025-12-13_4.png) + +Note that this service is mapped NodePort and is accessible on the **Node’s IP address**. + +Expand the details section and you will see a NodePort value (30091), this means the service is exposed on each Node’s IP at port 30091. You can access the app externally via `http://:30091`. + ![](/kanvas/tutorials/images/kubernetes-services/2025-09-06_17.png) + + +The Operator mode also provides an interactive terminal, along with other Details about the Pod. Click on the Pod to reveal the `Initiate Terminal Session` option. + ![](/kanvas/tutorials/images/kubernetes-services/2025-12-13_5.png) + +> **_NOTE:_** In Meshery Playground, Node IPs may not be directly reachable from your local machine due to the sandboxed environment. The NodePort value confirms that the Service is correctly exposed by Kubernetes, even if direct browser access is restricted. + +--- + + +#### Add a LoadBalancer Service + +Finally, we’ll create a LoadBalancer service. In a real cloud environment, this would provision an external load balancer. In Meshery Playground, you will see how the service object is defined, even though a real cloud IP isn’t provided. + +1. In Design mode, add another Pod to the canvas (as before). Add a container with Name `meshery-milestone`, Image `meshery/meshery-milestone:latest`, and add label `app:8080` (or any unique label). +2. Drag a Service component onto the canvas, rename it `service-loadbalancer`. +3. In the service’s Configure panel, set **Type** to `LoadBalancer`. Under Selector, add `app:8080`. +4. Under Ports, click **+ Add Item**. Expand **Ports 1** and set: +- **Port**: `80` +- **TargetPort**: `80` + + +5. Close the panel. + ![](/kanvas/tutorials/images/kubernetes-services/2025-12-13_6.png) + + +6. Validate and Deploy (undeploy the old design first). + +In Operator mode, observe the LoadBalancer service. In a real Kubernetes environment, a LoadBalancer provides an **external IP address**. + ![](/kanvas/tutorials/images/kubernetes-services/2025-12-13_7.png) + +--- + +### Cleaning Up + +To remove all the resources you created in this tutorial: in Design mode, go to Actions → Undeploy and confirm. This will delete the Deployments/Pods and Services from the cluster. + +--- + +### Conclusion + +Congratulations! You've successfully completed the lab on exploring Kubernetes Services with Meshery Playground. You created and deployed a sample application, then exposed it with different Service types (ClusterIP, NodePort, LoadBalancer). + +Continue exploring more scenarios in the Meshery Kanvas to enhance your skills. + + +--- diff --git a/content/en/kanvas/tutorials/kubernetes/wordpress-mysql-persistentvolume.md b/content/en/kanvas/tutorials/kubernetes/wordpress-mysql-persistentvolume.md new file mode 100644 index 0000000000..72ec9284f8 --- /dev/null +++ b/content/en/kanvas/tutorials/kubernetes/wordpress-mysql-persistentvolume.md @@ -0,0 +1,249 @@ +--- +title: Deploying WordPress and MySQL with Persistent Volumes with Meshery +model: kubernetes +params: + kind: deployments +categories: [tutorials] +description: Deploy a WordPress site and a MySQL database with Persistent Volumes using Meshery Playground in an interactive live cluster environment. +aliases: +- /kanvas/tutorials/wordpress-mysql-persistentvolume +--- + +## Deploying WordPress and MySql with Persistent Volumes with Meshery + +### Introduction + +In this tutorial, we will learn how to deploy a **WordPress site and a MySQL database with Persistent Volumes** using Meshery Playground. Meshery Playground is an interactive and collaborative live cluster environment that simplifies the deployment process and enhances user experience by providing visual tools for managing Kubernetes resources. + +> **NOTE:** If this is your first time working with Meshery Playground, consider starting with the [Exploring Kubernetes Pods with Meshery Playground](/kanvas/tutorials/kubernetes-pods) tutorial first. + +### Prerequisites + +- Basic understanding of Kubernetes concepts. +- Access to the _Meshery Playground_. If you don't have an account, sign up at [Meshery Playground](https://play.meshery.io/). + +### Lab Scenario + +- Import the WordPress and MySQL manifest files into Meshery Playground. + +- Create persistent volumes and a secret for the resources using the visual tools provided by Meshery. + +- Deploy these resources on the playground. + +In this lab, you will import the WordPress and MySQL manifest files into Meshery Playground. You will visualize these Kubernetes resources and create persistent volumes for them using the visual tools provided by Meshery. Finally, you will deploy these resources on the Playground. + +### Objective + +Learn how to import manifest files, visualize Kubernetes resources, create new resource components, and deploy the application using Meshery Playground. + +### Steps + +#### Download the Kubernetes Configuration Files + +Go ahead and download these yaml files [mysql-deployment.yaml](https://kubernetes.io/examples/application/wordpress/mysql-deployment.yaml) and [wordpress-deployment.yaml](https://kubernetes.io/examples/application/wordpress/wordpress-deployment.yaml) + +These YAML files contain the Service definitions, Persistent Volume Claims, and Deployment configurations for the WordPress site and the MySQL database. + +#### Access Meshery Playground + +1. Log in to the [Meshery Playground](https://play.meshery.io) using your credentials. On successful login, you should be at the dashboard. Press the **X** on the _Where do you want to start?_ popup to close it (if required). + +2. Click **Explore** in the Cloud Native Playground tile to navigate to _Kanvas_ + +#### Import the Files to Meshery Playground + +1. In the left sidebar, click on the upward arrow symbol(import icon) to import the designs into Meshery. + +2. In the modal that appears: + - Enter a name for your design in the "Design File Name" field (e.g.`mysql-deployment`). + + - Select `Kubernetes Manifest` from the "Design Type" dropdown menu. + + ![Import modal](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp1.png) + + - Choose `File Upload` for the upload method, and select the file you just downloaded. + + - Then, click on `Import` + + ![Import mysql-deployment](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp2.png) + +3. Under the "Designs" tab, you will see that we have successfully imported the `mysql-deployment` design. + + When you click on the names of the designs on the `Designs` tab, you can see the visual representations of the various Kubernetes resources and their relationships on the canvas. + + ![Imported designs on canvas](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp3.png) + +4. Now, follow the same steps to import the `wordpress-deployment` file. + + ![wordpress-deployment](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp4.png) + +#### Merging the Designs + +Next, we will combine the WordPress and MySQL designs into a single design file. By merging these designs, we can manage and deploy both resources together. + +To merge the MySQL deployment design with the WordPress deployment design:/ +1. Click and drag the `mysql-deployment` design from the left panel and drop it onto the design canvas of the `wordpress-deployment`. + + ![drag and drop design](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp5.png) + +2. This action will open a merge modal asking if you want to merge the design, Click on `Merge`. + + ![merge modal](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp6.png) + +3. Click on `Save As` and enter `wordpress-mysql-deployment` as the new file name. + + ![save design](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp7.png) + +#### Create and Configure Secret for MySQL Database + +In this step, we need to create a Kubernetes secret component for the MySQL database. This is necessary because of this configuration in the environment variables section of the mysql-deployment yaml file. + +```yaml +env: +- name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: mysql-pass + key: password +``` + +Before you proceed, choose a password and convert it into base64 format. You can use an online tool for this conversion. For this example the password is `password` and its base64 encoding is `cGFzc3dvcmQ=` + +1. Click on the Kubernetes icon on the dock, search for `secret`, and click on it or drag it to the canvas. + + ![Create secret component](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp8.png) + +2. Click on the Secret component to open the configuration window. + + - Set the _name_ as `mysql-pass` + - Set the _Type_ as `Opaque`. + - Click **+** next to Data and add the secret as a key value pair `password:cGFzc3dvcmQ=` + + ![Configure secret](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp9.png) + +3. Click outside the window to close the configuration tab. + +#### Create Persistent Volumes + +MySQL and WordPress each require a [Persistent Volume(PV)](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) to store their data. + +For this tutorial, we will use the `manual` StorageClassName and set the Persistent Volume to use the `hostPath` type. + +Please note that using `hostPath` for Persistent Volumes is generally not recommended for production environments because it ties the volume to the node's filesystem, which can lead to data loss if the node fails. However, we can use it in this tutorial for development purposes. + +1. Click on the Kubernetes icon on the dock, search for `Persistent Volume`, and select it. We will create two PV's. + + ![Create persistent volume](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp10.png) + +2. Click on the wordpress PV to open the configuration window. + + - Change the "name" to `wp-pv` + - Set the "StorageClassName" as `manual` + - Click **+** next to "AccessMode" and enter `ReadWriteOnce` + + ![Configure persistent volume](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp11.png) + + - Scroll down to "Capacity" and enter in the key pair `storage:20Gi` + + ![Persistent volume capacity](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp12.png) + + - Scroll down to "Hostpath" and input `mnt/data/wp-pv` for the _path_ and `DirectoryOrCreate` for the _type_. + + ![Persistent volume hostpath](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp13.png) + +3. Repeat similar steps for the Mysql Persistent Volume + + - Click on the MySQL PV to open the configuration window. + - Change the "name" to `mysql-pv` + - Set the "StorageClassName" to `manual` + - Click **+** next to "AccessMode" and set it to `ReadWriteOnce` + - Scroll down to "Capacity", and enter the key pair `storage:20Gi` + - Scroll down to "Hostpath" and input `mnt/data/mysql-pv` for the _path_ and `DirectoryOrCreate` for the _type_. + +4. Click on `wp-pv-claim` and `mysql-pv-claim` and set their "StorageClassName" as `manual` + +#### Add Labels + +To make it easier to filter and manage our resources during visualization, let's add labels to all of them. + + You can also choose to use the existing label, `app:wordpress`, but a new one, `dev:tutorial`, is recommended for this tutorial to prevent our resources from getting mixed up with others in the public playground cluster. + +1. Click on the label icon. +2. Click the **+** sign next to Labels. +3. Add the label `dev:tutorial`. +4. Do this for **all** the resources on the canvas. + + ![Add label](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp14.png) + +5. Now click on `Save As` and save the design. + +#### Group Components + +The _**Group Components**_ icon on the dock below allows you to group resources based on shared labels or annotations. + +This functionality aids in visualizing the relationships between various resources, making it easier to manage them, troubleshoot issues, and understand the overall cluster architecture. + +![Group Components](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp21.png) + +#### Deploy the Resources + +1. Click `Actions` in the top right corner and click on `Deploy`. + + ![Actions dropdown menu](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp15.png) + +2. The design will be validated to make sure there are no errors. + + ![Validate design](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp16.png) + +3. Choose the Kubernetes cluster you want to deploy to. + + ![Choose deployment Environment](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp17.png) + + **_Note_**: The Meshery Playground is connected to live Kubernetes cluster(s) and allows users full control over these clusters but you can also have the option to add your own Kubernetes cluster to the Playground. + +4. Finally click `Deploy` to deploy the application to the cluster. + + ![Deploy resources](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp18.png) + +5. To check the status of your deployment, click on the notification icon on the top right corner. You can click on `Open In visualizer` to navigate to the Visualize section or follow the steps below. + + ![Deploy resources](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp22.png) + + +#### Visualizing the Deployed Resources + +To view the resources deployed we will use the Visualize section of the _Kanvas_. In this section, you can apply filters to display the specific resources you want to see. + +1. Move to the Visualize tab. +2. Click the filter icon and choose the appropriate filters + + - For "Kinds" select `Deployment`, `Service`, `PersistentVolume`, `PersistentVolumeClaim` and `Secret` + - For the "label" select `dev=tutorial` + +3. You can also use the icons on the right sidebar to filter the resources. + + After selecting your filters, you should see a view displaying only your relevant resources, as shown in the image below. + + ![Filter resources](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp19.png) + +#### Resource Details + +You can click on any resource to view more details about it in the "Details" section on the right sidebar. + +**Deployment** + +![Get more details about deployment](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp23.png) + +**Service** + +The Service details only display the cluster IP for now. So there is no means for us to access the application externally. + +![Get more details about service](/kanvas/tutorials/images/wordpress-mysql-persistentvolume/wp20.png) + +#### Deleting Resources + +To delete the resources, use the `Undeploy` option from the Action dropdown in the _Design_ tab. + +#### Conclusion + +Congratulations! You’ve successfully completed the tutorial on deploying a WordPress site and MySQL database with Persistent Volumes using Meshery Playground. This hands-on experience should have given you valuable insights into importing manifest files, visualizing resources, creating persistent volumes, and managing deployments in Meshery Playground. diff --git a/content/en/kanvas/tutorials/wordpress/_index.md b/content/en/kanvas/tutorials/wordpress/_index.md new file mode 100644 index 0000000000..e49c066643 --- /dev/null +++ b/content/en/kanvas/tutorials/wordpress/_index.md @@ -0,0 +1,3 @@ +--- +title: Wordpress +--- \ No newline at end of file diff --git a/content/en/kanvas/tutorials/wordpress/embedding-meshery-design-in-wordpress.md b/content/en/kanvas/tutorials/wordpress/embedding-meshery-design-in-wordpress.md new file mode 100644 index 0000000000..d4ecacde8c --- /dev/null +++ b/content/en/kanvas/tutorials/wordpress/embedding-meshery-design-in-wordpress.md @@ -0,0 +1,88 @@ +--- +title: Embedding a Meshery Design in a WordPress Post +model: WordPress +params: + kind: design +categories: [tutorials] +description: Learn how to Embed a Meshery Design in a WordPress Post +aliases: +- /kanvas/tutorials/embedding-meshery-design-in-wordpress +--- + +### Introduction + +In this tutorial, we will learn how to embed a **Meshery Design** in a WordPress post using the **Embed** option in **Kanvas**. + +This tutorial assumes that you have created a design or have an existing one. If not, you can use one of the numerous public designs available in **Kanvas** for this tutorial. + +1. Expand the **Designs** menu on the left. + + ![Expand Designs](/kanvas/tutorials/images/embedding-design-in-wordpress/expand-designs-kanvas.png) + +2. Click the **Quick actions** button to the left of the design (inverted ellipsis) and select **Export Design**. + + ![Export Design](/kanvas/tutorials/images/embedding-design-in-wordpress/quickaction-exportdesign.png) + +3. Click the download icon next to **Embed Design** from the list. + + ![Embed Design](/kanvas/tutorials/images/embedding-design-in-wordpress/embeddesign.png) + +4. This will show the `js` file to download and the HTML code snipped to copy. + + ![Embed Design](/kanvas/tutorials/images/embedding-design-in-wordpress/embeddesign-HTML.png) + +5. Now, head over to WordPress and begin by uploading the `js` file to it. Ideally you will upload it to Media. + + ![Upload to WordPress](/kanvas/tutorials/images/embedding-design-in-wordpress/upload-js-wordpress.png) + +6. Next, click on the uploaded file in WordPress and copy the File URL. You will need this later. + + ![Copy URL](/kanvas/tutorials/images/embedding-design-in-wordpress/copy-url.png) + +7. Open the WordPress post where you want to embed the design in edit mode and add a _Custom HTML_ block. + + ![Copy URL](/kanvas/tutorials/images/embedding-design-in-wordpress/add-custom-html.png) + +8. Paste the following CSS code as it is, followed by the **Embed Code** copied from **Kanvas**. Update the script source value to the URL copied from WordPress. + ``` + + ``` + The final _Custom HTML_ should look something like this: + ``` + + +
+ + ``` + ![Copy URL](/kanvas/tutorials/images/embedding-design-in-wordpress/meshery-design-custom-html.png) + +9. Click **Preview** to validate that the design is rendered. + + ![Copy URL](/kanvas/tutorials/images/embedding-design-in-wordpress/embedded-design-preview.png) + +10. Publish the WordPress post and share. +