Kubernetes i Docker, Wytłumacz mi

Cezary Walenciuk

Kubernetes i Docker
Wytłumacz mi i pokaż

@walenciukC

Speaker
To 16 webinar w tym roku, a zacząłem robić to w Czerwcu
6 Jaki ja problem widzę, z Kubernetesem i Dockerem
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Na co jak k###wa patrze
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Oglądasz jakiś potem tutorial na YT
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © Cezary Walenciuk
Wielki Skrót
blog
Copyright © 2020 Cezary Walenciuk
blog
Copyright © 2020 Cezary Walenciuk
blog
Copyright © 2020 Cezary Walenciuk

Jak to wygląda ? Jeśli mówimy tylko o Docker

blog
Copyright © 2020 Cezary Walenciuk

Jak to wygląda ? Jeśli mówimy o Kubernetesie

Docker tworzy obraz
Uruchomiony obraz to kontener
Co to oznacza, że aplikacja jest skonteneryzowana
Zamiast gadać to lepiej to pokazać
Warto zaznaczyć, że Kubernetes potrafi także uruchamiać wirtualne maszyny nie tylko kontenery

Po co to? Jak to w chmurze ?

Infrastruktura to teraz twój problem

Infrastruktura

Infrastruktura

Zalety kontenerów

Zalety kontenerów

Przyspieszenie pracy

Zalety kontenerów

Przyspieszenie pracy

Wyeliminowanie konfliktów

Zalety kontenerów

Przyspieszenie pracy

Wyeliminowanie konfliktów

Spójne środowiska

Zalety kontenerów

Przyspieszenie pracy

Wyeliminowanie konfliktów

Spójne środowiska

Dostarczanie aplikacji szybciej

Inne zalety

Zbuduj raz
Zrób deploy wszędzie
Kontener kontra maszyna wirtualna
https://blog.netapp.com/blogs/containers-vs-vms/
Copyright © 2020 https://blog.netapp.com/blogs/containers-vs-vms/

Kontener kontra maszyna wirtualna

Przpadki użycia

Emulowanie produkcji

Przpadki użycia

Emulowanie produkcji
Środowisko na Testy
end-to-end

Przpadki użycia

Emulowanie produkcji
Środowisko na Testy
end-to-end
Sekrety/Konfiguracje
gotowe mechanizmy

Przpadki użycia

Emulowanie produkcji
Środowisko na Testy
end-to-end
Sekrety/Konfiguracje
gotowe mechanizmy
Pewność, że aplikacja
skaluje się poprawnie

Przpadki użycia

Emulowanie produkcji
Środowisko na Testy
end-to-end
Sekrety/Konfiguracje
gotowe mechanizmy
Pewność, że aplikacja
skaluje się poprawnie
Testy
wydajnościowe

Przpadki użycia

Emulowanie produkcji
Środowisko na Testy
end-to-end
Sekrety/Konfiguracje
gotowe mechanizmy
Pewność, że aplikacja
skaluje się poprawnie
Testy
wydajnościowe
Pomoc dla Adminów
aby programiści stali się
DEV-OPS

Przpadki użycia

Emulowanie produkcji
Środowisko na Testy
end-to-end
Sekrety/Konfiguracje
gotowe mechanizmy
Pewność, że aplikacja
skaluje się poprawnie
Testy
wydajnościowe
Pomoc dla Adminów
aby programiści stali się
DEV-OPS
Ciekawe strategie
wdrażania aplikacji

Przpadki użycia

Emulowanie produkcji
Środowisko na Testy
end-to-end
Sekrety/Konfiguracje
gotowe mechanizmy
Pewność, że aplikacja
skaluje się poprawnie
Testy
wydajnościowe
Pomoc dla Adminów
aby programiści stali się
DEV-OPS
Ciekawe strategie
wdrażania aplikacji
Migracja
do chmury

Przpadki użycia

Emulowanie produkcji
Środowisko na Testy
end-to-end
Sekrety/Konfiguracje
gotowe mechanizmy
Pewność, że aplikacja
skaluje się poprawnie
Testy
wydajnościowe
Pomoc dla Adminów
aby programiści stali się
DEV-OPS
Ciekawe strategie
wdrażania aplikacji
Migracja
do chmury
Scenariusze do
CI/CD
Docker, Kubernetes czyli polityka

Obie firmy się nie lubią

blog
Copyright © 2020 Diagram

