If you've been to a conference around .NET in the last year or so, there's likely been workshop available from the .NET team. Jeff Fritz, Jon Galloway, Maria Naggaga, Damian Edwards and/or Daniel Roth and I have all presented in part some of the ConferencePlanner app.

app diagram

The workshop contains building an application from scratch in .NET Core using Razor Pages, Entity Framework, Web API.

I spent some time over the last week updating the workshop to add options for using the updated JavaScriptServices and Deployment options with Docker, Kubernetes, and Helm.

Adding JavaScript Services

Adding Angular SPA using JavaScript Services

Some great improvements have been made to the JavaScript Services for using Angular and React, integrating each frameworks' CLI directly within the templates for the dotnet new commands.

Deployment Options

Visual Studio offers great support for deploying ASP.NET applications through the publish dialog; Azure App Service, Local File System and/or you have the option of Git integration. Container development and deployment options have been added to the workshop as well.


Publish using Docker


In this option, the application is separated into three parts

  • Frontend : Razor Pages application
  • Backend : Web API
  • SQL Server Container on Linux



Publish using Kubernetes deployment file - workshop.yaml

In the /save-points/6-Deployment-docker/ConferencePlanner/kubernetes/ folder is the workshop.yaml deployment file which allows for deployment of the ASP.NET application stack (not SPA Frontend) to a Kubernetes cluster.

kubectl deploy -f workshop.yaml

Helm Chart


Publish using Helm Chart - helm folder

Helm is a package manager for Kubernetes and chart is a collection of files that describe a related set of Kubernetes resources. See more on Helm charts in the docs.

The templates define the resource for the service or deployment and the values.yaml file is used to fill in the template.


apiVersion: v1
kind: Service
  name: {{ template "fullname" . }}-{{ .Values.frontend.name }}
    app: {{ template "name" . }}
    chart: {{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
    - port: {{ .Values.frontend.externalPort }}
      targetPort: {{ .Values.frontend.internalPort }}
      protocol: TCP
      name: {{ .Values.frontend.name }}
    app: {{ template "name" . }}
    release: {{ .Release.Name }}
  loadBalancer: {}

values.yaml (subset)

  replicaCount: 1
  name: frontend
  internalPort: 80
  externalPort: 80
  image: frontend
  tag: latest
  environment: Production
  pullPolicy: IfNotPresent
  restart: Always

Running the install command for helm fills in the templates using the values.yaml file and deploys the application to the Kubernetes cluster configured in your .kubeconfig

 helm install --debug ./workshop

If you want to see the output, use the --dry-run option.