From 8c8f6b91be91038ee88ac6c65ec6e0824d579f58 Mon Sep 17 00:00:00 2001 From: Sakthi Vetrivel Date: Wed, 27 May 2020 16:47:23 -0700 Subject: [PATCH 1/2] adding demo files from Ignite 2019 --- azure-policy/Azure Policy for AKS.jpg | Bin 0 -> 101629 bytes azure-policy/README.md | 52 ++++ azure-policy/privileged-container.yaml | 13 + azure-policy/setup.sh | 22 ++ .../ASC-Trigger-AKS-Alerts.yaml | 91 +++++++ azure-security-center/README.md | 66 +++++ azure-security-center/acr_setup.sh | 6 + azure-security-center/alerts_setup.sh | 4 + private-clusters/setup.sh | 49 ++++ private-clusters/vm_setup.sh | 5 + virtual-node-autoscale/README.md | 34 +++ virtual-node-autoscale/get_helm.sh | 245 ++++++++++++++++++ virtual-node-autoscale/kubectl-get-pods.sh | 1 + virtual-node-autoscale/loadtest.sh | 5 + virtual-node-autoscale/setup.sh | 103 ++++++++ windows-demo/README.md | 51 ++++ windows-demo/helm-rbac.yaml | 18 ++ windows-demo/iis-svc-ingress.yaml | 58 +++++ windows-demo/reset.sh | 5 + windows-demo/setup.sh | 67 +++++ 20 files changed, 895 insertions(+) create mode 100644 azure-policy/Azure Policy for AKS.jpg create mode 100644 azure-policy/README.md create mode 100644 azure-policy/privileged-container.yaml create mode 100644 azure-policy/setup.sh create mode 100644 azure-security-center/ASC-Trigger-AKS-Alerts.yaml create mode 100644 azure-security-center/README.md create mode 100644 azure-security-center/acr_setup.sh create mode 100644 azure-security-center/alerts_setup.sh create mode 100644 private-clusters/setup.sh create mode 100644 private-clusters/vm_setup.sh create mode 100644 virtual-node-autoscale/README.md create mode 100644 virtual-node-autoscale/get_helm.sh create mode 100644 virtual-node-autoscale/kubectl-get-pods.sh create mode 100644 virtual-node-autoscale/loadtest.sh create mode 100644 virtual-node-autoscale/setup.sh create mode 100644 windows-demo/README.md create mode 100644 windows-demo/helm-rbac.yaml create mode 100644 windows-demo/iis-svc-ingress.yaml create mode 100644 windows-demo/reset.sh create mode 100644 windows-demo/setup.sh diff --git a/azure-policy/Azure Policy for AKS.jpg b/azure-policy/Azure Policy for AKS.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a324dd442416713f1cbf9ed4d76cae06095bd4d4 GIT binary patch literal 101629 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%0D-*mGo%OMnB6}?TC1a$bPTjNgE7ch*?uPS05hc zM(AI?m@(O +```` + +Now, we're going to pull a vulnerable image and push it to our registry. + +``` +docker pull docker.io/vulnerables/web-dvw +docker tag .azurecr.io /:.azurecr.io/: Compute & Apps > Containers +Our registry should be listed here. Go ahead and click on the registry to view details. You should see a recommendation called "Vulnerabilities in Azure Container Registry images should be remediated (Preview)" +Click on the recommendation to review the ‘Description’, ‘General Information’, ‘Threats’ and ‘Remediation Steps’ + + +**Azure Security Center Integration with AKS** + +Now we're going to look at how Azure Security Center (ASC) is integrated with Azure Kubernetes Service (AKS). + +First, we need ASC to discover our new cluster (this can take a few hours). + +Once that's done, navigate to Azure Security Center > Compute & Apps > Containers, where we'll see our cluster listed. + +Click on the cluster, and let's review the security recommendations. + +Reccommendations are listed in both the 'Reccommendations' and 'Passed Assessments' tabs at the bottom of the window. + +Click on a Recommendation, and review the ‘Description’, ‘General Info’, ‘Threats’ and ‘Remediation Steps’. +Click on ‘Take Action’, and you will be directed to the AKS resource page to complete remediation. + +We can also see these recommendations in a different view. Click on the 'Recommendations' tab on the right-hand side of Azure Security Center. Filter the recommendations by typing in 'Kubernetes' into the search bar. Now you can view recommendations across all of the clusters in your subscription. + +**Security Alerts with AKS** + + To demonstrate security alerts with AKS, we're going to deploy some containers that will simulate malicious activity. Make sure your context to set to the right cluster. We don't want to expose any other clusters to these security risks. + + ``` + az aks get-credentials -n -g + kubectl config current-context + ``` + +Now, let's deploy the containers. +``` +kubectl create -f ASC-Trigger-AKS-Alerts.yaml +``` + +After waiting about an hour, security alerts should start to pop up in ASC. Head to Azure Security Center > Security Alerts. Here, you can filter by alerts in the last 24 hours, to see the alerts from the containers we deployed. + + +Thanks to Maya Herskovic and the ASC Team for providing some of the documentation for this demo. \ No newline at end of file diff --git a/azure-security-center/acr_setup.sh b/azure-security-center/acr_setup.sh new file mode 100644 index 0000000..3834746 --- /dev/null +++ b/azure-security-center/acr_setup.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +read -p "Enter a unique name for your Azure Container Registry: " acr_name +az group create --name ASC-demo --location eastus +az acr create -n $acr_name -g ASC-demo --sku Basic +az acr login --name $acr_name \ No newline at end of file diff --git a/azure-security-center/alerts_setup.sh b/azure-security-center/alerts_setup.sh new file mode 100644 index 0000000..eeac1bb --- /dev/null +++ b/azure-security-center/alerts_setup.sh @@ -0,0 +1,4 @@ +# SETUP before demo +az group create -g ASC-demo -l eastus +az aks create -n ASC-demo -g ASC-demo --kubernetes-version 1.10.12 --disable-rbac --node-count 1 +az aks get-credentials -n ASC-demo -g ASC-demo diff --git a/private-clusters/setup.sh b/private-clusters/setup.sh new file mode 100644 index 0000000..0795495 --- /dev/null +++ b/private-clusters/setup.sh @@ -0,0 +1,49 @@ +#!/bin/bash +<< COMMENT + +All this has to happen before the demo. +COMMENT +az group create --name privateCluster --location westus +az extension add --name aks-preview +az feature register --name AllowPrivateEndpoints --namespace Microsoft.ContainerService +az feature register --name AKSPrivateLinkPreview --namespace Microsoft.ContainerService +az feature register --name AKSAzureStandardLoadBalancer --namespace Microsoft.ContainerService +az provider register --namespace Microsoft.ContainerService +az aks create -n privateCluster -g privateCluster --load-balancer-sku standard --enable-private-cluster + +vnet=$(az network vnet list -g MC_privateCluster_privateCluster_westus -o json) +vnetName=$(echo $vnet | jq -r .[].name) +username=user +password=user@PASS123 +subnet=aks-subnet + +az vm create --resource-group privateCluster \ +--name myVM --location westus \ +--image UbuntuLTS \ +--vnet-name $vnetName \ +--subnet $subnet \ +--admin-username $username --admin-password $password \ +--size standard_DS1_v2 +<< COMMENT +create the cluster +create a VM in the same VNET as the cluster +Create permissions so that the port 22 is exposed to the internet +install the azure cli on the VM +All of this needs to happen on the VM before we can connect to the cluster: + +ssh to vm +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +az login +az account set +sudo az aks install-cli +az aks get-credentials -g privateCluster -n privateCluster + +Start by showing the creating process of a private cluster (--enable-private-cluster flag) +Show that this is indeed private by trying to access the cluster through the CLI (should get a 404 error) +Show that we have a VM created that is connected to the vnet of the cluster and has a public IP +Then we ssh into this VM, using the public IP and access the cluster + +To reset, just clear both of the terminals used. +To clean up, delete the resource group. +az group delete -g privateCluster +COMMENT diff --git a/private-clusters/vm_setup.sh b/private-clusters/vm_setup.sh new file mode 100644 index 0000000..dfb2440 --- /dev/null +++ b/private-clusters/vm_setup.sh @@ -0,0 +1,5 @@ +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +az login +az account set +sudo az aks install-cli +az aks get-credentials -g privateCluster -n privateCluster \ No newline at end of file diff --git a/virtual-node-autoscale/README.md b/virtual-node-autoscale/README.md new file mode 100644 index 0000000..debe1b3 --- /dev/null +++ b/virtual-node-autoscale/README.md @@ -0,0 +1,34 @@ +**Virtual Nodes** + +**Setup** + +To set up the environment for the live demo, run the setup.sh or if you're using the pre-made environment kubectl config use-context virtual-node-autoscale. Then, open up the following tabs: +- Contoso Store (http://store.13.90.60.80.nip.io/) +- Live Metrics Stream for App Insights for Contoso Store +- Grafana Dashboard (localhost:3000) + +**Walkthrough** + +First, walk through the portal experience of creating a cluster with virtual nodes enabled (Slider on Scaling Tab). + + +Then, navigate to the application we're running on the cluster (contoso-store). + + +Open the Live Metrics Stream tab to demonstrate the current low amount of traffic. + + +In a split-screen terminal, start the load event (bash ./loadtest.sh) + + +In another visible terminal, run watch ./kubectl-get-pods.sh + +Once you see the Live Metrics start responding to the increase in traffic, navigate to the Grafana dashboard. + +Go over the various metrics and explain the graphs (Request per pod, Requests per second. Response time, Number of container instances) + + +**Reset** + + The loadtest only runs for about 5 minutes, so no reset needed here, beyond clearing the terminals you're using. +No clean up! \ No newline at end of file diff --git a/virtual-node-autoscale/get_helm.sh b/virtual-node-autoscale/get_helm.sh new file mode 100644 index 0000000..3f645f8 --- /dev/null +++ b/virtual-node-autoscale/get_helm.sh @@ -0,0 +1,245 @@ +#!/usr/bin/env bash + +# Copyright The Helm Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# The install script is based off of the MIT-licensed script from glide, +# the package manager for Go: https://github.com/Masterminds/glide.sh/blob/master/get + +PROJECT_NAME="helm" +TILLER_NAME="tiller" + +: ${USE_SUDO:="true"} +: ${HELM_INSTALL_DIR:="/usr/local/bin"} + +# initArch discovers the architecture for this system. +initArch() { + ARCH=$(uname -m) + case $ARCH in + armv5*) ARCH="armv5";; + armv6*) ARCH="armv6";; + armv7*) ARCH="arm";; + aarch64) ARCH="arm64";; + x86) ARCH="386";; + x86_64) ARCH="amd64";; + i686) ARCH="386";; + i386) ARCH="386";; + esac +} + +# initOS discovers the operating system for this system. +initOS() { + OS=$(echo `uname`|tr '[:upper:]' '[:lower:]') + + case "$OS" in + # Minimalist GNU for Windows + mingw*) OS='windows';; + esac +} + +# runs the given command as root (detects if we are root already) +runAsRoot() { + local CMD="$*" + + if [ $EUID -ne 0 -a $USE_SUDO = "true" ]; then + CMD="sudo $CMD" + fi + + $CMD +} + +# verifySupported checks that the os/arch combination is supported for +# binary builds. +verifySupported() { + local supported="darwin-386\ndarwin-amd64\nlinux-386\nlinux-amd64\nlinux-arm\nlinux-arm64\nlinux-ppc64le\nwindows-386\nwindows-amd64" + if ! echo "${supported}" | grep -q "${OS}-${ARCH}"; then + echo "No prebuilt binary for ${OS}-${ARCH}." + echo "To build from source, go to https://github.com/helm/helm" + exit 1 + fi + + if ! type "curl" > /dev/null && ! type "wget" > /dev/null; then + echo "Either curl or wget is required" + exit 1 + fi +} + +# checkDesiredVersion checks if the desired version is available. +checkDesiredVersion() { + if [ "x$DESIRED_VERSION" == "x" ]; then + # Get tag from release URL + local latest_release_url="https://github.com/helm/helm/releases/latest" + if type "curl" > /dev/null; then + TAG=$(curl -Ls -o /dev/null -w %{url_effective} $latest_release_url | grep -oE "[^/]+$" ) + elif type "wget" > /dev/null; then + TAG=$(wget $latest_release_url --server-response -O /dev/null 2>&1 | awk '/^ Location: /{DEST=$2} END{ print DEST}' | grep -oE "[^/]+$") + fi + else + TAG=$DESIRED_VERSION + fi +} + +# checkHelmInstalledVersion checks which version of helm is installed and +# if it needs to be changed. +checkHelmInstalledVersion() { + if [[ -f "${HELM_INSTALL_DIR}/${PROJECT_NAME}" ]]; then + local version=$("${HELM_INSTALL_DIR}/${PROJECT_NAME}" version -c | grep '^Client' | cut -d'"' -f2) + if [[ "$version" == "$TAG" ]]; then + echo "Helm ${version} is already ${DESIRED_VERSION:-latest}" + return 0 + else + echo "Helm ${TAG} is available. Changing from version ${version}." + return 1 + fi + else + return 1 + fi +} + +# downloadFile downloads the latest binary package and also the checksum +# for that binary. +downloadFile() { + HELM_DIST="helm-$TAG-$OS-$ARCH.tar.gz" + DOWNLOAD_URL="https://get.helm.sh/$HELM_DIST" + CHECKSUM_URL="$DOWNLOAD_URL.sha256" + HELM_TMP_ROOT="$(mktemp -dt helm-installer-XXXXXX)" + HELM_TMP_FILE="$HELM_TMP_ROOT/$HELM_DIST" + HELM_SUM_FILE="$HELM_TMP_ROOT/$HELM_DIST.sha256" + echo "Downloading $DOWNLOAD_URL" + if type "curl" > /dev/null; then + curl -SsL "$CHECKSUM_URL" -o "$HELM_SUM_FILE" + elif type "wget" > /dev/null; then + wget -q -O "$HELM_SUM_FILE" "$CHECKSUM_URL" + fi + if type "curl" > /dev/null; then + curl -SsL "$DOWNLOAD_URL" -o "$HELM_TMP_FILE" + elif type "wget" > /dev/null; then + wget -q -O "$HELM_TMP_FILE" "$DOWNLOAD_URL" + fi +} + +# installFile verifies the SHA256 for the file, then unpacks and +# installs it. +installFile() { + HELM_TMP="$HELM_TMP_ROOT/$PROJECT_NAME" + local sum=$(openssl sha1 -sha256 ${HELM_TMP_FILE} | awk '{print $2}') + local expected_sum=$(cat ${HELM_SUM_FILE}) + if [ "$sum" != "$expected_sum" ]; then + echo "SHA sum of ${HELM_TMP_FILE} does not match. Aborting." + exit 1 + fi + + mkdir -p "$HELM_TMP" + tar xf "$HELM_TMP_FILE" -C "$HELM_TMP" + HELM_TMP_BIN="$HELM_TMP/$OS-$ARCH/$PROJECT_NAME" + TILLER_TMP_BIN="$HELM_TMP/$OS-$ARCH/$TILLER_NAME" + echo "Preparing to install $PROJECT_NAME and $TILLER_NAME into ${HELM_INSTALL_DIR}" + runAsRoot cp "$HELM_TMP_BIN" "$HELM_INSTALL_DIR" + echo "$PROJECT_NAME installed into $HELM_INSTALL_DIR/$PROJECT_NAME" + if [ -x "$TILLER_TMP_BIN" ]; then + runAsRoot cp "$TILLER_TMP_BIN" "$HELM_INSTALL_DIR" + echo "$TILLER_NAME installed into $HELM_INSTALL_DIR/$TILLER_NAME" + else + echo "info: $TILLER_NAME binary was not found in this release; skipping $TILLER_NAME installation" + fi +} + +# fail_trap is executed if an error occurs. +fail_trap() { + result=$? + if [ "$result" != "0" ]; then + if [[ -n "$INPUT_ARGUMENTS" ]]; then + echo "Failed to install $PROJECT_NAME with the arguments provided: $INPUT_ARGUMENTS" + help + else + echo "Failed to install $PROJECT_NAME" + fi + echo -e "\tFor support, go to https://github.com/helm/helm." + fi + cleanup + exit $result +} + +# testVersion tests the installed client to make sure it is working. +testVersion() { + set +e + HELM="$(which $PROJECT_NAME)" + if [ "$?" = "1" ]; then + echo "$PROJECT_NAME not found. Is $HELM_INSTALL_DIR on your "'$PATH?' + exit 1 + fi + set -e + echo "Run '$PROJECT_NAME init' to configure $PROJECT_NAME." +} + +# help provides possible cli installation arguments +help () { + echo "Accepted cli arguments are:" + echo -e "\t[--help|-h ] ->> prints this help" + echo -e "\t[--version|-v ] . When not defined it defaults to latest" + echo -e "\te.g. --version v2.4.0 or -v latest" + echo -e "\t[--no-sudo] ->> install without sudo" +} + +# cleanup temporary files to avoid https://github.com/helm/helm/issues/2977 +cleanup() { + if [[ -d "${HELM_TMP_ROOT:-}" ]]; then + rm -rf "$HELM_TMP_ROOT" + fi +} + +# Execution + +#Stop execution on any error +trap "fail_trap" EXIT +set -e + +# Parsing input arguments (if any) +export INPUT_ARGUMENTS="${@}" +set -u +while [[ $# -gt 0 ]]; do + case $1 in + '--version'|-v) + shift + if [[ $# -ne 0 ]]; then + export DESIRED_VERSION="${1}" + else + echo -e "Please provide the desired version. e.g. --version v2.4.0 or -v latest" + exit 0 + fi + ;; + '--no-sudo') + USE_SUDO="false" + ;; + '--help'|-h) + help + exit 0 + ;; + *) exit 1 + ;; + esac + shift +done +set +u + +initArch +initOS +verifySupported +checkDesiredVersion +if ! checkHelmInstalledVersion; then + downloadFile + installFile +fi +testVersion +cleanup diff --git a/virtual-node-autoscale/kubectl-get-pods.sh b/virtual-node-autoscale/kubectl-get-pods.sh new file mode 100644 index 0000000..8fd492c --- /dev/null +++ b/virtual-node-autoscale/kubectl-get-pods.sh @@ -0,0 +1 @@ +kubectl get pods -l app=online-store \ No newline at end of file diff --git a/virtual-node-autoscale/loadtest.sh b/virtual-node-autoscale/loadtest.sh new file mode 100644 index 0000000..430b78c --- /dev/null +++ b/virtual-node-autoscale/loadtest.sh @@ -0,0 +1,5 @@ +export GOPATH=~/go +export PATH=$GOPATH/bin:$PATH +go get -u github.com/rakyll/hey +# This URL might be different +hey -z 5m http://store.13.90.60.80.nip.io/ \ No newline at end of file diff --git a/virtual-node-autoscale/setup.sh b/virtual-node-autoscale/setup.sh new file mode 100644 index 0000000..34d38b1 --- /dev/null +++ b/virtual-node-autoscale/setup.sh @@ -0,0 +1,103 @@ +#!/bin/bash +<> +# Install the aks-preview extension +az extension add --name aks-preview + +# Update the extension to make sure you have the latest version installed +az extension update --name aks-preview +az feature register --name WindowsPreview --namespace Microsoft.ContainerService +az provider register --namespace Microsoft.ContainerService +az group create --name windowsDemo --location eastus +PASSWORD_WIN="P@ssw0rd1234" +git clone https://gist.github.com/8d869c43549f2a7a2c0579c565b7d9ef.git +mv 8d869c43549f2a7a2c0579c565b7d9ef windows-demo +cd window-demo +# ^^^^ OFF SCREEN + +# On screen for the video demo +az aks create \ + --resource-group demo \ + --name windowsDemo \ + --node-count 2 \ + --enable-addons monitoring \ + --kubernetes-version 1.14.6 \ + --generate-ssh-keys \ + --windows-admin-password $PASSWORD_WIN \ + --windows-admin-username azureuser \ + --enable-vmss \ + --network-plugin azure + +az aks nodepool add \ + --resource-group demo \ + --cluster-name windowsDemo \ + --os-type Windows \ + --name npwin \ + --node-count 2 \ + --kubernetes-version 1.14.6 +az aks get-credentials --resource-group demo --name windowsDemo + +# Now we're going to go ahead and taint the windows nodes. This will mean that linux workloads that aren't compatibile with running on these nodes will not be +# scheduled on these nodes. On the other hand, pods that have tolerations for the Windows nodes can be schedules on these nodes. This way we make sure that Windows and Linux workloads +# are scheduled with compatible nodes. +kubectl get nodes -l beta.kubernetes.io/os=windows -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}' | xargs -I XX kubectl taint nodes XX windows=true:NoSchedule + +# Give Helm the appropriate permissions to run within the cluster +kubectl apply -f helm-rbac.yaml +helm init --service-account=tiller +helm repo update + +# This is where the in-person demo starts +kubectl get nodes +# Show that there are windows and linux nodes running in the same cluster + +# Now we're going to go ahead and taint the windows nodes. This will mean that linux workloads that aren't compatibile with running on these nodes will not be +# scheduled on these nodes. On the other hand, pods that have tolerations for the Windows nodes can be schedules on these nodes. This way we make sure that Windows and Linux workloads +# are scheduled with compatible nodes. +kubectl get nodes -l beta.kubernetes.io/os=windows -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}' | xargs -I XX kubectl taint nodes XX windows=true:NoSchedule + +helm install stable/nginx-ingress +# This is a linux workload and we see that it runs on the linux nodes in the cluster +kubectl get pods -o wide +kubectl apply -f iis-svc-ingress.yaml +# We see that the windows workload runs on the windows nodes in the cluster +kubectl get pods -o wide +kubectl get svc # to get exposed IP +# Test in browser +# So here we see that we can use the linux and windows workloads together in the cluster, here using the Linux nginx server to expose the Windows application to the internet, thanks to Windows containers in AKS From dbb7f6f30a25416bbd21ddf1ef88948d3f5e4319 Mon Sep 17 00:00:00 2001 From: Sakthi Vetrivel Date: Wed, 27 May 2020 17:02:37 -0700 Subject: [PATCH 2/2] updating README --- README.md | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 9322706..e76831e 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,28 @@ --- page_type: sample languages: -- csharp +- bash products: -- dotnet -description: "Add 150 character max description" -urlFragment: "update-this-to-unique-url-stub" +- azure, azure kubernetes service +description: "Application to demo AKS features" +urlFragment: "aks-demos" --- -# Official Microsoft Sample +# Set up an Azure Kubernetes Service cluster to test out new features - - -Give a short description for your sample here. What does it do and why is it important? +This samples shows you how to set up an Azure Kubernetes Cluster and enable features such as Azure Policy, Azure Security Center, Windows Containers for AKS, and Virtual Nodes. ## Contents -Outline the file contents of the repository. It helps users navigate the codebase, build configuration and any related assets. - | File/folder | Description | |-------------------|--------------------------------------------| -| `src` | Sample source code. | +| `azure-policy` | Sample code and instructions to set up a Kubernetes cluster and enable Azure Policy | +| `azure-security-center` | Sample code and instructions to set up a Kubernetes cluster and enable Azure Security Center | +| `private-clusters` | Sample code and instructions to set up a Kubernetes cluster and enable private clusters | +| `virtual-node-autoscale` | Sample code and instructions to set up a Kubernetes cluster and enable virtual node. | +| `windows-demo` | Sample code and instructions to set up a Kubernetes cluster and enable Windows containers for AKS | `.gitignore` | Define what to ignore at commit time. | | `CHANGELOG.md` | List of changes to the sample. | | `CONTRIBUTING.md` | Guidelines for contributing to the sample. | @@ -35,19 +31,7 @@ Outline the file contents of the repository. It helps users navigate the codebas ## Prerequisites -Outline the required components and tools that a user might need to have on their machine in order to run the sample. This can be anything from frameworks, SDKs, OS versions or IDE releases. - -## Setup - -Explain how to prepare the sample once the user clones or downloads the repository. The section should outline every step necessary to install dependencies and set up any settings (for example, API keys and output folders). - -## Running the sample - -Outline step-by-step instructions to execute the sample and see its output. Include steps for executing the sample from the IDE, starting specific services in the Azure portal or anything related to the overall launch of the code. - -## Key concepts - -Provide users with more context on the tools and services used in the sample. Explain some of the code that is being used and how services interact with each other. +The samples assume that you have an Azure subscription and a terminal to run the bash scripts for setup. Some samples have additional prequisites that are outline in their respective READMEs. ## Contributing