Złe wiadomości

Jakie mamy jeszcze alternatyw do Dockera jeżeli chodzi o obsługę obrazów

blog
Copyright © 2020 Diagram

Jakie mamy jeszcze alternatyw do Dockera jeżeli chodzi o budowanie obrazów

blog
Copyright © 2020 Diagram
Co trzeba mieć, aby zainstalować Dockera na swojej maszynie

W przypadku Windows

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zbudujmy coś
Zbudujmy statyczną stronę na serwerze Apache
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Dockerfile file dla statycznych plików

                    
                        FROM httpd:2.4

                        COPY ./index.html /usr/local/apache2/htdocs/index.html
                        COPY ./bakcground.jpg /usr/local/apache2/htdocs/bakcground.jpg
                        COPY ./wordart.png /usr/local/apache2/htdocs/wordart.png
                    
                

Dockerfile file dla statycznych plików

                    
                        FROM httpd:2.4

                        COPY ./* /usr/local/apache2/htdocs/
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Swoją drogą używanie Dockera/Kubernetesa do statycznych plików to idiotyzm

Co konteryzować?

Co nie konteryzować?

Problemy z budowaniem obrazu ?
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Po co są tagi ?
blog
Copyright © 2020 Diagram
Czy mogę wybrać inny port?
blog
Copyright © 2020 Diagram
Zbudujmy aplikację Go
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

go.mod

                    
                        module helloapp

                        go 1.15
                    
                

main.go

                    
                        package main 

                        import (
                            "fmt"
                            "log"
                            "net/http"
                        )
                        
                        func handler(w http.ResponseWriter, r *http.Request) {
                        
                            fmt.Fprintln(w, "Cześć");
                        }
                        
                        func main() {
                            http.HandleFunc("/",handler)
                            fmt.Println("server started")
                            log.Fatal(http.ListenAndServe(":8090", nil))
                        }
                    
                

Dockerfile

                    
                        FROM golang:latest

                        #ustawia pracujący folder
                        WORKDIR /helloApp
                        
                        #kopiuje to pliki na kontener
                        ADD . .
                        
                        #budujemy aplikacje
                        RUN go build -o main .
                        
                        EXPOSE 8090
                        
                        CMD ["/helloApp/main"]
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Argumenty

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Co można zrobić lepiej?

Co można zrobić lepiej?

Dockerfile fixed

                    
                        FROM golang:1.13-alpine AS build

                        #ustawia pracujący folder
                        WORKDIR /src
                        
                        COPY main*.go go.* ./
                        
                        #budujemy aplikacje
                        RUN CGO_ENABLED=0 go build -o /bin/example2_2
                        
                        FROM scratch
                        COPY --from=build /bin/example2_2 /bin/example2_2
                        
                        EXPOSE 8090
                        
                        CMD ["/bin/example2_2"]
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zbudujmy obraz .NET Core 3.1
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Program.cs

                    

                        class Program
                        {
                            static async Task Main(string[] args)
                            {
                                var counter = 0;
                                var max = args.Length != 0 
                                ? Convert.ToInt32(args[0]) : -1;

                                while (max == -1 || counter < max)
                                {
                                    
                                    Console.WriteLine($"Counter: {++counter}");
                                    await Task.Delay(1000);
                                }
                            }
                        }
                    
                

Byle jaki Docker file dla .NET Core 3.1

                    
                        FROM mcr.microsoft.com/dotnet/aspnet:3.1
                        
                        COPY bin/Release/netcoreapp3.1/publish/ App/
                        WORKDIR /App
                        ENTRYPOINT ["dotnet", "NetCore.DockerTest.dll"]
                    
                

Ten docker file zakłada

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zobaczmy jak zrobić dobry docker file dla .NET Core
Przykład .NET na tym GitHub
https://github.com/dotnet/dotnet-docker
blog
Copyright © 2020 Diagram

Dobry Docker file dla ASP.NET CORE for .Net 5

                    

                        # https://hub.docker.com/_/microsoft-dotnet
                        FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
                        WORKDIR /source
                        
                        # copy csproj and restore as distinct layers
                        COPY *.sln .
                        COPY aspnetapp/*.csproj ./aspnetapp/
                        RUN dotnet restore
                        
                        # copy everything else and build app
                        COPY aspnetapp/. ./aspnetapp/
                        WORKDIR /source/aspnetapp
                        RUN dotnet publish -c release -o /app --no-restore
                        
                        # final stage/image
                        FROM mcr.microsoft.com/dotnet/aspnet:5.0
                        WORKDIR /app
                        COPY --from=build /app ./
                        ENTRYPOINT ["dotnet", "aspnetapp.dll"]
                    
                

blog
Copyright © 2020 Diagram

Docker file dla kilku aplikacji w projekcie

                    
                        # https://hub.docker.com/_/microsoft-dotnet
                        FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
                        WORKDIR /source
                        
                        # copy csproj and restore as distinct layers
                        COPY complexapp/*.csproj complexapp/
                        COPY libfoo/*.csproj libfoo/
                        COPY libbar/*.csproj libbar/
                        RUN dotnet restore complexapp/complexapp.csproj
                        
                        # copy and build app and libraries
                        COPY complexapp/ complexapp/
                        COPY libfoo/ libfoo/
                        COPY libbar/ libbar/
                        WORKDIR /source/complexapp
                        RUN dotnet build -c release --no-restore
                        
                        # test stage -- exposes optional entrypoint
                        # target entrypoint with: docker build --target test
                        FROM build AS test
                        WORKDIR /source/tests
                        COPY tests/ .
                        ENTRYPOINT ["dotnet", "test", "--logger:trx"]
                        
                        FROM build AS publish
                        RUN dotnet publish -c release --no-build -o /app
                        
                        # final stage/image
                        FROM mcr.microsoft.com/dotnet/runtime:5.0
                        WORKDIR /app
                        COPY --from=publish /app .
                        ENTRYPOINT ["dotnet", "complexapp.dll"]
                    
                

Zbudujmy obraz Java Spring
..ale zaraz ja nie znam Javy xD
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

DemoApplication.java

                    
                        package com.example.demo;

                        import org.springframework.boot.SpringApplication;
                        import org.springframework.boot.autoconfigure.SpringBootApplication;
                        
                        @SpringBootApplication
                        public class DemoApplication {
                        
                            public static void main(String[] args) {
                                SpringApplication.run(DemoApplication.class, args);
                            }
                        
                        }
                        
                    
                

HelloController.java

                    
                        package com.example.demo;

                        import org.springframework.web.bind.annotation.RestController;
                        import org.springframework.web.bind.annotation.RequestMapping;
                        
                        @RestController
                        public class HelloController {
                        
                            @RequestMapping("/")
                            public String index() {
                                return "Pozdrowienia z Spring Boot!";
                            }
                        
                        }
                    
                

Docker file for Java Spring

                    
                        #pierwszy etap budowania aplikacji użyje obrazu rodzica maven 3.6.1
                        FROM maven:3.6.1-jdk-8-alpine AS MAVEN_BUILD 

                        # kopiowanie pom i src do kontenera
                        COPY ./ ./  

                        # pakowanie kodu naszej aplikacji
                        RUN mvn clean package 

                        #drugi etap budowania aplikacji używając jdk 8 na alpine 3.9
                        FROM openjdk:8-jre-alpine3.9 

                        # skopiuj tylko to co potrzebujemy z pierwszego etapu, a wszystko inne odrzuć
                        COPY --from=MAVEN_BUILD /target/demo-0.0.1-SNAPSHOT.jar /demo.jar 

                        # ustaw polecenie startowe aby uruchomić JAR
                        CMD ["java", "-jar", "/demo.jar"]
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zbudujmy obraz Python
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Docker file for Python

                    
                        FROM python:3

                        ADD my_script.py /
                        
                        RUN pip install pystrich
                        
                        CMD [ "python", "./my_script.py" ]
                    
                

myscript.py

                    
                        from pystrich.datamatrix import DataMatrixEncoder

                        encoder = DataMatrixEncoder('This is a DataMatrix.')
                        encoder.save('./datamatrix_test.png')
                        print(encoder.get_ascii())
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Przykład dobrego dockerfile na podstawie NodeJS
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
1 . Kolejność instrukcji czyli co warto wsadzić w cache
blog
Copyright © 2020 Diagram
2 . Bardziej specyficzne kopiowanie
blog
Copyright © 2020 Diagram
3 . Łączenie poleceń
blog
Copyright © 2020 Diagram
4 . Usuń zbędne rzeczy
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
5. Ustal konkretną wersje obrazu i wbierz najmniejszą
blog
Copyright © 2020 Diagram

Podsumowanie Docker

Podsumowanie Docker

Pogadajmy o Kubernetes

Kubernetes

Kubernetes. Po co ?

Zalety Kubernetes

Zalety Kubernetes

Sterowanie kontenerami

Zalety Kubernetes

Sterowanie kontenerami

Zero Downtime Deployments

Zalety Kubernetes

Sterowanie kontenerami

Zero Downtime Deployments

Potrafi się naprawiać samoistnie

Zalety Kubernetes

Sterowanie kontenerami

Zero Downtime Deployments

Potrafi się naprawiać samoistnie

Skalowanie kontenerów

Architektura Kubernetes
Master Node
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Tak to wygląda w dużym skrócie
Czym jest ta paczka?
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Kubernetes nie uruchami gołych kontenerów/obrazów
blog
Copyright © 2020 Diagram
Tylko teraz jeśli chcemy skalowanie i samoleczenie to...opakowujemy to w
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Jak to wszystko deifnujemy?
W jakim pliku
blog
Copyright © 2020 Diagram
Wejdźmy głębiej
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Node
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Dekleratywny styl i stan obserwowany
Dekleratywny model :
opisujesz w pliku jaki stan jest porządany
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Pody (kubeletes)
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Dlaczego tak nie robić?
Ciężko to się skaluje w chmurze
Pody i Sieć
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zbudujmy Coś
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Docker file dla ASP.NET CORE For .Net 5

                    
                        FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
                        WORKDIR /app
                        EXPOSE 90
                        EXPOSE 443
                        ENV ASPNETCORE_URLS=http://+:90
                        
                        FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
                        WORKDIR /src
                        COPY ["myaspnetcorefornet5service.csproj", ""]
                        RUN dotnet restore "./myaspnetcorefornet5service.csproj"
                        COPY . .
                        WORKDIR "/src/."
                        RUN dotnet build "myaspnetcorefornet5service.csproj" -c Release -o /app/build
                        
                        FROM build AS publish
                        RUN dotnet publish "myaspnetcorefornet5service.csproj" -c Release -o /app/publish
                        
                        FROM base AS final
                        WORKDIR /app
                        COPY --from=publish /app/publish .
                        ENTRYPOINT ["dotnet", "myaspnetcorefornet5service.dll"]
                    
                

IndexController

                    
                        [ApiController]
                        [Route("/")]
                        private readonly ILogger<IndexController> _logger;
                    
                        public IndexController(ILogger<IndexController> logger)
                        {
                            _logger = logger;
                        }
                                            
                        [HttpGet]
                        public string Index()
                        {
                            return "Hello from My AspNetCore For Net 5 Service";
                        }
                    
                

Node JS

                    
                        const express = require("express");
                        const app = express();
                        
                        app.listen(1111, function () {
                          console.log("listening on 1111");
                        });
                        
                        app.get("/", (req, res) => {
                          res.send("Hejka z Node JS");
                        });
                    
                

Docker file dla Node Js

                    
                        FROM node:13

                        WORKDIR /app
                        
                        COPY package.json /app
                        
                        RUN npm install
                        
                        COPY . /app
                        
                        CMD node server.js
                        
                        EXPOSE 1111
                    
                

Zanim zaczniemy warto powiedzieć coś kontekstach
Czyli jakie masz problemy gdy robisz 3 tutoriale na raz
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Plik pod-dotnet.yaml

                    
                        apiVersion: v1
                        kind: Pod
                        metadata:
                        name: happylittledotnetpod
                        labels:
                            name: happylittleapp
                        spec:
                        containers:
                        - name: dotnetservice
                            image: myaspnetcorefornet5service
                            imagePullPolicy: IfNotPresent
                            ports :
                            - containerPort: 90
                            resources:
                                limits:
                                cpu: 1000m
                                memory: 1Gi
                                requests:
                                cpu: 500m
                                memory: 1Gi
                    
                

Plik pod-node.yaml

                    
                        apiVersion: v1
                        kind: Pod
                        metadata:
                        name: happylittlenodepod
                        labels:
                            name: happylittleapp
                        spec:
                        containers:
                        - name: nodeservice
                            image: mynodeservice
                            imagePullPolicy: IfNotPresent
                            ports :
                            - containerPort: 1111
                            resources:
                                limits:
                                cpu: 1000m
                                memory: 1Gi
                                requests:
                                cpu: 500m
                                memory: 1Gi
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Co ja właściwie zrobiłem ?
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
W sumie to nikt nie tworzy gołych podów
Potrzebujemy pośrednika sieciowego
blog
Copyright © 2020 Diagram

Serwisy?

Utwórzmy definicję deployment-u
Z tej definicj utworzymy dwa róźne serwisy

Jakie serwisy do komunikowania mamy?

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Plik dep-service-node.yaml

                    
                        apiVersion: apps/v1
                        kind: Deployment
                        metadata:
                        name: happy-hello-world-node
                        spec:
                        selector:
                            matchLabels:
                            app: happylittleapp
                        template:
                            metadata:
                            labels:
                                app: happylittleapp
                            spec:
                            containers:
                            - name: nodeservice
                                image: mynodeservice
                                imagePullPolicy: IfNotPresent
                                ports:
                                - containerPort: 1111
                                resources:
                                limits:
                                    cpu: 1000m
                                    memory: 1Gi
                                requests:
                                    cpu: 500m
                                    memory: 1Gi
                    
                

Plik dep-service-donet.yaml

                    
                        apiVersion: apps/v1
                        kind: Deployment
                        metadata:
                        name: happy-hello-world-donet
                        spec:
                        selector:
                            matchLabels:
                            app: happylittleapp
                        template:
                            metadata:
                            labels:
                                app: happylittleapp
                            spec:
                            containers:
                            - name: dotnetservice
                                image: myaspnetcorefornet5service
                                imagePullPolicy: IfNotPresent
                                ports:
                                - containerPort: 90
                                resources:
                                limits:
                                    cpu: 1000m
                                    memory: 1Gi
                                requests:
                                    cpu: 500m
                                    memory: 1Gi
                    
                

Swoją drogą utworzy to nowe Pody i opakuje to w deployment
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Teraz utwórzmy nodeport na postawie definicji deployment
Bez pliku YAML czyli imperatywnie
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Zaraz to chcesz mi powiedzieć, że wszystko w Kuberentes jest konterem w kontenerze
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Co jeśli chciałbyś zobaczyć Pody do celów testowych?
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Możesz jeszcze zobaczyć swoje usługi w inny sposób
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Utwórzmy load balancer na podstawie deployment, który wystawi naszą aplikacje na świat
Bez pliku YAML czyli imperatywnie
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Co jeśli chce inne porty
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Co jeśli chce to skalować 🤔
blog
Copyright © 2020 Diagram

Plik dep-service-dotnet copy.yaml

                    
                        apiVersion: apps/v1
                        kind: Deployment
                        metadata:
                          name: happy-hello-world-donet
                        spec:
                          replicas: 3
                          selector:
                            matchLabels:
                              app: happylittleapp
                          template:
                            metadata:
                              labels:
                                app: happylittleapp
                            spec:
                              containers:
                              - name: dotnetservice
                                image: myaspnetcorefornet5service
                                imagePullPolicy: IfNotPresent
                                ports:
                                  - containerPort: 90
                                resources:
                                  limits:
                                    cpu: 1000m
                                    memory: 1Gi
                                  requests:
                                    cpu: 500m
                                    memory: 1Gi
                    
                

Plik dep-service-node copy.yaml

                    
                        apiVersion: apps/v1
                        kind: Deployment
                        metadata:
                          name: happy-hello-world-node
                        spec:
                          replicas: 3
                          selector:
                            matchLabels:
                              app: happylittleapp
                          template:
                            metadata:
                              labels:
                                app: happylittleapp
                            spec:
                              containers:
                              - name: nodeservice
                                image: mynodeservice
                                imagePullPolicy: IfNotPresent
                                ports:
                                  - containerPort: 1111
                                resources:
                                  limits:
                                    cpu: 1000m
                                    memory: 1Gi
                                  requests:
                                    cpu: 500m
                                    memory: 1Gi
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Sekrety czyli konfiguracje
Potrzebujemy kolejnego przykładu
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

Docker file dla przykładu z sekretami

                    
                        FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
                        WORKDIR /app
                        EXPOSE 5555
                        EXPOSE 443
                        ENV ASPNETCORE_URLS=http://+:5555
                        
                        FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
                        WORKDIR /src
                        COPY ["aspnet-core-secrets.csproj", ""]
                        RUN dotnet restore "./aspnet-core-secrets.csproj"
                        COPY . .
                        WORKDIR "/src/."
                        RUN dotnet build "aspnet-core-secrets.csproj" -c Release -o /app/build
                        
                        FROM build AS publish
                        RUN dotnet publish "aspnet-core-secrets.csproj" -c Release -o /app/publish
                        
                        FROM base AS final
                        WORKDIR /app
                        COPY --from=publish /app/publish .
                        ENTRYPOINT ["dotnet", "aspnet-core-secrets.dll"]
                    
                

ASP.NET CORE

                    
                        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
                        {
                            var builder = new ConfigurationBuilder()
                                .SetBasePath(env.ContentRootPath)
                                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                                .AddJsonFile("secrets/appsettings.secrets.json", optional: true, reloadOnChange: true)
                                .AddEnvironmentVariables();
                
                            Configuration = builder.Build();
                
                            if (env.IsDevelopment())
                            {
                                app.UseDeveloperExceptionPage();
                            }
                
                            app.Run(async (context) =>
                            {
                                var message = $"Host: {Environment.MachineName}\n" +
                                    $"EnvironmentName: {env.EnvironmentName}\n" +
                                    $"Secret value: {Configuration["Database:ConnectionString"]}\n" +
                                    $"Secret value: {Configuration["Database:Password"]}";
                                await context.Response.WriteAsync(message);
                            });
                        }
                    
                

appsettings.json

                    
                        {
                            "Database": {
                                "ConnectionString": "lokalny connection string",
                                "Password": "Lokalne Haslo"
                            }
                        }
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

appsettings.secrets.json

                    
                        {
                            "Database": {
                              "ConnectionString": "SEKRETNE connection string",
                              "Password": "SEKRETNE Haslo"
                            }
                        }
                    
                

blog
Copyright © 2020 Diagram

deployment.yaml

                    
                        apiVersion: apps/v1
                        kind: Deployment
                        metadata:
                        name: aspnet-core-secrets-demo
                        spec:
                        replicas: 3
                        selector:
                            matchLabels:
                            app: aspnet-core-secrets-demo
                        template:
                            metadata:
                            labels:
                                app: aspnet-core-secrets-demo
                            spec:
                            containers:
                            - name: aspnet-core-secrets-demo
                                image: aspnet-core-secrets:coolest
                                ports:
                                - containerPort: 5555
                                env:
                                - name: "ASPNETCORE_ENVIRONMENT"
                                value: "Kubernetes"
                                volumeMounts:
                                - name: secrets
                                mountPath: /app/secrets
                                readOnly: true
                            volumes:
                            - name: secrets
                                secret:
                                secretName: secret-appsettings
                    
                

deployment.yaml ZOOM

                    
                        apiVersion: apps/v1
                        kind: Deployment
                        metadata:
                        name: aspnet-core-secrets-demo
                        spec:
                        replicas: 3
                    
                

deployment.yaml ZOOM

                
                          containers:
                          - name: aspnet-core-secrets-demo
                            image: aspnet-core-secrets:coolest
                            ports:
                            - containerPort: 5555
                            env:
                            - name: "ASPNETCORE_ENVIRONMENT"
                              value: "Kubernetes"
                            volumeMounts:
                            - name: secrets
                              mountPath: /app/secrets
                              readOnly: true
                          volumes:
                          - name: secrets
                            secret:
                              secretName: secret-appsettings
                
            

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram

service.yaml

                    
                        apiVersion: v1
                        kind: Service
                        metadata:
                          name: aspnet-core-secrets-demo-service
                        spec:
                          selector:
                            app: aspnet-core-secrets-demo
                          ports:
                          - protocol: TCP
                            port: 5555
                            targetPort: 5555
                          type: LoadBalancer
                    
                

blog
Copyright © 2020 Diagram
blog
Copyright © 2020 Diagram
Jak dodać alias do PowerShell-a?
blog
Copyright © 2020 Diagram
kubectl-aliases-powershell
https://github.com/shanoor/kubectl-aliases-powershell
blog
Copyright © 2020 Diagram
Warto pouczyć się basha i Pythona
Jak się uczyć Kubernetesa ?
blog
Copyright © 2020 Diagram
Odradzam ćwiczenie na chmurze
blog
Copyright © 2020 Diagram
Play with Kubernetes
https://labs.play-with-k8s.com/#
blog
Copyright © 2020 Diagram
Dzięki, że jesteś
blog
Copyright © Cezary Walenciuk
Podsumowanie roku i wasze pytania