.net in the big box

Devopenspace 2017


Frank Pommerening

Frank Pommerening

  • Senior - Softwareentwickler
  • Consultant
  • Softwarearchitekt


frank@pommerening-online.de
AXP Consulting GmbH & Co. KG in Leipzig
Gründung: Mai 2012
Anzahl Mitarbeiter: 8 feste
Branchenfokus: Energiebranche


  • Consulting (fachlich & IT)
    • Requirements Engineering / Projektmanagement
    • IT-Fachprozess-Analyse / Dokumentation
  • Software-Entwicklung
    • Microservices, SOA, REST, OOA und OOD
    • Microsoft Technologien z.B. .NET (C#), WPF, WCF
    • Datenbanken (MS SQL Server / Oracle / MongoDB)

Build .Net Core App

Logo .net and docker

Build inside

Die Anwendung wird im Container während der Imageerstellung gebaut.

Vorteile Nachteile
  • Buildserver nicht erforderlich
  • Weniger komplex
  • Quellcode und Buildabhängigkeiten ggf. im Image enthalten
  • Basisimage größer (SDK erforderlich)
  • i.d.R. entstehen größere Images
  • Buildfehler schwerer zu debuggen

Build outside

Die Anwendung wird unabhängig vom Container erstellt. Die entstandenen Artefakte werden bei der Imageerstellung kopiert.

Vorteile Nachteile
  • i.d.R. kleinere Images und Basisimages
  • Build unabhängig von der Imageestellung
  • Quellcode und Buildabhängigkeiten nicht enthalten
  • Infrastruktur für Build erforderlich
  • Trennung erzeugt Komplexität

Multi-Stage Build

Die Anwendung wird während der Imageerstellung in einem temporären Container gebaut. Die entstandenen Artefakte werden in den finalen Container kopiert.
Vorteile Nachteile
  • i.d.R. kleinere Images und Basisimages
  • Buildserver nicht erforderlich
  • Quellcode und Buildabhängigkeiten nicht enthalten
  • komplexere Dockerfiles
  • Mehrere Quellimages (SDK / Runtime) erforderlich
  • Buildfehler schwerer zu debuggen

Build mit Cake

  • Framework zur Build-Automatisierung (DSL)
  • Open Source
  • Cross platform
  • Projekt der .NET Foundation
  • Erweiterbar durch Plugins
  • Visual Studio Code Unterstützung
  • Integration Build-Server wie TFS, Jenkins, Teamcity ...
  • Quelle: https://cakebuild.net/

Cake-File

Datei zur Beschreibung der einzelnen Aufgaben z.B. Build oder Test sowie deren Abhängigkeit. Die Definition erfolgt in C#.
var target = Argument("target", "Default");
Task("Aufgabe1").Does(() =>
{
  ...
});

Task("Aufgabe2").IsDependentOn("Aufgabe1").Does(() =>
{
  ...
});

Task("Default").IsDependentOn("Aufgabe2");

RunTarget(target);

Erweiterungen

Erweiterungen für bestimmte Aufgaben z.B. Komprimierung oder Ausführung von Docker-Befehlen werden als Nuget-Pakete z.T. durch die Community bereitgestellt.
Die Einbindung erfolgt mit der Direktive #addin
#addin "Cake.Docker"
#addin nuget:?package=SharpZipLib
Angabe spezifische Nuget-Version
#addin nuget:?package=SharpZipLib&version=1.2.3

Fehlerbehandlung

Verhalten bei Fehlern

Task("Aufgabe").Does(() => {  ...  })
   .OnError(ex =>{   ...   });

Fehler ignorieren

Task("Aufgabe")
   .ContinueOnError()
   .Does(() => {   ...   });

Verhalten nach Ausführung

Task("Aufgabe")
   .Does(() => {  ...  })
   .Finally(() => {  ... });

Build / Integration Dockerhub

Die Verknüpfung von GitHub und Docker Hub gestattet eine automatische Erstellung der Container mit jeder Codeänderung. schema flow github and dockerhub Voraussetzungen:
  • Accounts bei GitHub und Docker Hub existieren
  • Quellcode inkl. Dockerfile ist in einem Repository auf GitHub vorhanden

Verbindung GitHub und Docker Hub

  1. Login bei Docker Hub
  2. Profil -> Setting -> Linked Accounts & Services
  1. Auswahl des Zugriffs

  1. Autorisierung des Zugriffs
  2. Bestätigung mit GitHub-Kennwort

Automatischer Build

  1. Login bei Docker Hub
  2. Create -> Create Automated Build
  3. Auswahl Herkunft Quellcode (GitHub oder Bitbucket)

  1. Auswahl des Quell-Repository
  1. Konfiguration Docker Hub-Repository
    • Namespace (Fix: Benutzer)
    • Name (Default: Name des GitHub-Repository)
    • Sichtbarkeit (Default: Öffentlich)
    • Kurzbeschreibung (Pflichtfeld)

  1. Anpassung Build-Einstellungen (Build-Settings)
    • Pfad zum Dockerfile
    • Definition Tags
    • Verwendete Git-Branches
  1. Prüfung Build (Build Details)

Visual Studio Team Services

Cloudbasierte Komplettlösung für Entwickler von Microsoft

Die Build-Defintion erfolgt über ein Webportal. Die kostenfrei bereitgestellten Build-Agents werden in Windows-Umgebungen auf Azure ausgeführt. Sie erlauben keine Erstellung von Docker-Container. Dafür muss ein eigener externer Build-Agent bzw. Docker-Host bereitgestellt werden.

Zugang / Anmeldung (per Live-ID)

Erstellung Personal Access Token

Der Personal Access Tokel erlaubt dem Build-Agent die Authentifizierung gegenüber den Visual Studio Team Services.
Create personal access token step 1 Create personal access token step 2 Create personal access token step 2

Starten des Build-Agent

docker run -e VSTS_ACCOUNT=username
	-e VSTS_TOKEN=personal_access_token
	-v /var/run/docker.sock:/var/run/docker.sock
	-it microsoft/vsts-agent
Optional:
  • VSTS_POOL ("Default")
  • VSTS_AGENT ($(hostname))


Je nach Umgebung z.B. TFS 2017 werden spezielle Tags benötigt.

Defintion Build

Beispiel: Erstellung einer .NET Core 2 Anwendung mit den Container-Erstellung und Veröffentlichung auf Dockerhub.

Herkunft für Quellcode

  • Visual Studio Team Services
  • GitHub
  • Bitbucket
  • externe Git-Repos
  • externe Subversion-Repos

Auswahl Vorlage


Auswahl: Empty process

Defintion Name / Build-Agent


Eigenen Build-Agents werden in der Agent queue Default angelegt.

.NET Core Schritte



.NET Core Restore


Angabe der Projekt(e) oder alle mit **/*.csproj

.NET Core Build


.NET Core Publish


Angabe eines Unterordner unterhalb des Ausgabeordners ist für Docker-Build erforderlich.

Kopieren des Dockerfile

Das Dockerfile wird vom Quellenordner in den Ausgabeordner kopiert. So liegt es im Build-Context.

Ausführung Docker-Build


Docker File:
Ausgabeordner/Dockerfile

Image Name:
User/Repo/Build-ID

Optional:
Include Latest Tag

Docker Registry Connection


Verwendung
  • Abruf privater Images
  • Push von erstellten Images


Neben dem Docker Hub kann auch eine private Registry verbunden werden.

Push zum Docker

Container Registry Type:
  • Container Registry (Docker)
  • Azure Container Registry


Docker Registry Connection:
neu erstellen / bestehende wählen

Imagename: siehe Build-Einstellung

Optional: Include Latest Tag

Bereinigung der erstellten Images


Löschen von Images ist keine vordefinierte Aktion deshalb generische Aktion Run a Docker Command wählen.

Befehl:
rmi user/repo/build-ID user/repo:latest

Docker Swarm / Docker Swarm Mode

Container-Cluster über mehrere Docker-Hosts

Docker Swarm Visualizer

Das Tool Docker Swarm Visualizer gestattet eine Übersicht der laufenden Services und Hosts.

Lizenz: Apache GitHub

Verfügbare Container:

Docker Swarm

Cluster / Swarm initalisieren

docker swarm init [OPTIONS] 

Nach erfolgreicher Erstellung werden der Token und Befehl zum Hinzufügen angezeigt.

Knoten hinzufügen

docker swarm join [OPTIONS] HOST:PORT

-- token Zugriffstoken

Knoten entfernen

docker swarm leave [OPTIONS]

--force, -f Erzwingt das Verlassung und ignoriert Warnungen WICHTIG: die Node muss noch mein Manager abgemeldet werden!

Zugriffstoken anzeigen

docker swarm join-token [OPTIONS] (worker|manager)

Cluster / Swarm aktualsieren

docker swarm Update [OPTIONS]

Docker Node

Knoten anzeigen

docker node ls [OPTIONS]

Detailierte Informationen zu / zum Knoten anzeigen

docker node inspect [OPTIONS] self|NODE 

Aufgaben / Prozesse eines Knoten anzeigen

docker node ps [OPTIONS] [NODE] 

Knoten aus dem Cluster entfernen

docker node rm [OPTIONS] Node

Knoten vom Worker zum Manager heraufstufen

docker node promote NODE

Knoten vom Manager zum Worker herabstufen

docker node demote NODE

Docker Swarm - Services

Anwendungen die Cluster bereitgestellt werden, werden als Services bezeichnet. Um den Service auf mehreren Nodes bereitzustellen, muss das Image in einer Registry abgelegt sein.

Service erstellen

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
--name Name für den Service
--network Verwendetes Netzwerk
--publish, -p Veröffentlicht den Port
--replicas Zahl der gleichzeitig laufenden Instanzen

Services entfernen

docker service rm SERVICE

Services anzeigen

docker service ls [OPTIONS] 

Details zu / zum Services anzeigen

docker service inspect [OPTIONS] SERVICE

Services hoch/runter skalieren

docker service scale SERVICE=ANZAHL

Logs eines Services anzeinge

docker service logs [OPTIONS] SERVICE

Docker Swarm mit
Docker-Compose / Docker-Stack

Docker-Stack ist Teil des Docker-Engine selbst.
Docker-Compose muss u.a. unter Linux manuell installiert werden.

Die Dateistruktur ist ab identisch (V3+). Docker-Compose ignorierte bestimmte Einstellungen.

Docker-Stack kann nur auf einem Docker-Host der Teil eines Swarm (Cluster) ist ausgeführt werden.

Stack bereitstellen

docker stack deploy [OPTIONS] STACK
-compose-file , -c Name / Pfad zum Compose-File

Stack entfernen

docker stack rm STACK

Stacks anzeigen

docker stack ls

Services eines Stacks anzeigen

docker stack services [OPTIONS] STACK

Docker Swarm auf ARM

u.a. Raspberry PI 3

Installation

Hypriot OS

Hypriot OS ist eine spezielle Distribution für Docker auf ARM-Geräte. Sie war bereits vor dem offiziellen Support durch Docker verfügbar.

Raspbian Jessie Lite

Docker unterstützt nun die ARM-Plattform offiziell. Es kann deshalb auf der Distribution Raspbian der Raspberry Foundation installiert werden.
curl -sSL get.docker.com | sh
sudo usermod -aG docker pi
sudo systemctl enable docker
sudo systemctl start docker

Multiarchitektur

Docker-Swarm verknüpft verschiedene Architekturen:
  • x64 / ARM
  • Linux / Windows


Über Label können die Knoten gekennzeichnet werden. Informationen wie das OS bzw. die CPU-Architektur sind bereits vorhanden.

Label setzen

docker node update --label-add KEY[=VALUE]

Label entfernen

docker node update --label-rm KEY

Einschränkungen

Service-Defintion

docker service create --name myservice 
--constraint 'node.labels.type == web' myimage:latest 

Stack-Definition (Compose-File)


version: "3.2"
services:
   myservice:
     image: myimage:latest
     deploy:
        placement:
           constraints:
              - 'node.role == manager'
              - 'node.platform.os == linux'
              - 'node.labels.type == web'

Serverless Computing mit OPENFASS

Grundlagen und Architektur

  • Framework für Serverless Functions
  • Open source GitHub
  • Integriertes Portal (UI) für Deployment / Test
  • Ausführung auf Docker Swarm oder Kubernetes
  • Skalierbar
  • Verwendung diverser Programmiersprachen GO, node.js, .NET ...


Die Funktionen erhalten die Anfragen per HTTP POST und Port 8080.

Architektur

Function Watchdog

  • kleiner HTTP-Server
  • geschrieben in Golong
  • erlaubt die Nutzung jedes Consolen-Programmes als Funktion
  • Sendet HTTP-Anfrage an STDIN (Consolen Eingaben) des Zielprogramms
  • Empfängt STDOUT (Consolen Ausgabe) und sendet sie per HTTP

Serverless Computing mit OPENFASS

Funktionsentwicklung mit .NET Core / node.js

.NET Core

  • ASP.NET Core WebAPI
  • NancyFX


node.js

  • HTTP-Modul
  • express.js

Serverless Computing mit OPENFASS

Funktionen für Amazon Alexa

Architektur

Anlegen Entwickler-Zugang

https://developer.amazon.com/de/

Starten: ALEXA > Getting Started

Skill bearbeiten / neu erstellen

Allgemeine Informationen

Erstellung:
  • Type
  • Sprache


Erstellung / Bearbeitung:
  • Name
  • Aufruf

Interaction Modell

Befehle (Intent Schema)
Wichtig: auch Standardbefehle z.B. Hilfe vorsehen
Optional: Defintion von Platzhaltern / Variablen (Slots)
{
"intents":
  [
    {  "intent": "greeting"  },
    {  "intent": "sendoff"
       "slots": [{
        "name": "NextMeetup", 
        "type": "AMAZON.DATE"
	  }] 	 
	},
    {  "intent": "AMAZON.HelpIntent"  },
    {  "intent": "AMAZON.StopIntent"  }
  ]  
}

Zuordnung Aufruf-Befehl (Sample Uterances)

greeting sag hallo
greeting beginne treffen
breaknow pause
sendoff sag auf wiedersehen
sendoff beende treffen
sendoff schluss jetzt

Definition Variablentypen (Custom Slot Types) - Optional

Globale Einstellungen z.B. Endpunkt

Endpunkt muss verschlüsselte Kommunikation (HTTPS) unterstützen.

SSL-Zertifikat für Endpunkt

  • Zertifikat für definierten Endpunkt (auch Let's Encrypt möglich)
  • Wild Card Zertifikat z.B. von Thawte
  • Selbst-signiertes Zertifikat

Testen

Function-Entwicklung (Auswahl)

node.js: alexa-skills-kit-sdk-for-nodejs (Offiziell)

.NET: alexa-skills-dotnet (Community)

Manuell auf Basis des json-Schema

Ressourcen

https://developer.amazon.com/de/docs/custom-skills/request-and-response-json-reference.html

Bilder

https://cakebuild.net/assets/img/logo.png