Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
redhat:openshift-redhat:openshift-labs:docker-image-openshift [2018/07/11 11:33] – created michael | redhat:openshift-redhat:openshift-labs:docker-image-openshift [2018/07/11 15:39] (current) – [Lab 3: Ein Docker Image deployen] michael | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Lab 3: Ein Docker Image deployen ====== | ====== Lab 3: Ein Docker Image deployen ====== | ||
- | In diesem Lab werden wir das erste " | + | {{fa> |
+ | |||
+ | ===== Aufgabe: LAB 3.1 ===== | ||
+ | Nachdem wir im Lab 2 den Source-to-Image Workflow verwendet haben, um eine Applikation auf OpenShift zu deployen, wenden wir uns nun dem Deployen eines pre-built Docker Images von Docker Hub oder einer anderen Docker-Registry widmen. | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | Als ersten Schritt, erstellen wir dazu ein neues Projekt. Ein Projekt ist wie schon in der Einführung beschrieben, | ||
+ | |||
+ | Wir erstellen nun daher ein neues Projekt mit dem Namen [DEINNAME]-dockerimage: | ||
+ | |||
+ | < | ||
+ | # oc new-project [DEINNAME]-dockerimage | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | <WRAP center round important 100%> | ||
+ | '' | ||
+ | < | ||
+ | # oc get project | ||
+ | </ | ||
+ | '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | Sobald das neue Projekt erstellt wurde, wird dies auch gleich als aktuell aktives Projekt gewählt. Wir können nun also nun in OpenShift mit dem folgenden Befehl das Docker Image so direkt in das richtige Projekt deployen: | ||
+ | |||
+ | <WRAP center box 100%> | ||
+ | < | ||
+ | # oc new-app appuio/ | ||
+ | </ | ||
+ | |||
+ | <sxh plain; gutter: false;> | ||
+ | --> Found Docker image d790313 (3 weeks old) from Docker Hub for " | ||
+ | |||
+ | APPUiO Spring Boot App | ||
+ | ---------------------- | ||
+ | Example Spring Boot App | ||
+ | |||
+ | Tags: builder, springboot | ||
+ | |||
+ | * An image stream will be created as " | ||
+ | * This image will be deployed in deployment config " | ||
+ | * Port 8080/tcp will be load balanced by service " | ||
+ | * Other containers can access this service through the hostname " | ||
+ | |||
+ | --> Creating resources with label app=example-spring-boot ... | ||
+ | imagestream " | ||
+ | deploymentconfig " | ||
+ | service " | ||
+ | --> Success | ||
+ | Run 'oc status' | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | Für das Lab verwenden wir ein APPUiO-Beispiel (Java Spring Boot Applikation): | ||
+ | |||
+ | * Docker Hub: https:// | ||
+ | * GitHub (Source): https:// | ||
+ | |||
+ | OpenShift legt die nötigen Ressourcen an, lädt das Docker Image in diesem Fall von Docker Hub herunter und deployt anschliessend den ensprechenden Pod. | ||
+ | |||
+ | **Tipp**: Verwende '' | ||
+ | |||
+ | Oder verwende den '' | ||
+ | |||
+ | < | ||
+ | # oc get pods -w | ||
+ | </ | ||
+ | |||
+ | Je nach Internetverbindung oder abhängig davon, ob das Image auf dem OpenShift Node bereits heruntergeladen wurde, kann das eine Weile dauern. Schaue dir dabei doch in der Web Console den aktuellen Status des Deployments an: | ||
+ | |||
+ | - Logge dich in der Web Console ein | ||
+ | - Wähle das Projekt [DEINNAME]-dockerimage aus | ||
+ | - Klicke auf Applications | ||
+ | - Wähle Pods aus | ||
+ | |||
+ | <wrap em> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | ===== Betrachten der soeben erstellten Ressourcen ===== | ||
+ | |||
+ | Als wir '' | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | ==== Service ==== | ||
+ | |||
+ | Die Services dienen innerhalb OpenShift als Abstraktionslayer, | ||
+ | |||
+ | **Als Beispiel**: Wenn eine Applikationsinstanz unseres Beispiels die Last nicht mehr alleine verarbeiten kann, können wir die Applikation bspw. auf drei Pods hochskalieren. OpenShift mapt diese als Endpoints automatisch zum Service. Sobald die Pods bereit sind, werden Requests automatisch auf alle drei Pods verteilt. | ||
+ | |||
+ | **Note**: Die Applikation kann aktuell von aussen noch nicht erreicht werden, der Service ist ein OpenShift-internes Konzept. //Erst im nachfolgenden Lab (Lab4) werden wir unsere Applikation öffentlich verfügbar machen.// | ||
+ | |||
+ | Nun schauen wir uns unseren Service mal etwas genauer an: | ||
+ | |||
+ | <WRAP center box 100%> | ||
+ | |||
+ | < | ||
+ | # oc get services | ||
+ | </ | ||
+ | |||
+ | <sxh plain; gutter: false;> | ||
+ | NAME CLUSTER-IP | ||
+ | example-spring-boot | ||
+ | Wie Sie am Output sehen, ist unser Service (example-spring-boot) über eine IP und Port erreichbar (172.30.124.20: | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | Mit dem folgenden Befehl können zusätzliche Informationen über den Service ausgelesenen werden: | ||
+ | |||
+ | <WRAP center box 100%> | ||
+ | |||
+ | < | ||
+ | # oc get service example-spring-boot -o json | ||
+ | </ | ||
+ | |||
+ | <sxh plain; gutter: false;> | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Mit dem entsprechenden Befehl können auch die Details zu einem Pod angezeigt werden: | ||
+ | |||
+ | < | ||
+ | # oc get pod example-spring-boot-3-nwzku -o json | ||
+ | </ | ||
+ | |||
+ | <wrap em> | ||
+ | |||
+ | Über den selector Bereich im Service wird definiert, welche Pods (labels) als Endpoints dienen. Dazu die entsprechenden Konfigurationen vom Service und Pod zusammen betrachten. | ||
+ | |||
+ | <sxh plain; gutter: false;> | ||
+ | Service: | ||
+ | -------- | ||
+ | ... | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | |||
+ | ... | ||
+ | |||
+ | Pod: | ||
+ | ---- | ||
+ | ... | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }, | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Diese Verknüpfung ist mittels dem '' | ||
+ | |||
+ | <WRAP center box 100%> | ||
+ | |||
+ | < | ||
+ | # oc describe service example-spring-boot | ||
+ | </ | ||
+ | |||
+ | <sxh plain; gutter: false;> | ||
+ | Name: | ||
+ | Namespace: | ||
+ | Labels: | ||
+ | Selector: | ||
+ | Type: | ||
+ | IP: | ||
+ | Port: | ||
+ | Endpoints: | ||
+ | Session Affinity: | ||
+ | No events. | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Unter Endpoints findet man nun den aktuell laufenden Pod. | ||
+ | |||
+ | |||
+ | ==== ImageStream ==== | ||
+ | |||
+ | ImageStreams werden dafür verwendet, automatische Tasks auszuführen wie bspw. ein Deployment zu aktualisieren, | ||
+ | |||
+ | Builds und Deployments können Image Streams beobachten und auf Änderungen entsprechend reagieren. In unserem Beispiel wird der Image Stream dafür verwendet, ein Deployment zu triggern, sobald etwas am Image geändert hat. | ||
+ | |||
+ | Mit dem folgenden Befehl können zusätzliche Informationen über den Image Stream ausgelesen werden: | ||
+ | |||
+ | < | ||
+ | # oc get imagestream example-spring-boot -o json | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== DeploymentConfig ==== | ||
+ | |||
+ | In der DeploymentConfig werden folgende Punkte definiert: | ||
+ | |||
+ | * **Update Strategy**: wie werden Applikationsupdates ausgeführt, | ||
+ | * **Triggers**: | ||
+ | * **Container** | ||
+ | * Welches Image soll deployed werden? | ||
+ | * Environment Configuration für die Pods | ||
+ | * ImagePullPolicy | ||
+ | * **Replicas**, | ||
+ | |||
+ | Mit dem folgenden Befehl können zusätzliche Informationen zur DeploymentConfig ausgelesen werden: | ||
+ | |||
+ | < | ||
+ | # oc get deploymentConfig example-spring-boot -o json | ||
+ | </ | ||
+ | |||
+ | Im Gegensatz zur DeploymentConfig, | ||
+ | |||
+ | **Tipp**: für jeden Resource Type gibt es auch eine Kurzform. So könnte man bspw. '' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | ===== Zusatzaufgabe: | ||
+ | |||
+ | Schaue dir die erstellten Ressourcen mit '' | ||
+ | |||
+ | ---- | ||
+ | |||
+ | <wrap em>Ende von Lab 3!</ | ||
- | ===== Aufgabe: LAB3.1 ===== | ||