{"id":2812,"date":"2021-04-26T07:00:00","date_gmt":"2021-04-26T05:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=2812"},"modified":"2021-04-24T14:25:02","modified_gmt":"2021-04-24T12:25:02","slug":"aktualisierung-eines-kanboard-pods","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/aktualisierung-eines-kanboard-pods\/","title":{"rendered":"Aktualisierung eines Kanboard-Pods"},"content":{"rendered":"\n<p>Dies ist der letzte Artikel in meiner kleinen Reihe, \u00fcber meinen Ausflug ins Container-Land, zur Bereitstellung der Anwendung <a rel=\"noreferrer noopener\" href=\"https:\/\/kanboard.org\/\" target=\"_blank\">Kanboard<\/a>. <\/p>\n\n\n\n<p>Wie meine Reise ins Container-Land begonnen hat, kann in &#8222;<a href=\"https:\/\/www.my-it-brain.de\/wordpress\/kanboard-im-container\/\" data-type=\"post\" data-id=\"2685\">Kanboard im Container\u2026<\/a>&#8220; nachgelesen werden. Wie man einen <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/reverse-proxy-fuer-kanboard-im-container\/\" data-type=\"post\" data-id=\"2723\">Reverse-Proxy vor einem Pod<\/a> betreibt sowie mit dem Thema <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/backup-und-restore-im-kanboard-container-land\/\" data-type=\"post\" data-id=\"2705\">Backup und Restore<\/a> habe ich mich inzwischen ebenso besch\u00e4ftigt. Letzteres habe ich zum Gl\u00fcck implementiert und getestet, bevor ich <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/mit-dokumentation-zum-datenverlust\/\" data-type=\"post\" data-id=\"2728\">mit der Dokumentation Datenverlust erlitten<\/a> habe. Damit die Anwendung nach einem Neustart automatisch startet und f\u00fcr ein bisschen Komfort, habe ich <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/podman-kann-auch-systemd-service-units-generieren\/\" data-type=\"post\" data-id=\"2735\">Systemd-Service-Units<\/a> generiert. In diesem Teil geht es nun um die Aktualisierung dieser Umgebung.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"umgebung\">Umgebung<\/h2>\n\n\n\n<p>Aktuell l\u00e4uft Kanboard 1.2.18 auf einer RHEL 8 VM. Zur Ausf\u00fchrung sind folgende Werkzeuge und Container-Images beteiligt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman --version\npodman version 2.2.1\n$ podman images\nREPOSITORY                              TAG      IMAGE ID      CREATED        SIZE\nregistry.redhat.io\/rhel8\/postgresql-96  latest   4ce7daa6dc1d  7 weeks ago    451 MB\ndocker.io\/kanboard\/kanboard             v1.2.18  e7ee6403944b  3 months ago   58.6 MB\nk8s.gcr.io\/pause                        3.2      80d28bedfe5d  14 months ago  688 kB<\/code><\/pre>\n\n\n\n<p>Um mir die Erstellung eines Pods und das Einh\u00e4ngen von Podman-Volumes zu erleichtern, nutze ich folgendes kleines Skript:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\npodman run -d --pod new:kanboardpod --name kanboard --privileged -p 127.0.0.1:8080:80 -v kanboard_datadir:\/var\/www\/app\/data:Z -v kanboard_pluginsdir:\/var\/www\/app\/plugins:Z kanboard\/kanboard:v1.2.18\n\npodman run -d --pod kanboardpod --name pgsql_db -e POSTGRESQL_USER=&lt;USERNAME&gt; -e POSTGRESQL_PASSWORD=&lt;Verrate ich nicht&gt; -e POSTGRESQL_DATABASE=kanboard -v pgsql_dbdir:\/var\/lib\/pgsql\/data:Z rhel8\/postgresql-96:1-107<\/code><\/pre>\n\n\n\n<p>Mein Pod und die drei dazugeh\u00f6rigen Container werden w\u00e4hrend der folgenden Schritte noch normal ausgef\u00fchrt.<\/p>\n\n\n\n<p>Die Container selbst sind dabei <a rel=\"noreferrer noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Zustandslosigkeit\" target=\"_blank\">zustandslos<\/a>. Die persistent zu speichernden Daten werden in Podman-Volumes im lokalen Dateisystem der VM abgelegt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vorgehensweise\">Vorgehensweise<\/h2>\n\n\n\n<p>Ich verzichte in diesem Fall bewusst auf podman-auto-update(1), da ich mir erstmal einen \u00dcberblick verschaffen m\u00f6chte, was denn generell zu tun ist und wie die einzelnen Schritte aussehen k\u00f6nnen. Die grunds\u00e4tzliche Reihenfolge f\u00fcr ein Update sieht dabei wie folgt aus:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Aktuelle Container-Images aus einer Registry holen (<code>podman-pull(1)<\/code>)<\/li><li>Laufende Pod-Instanz stoppen und entfernen (<code>podman-pod(1)<\/code>)<\/li><li>Neue Pod-Instanz mit angepasstem Wrapper-Skript erstellen<\/li><li>Systemd-Service-Units erneut generieren (<code>podman-generate-systemd(1)<\/code>)<\/li><li>Pod-Instanz stoppen<\/li><li>Generierte Systemd-Service-Unit starten<\/li><\/ol>\n\n\n\n<p>An dieser Stelle m\u00f6chte ich vorweg nehmen, dass es genau so einfach war, wie es sich anh\u00f6rt. Die neuen Container-Images habe ich mit folgenden Kommandos heruntergeladen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman pull docker.io\/kanboard\/kanboard:v1.2.19\nTrying to pull docker.io\/kanboard\/kanboard:v1.2.19...\nGetting image source signatures\nCopying blob 0c2b98bb5f7e done\nCopying blob ca3cd42a7c95 done\nCopying blob e994ab432c32 done\nCopying blob 7b30337f40d2 done\nCopying blob f58d66ecc40b done\nCopying config 2cb48121b7 done\nWriting manifest to image destination\nStoring signatures\n2cb48121b7437ba15cd984472754b300395026c3e09e7c659b4f9b62e5b5b4dd\n\n$ podman pull registry.redhat.io\/rhel8\/postgresql-96:1-127\nTrying to pull registry.redhat.io\/rhel8\/postgresql-96:1-127...\nGetting image source signatures\nCopying blob 64607cc74f9c done\nCopying blob 320ae7fa06a7 done\nCopying blob 13897c84ca57 done\nCopying blob b3b2bbe848df done\nCopying config 9c6ab01c14 done\nWriting manifest to image destination\nStoring signatures\n9c6ab01c14748f7ff79483759122cb28e0f2c8b0310e5c8d9b5af8383e91f163\n\n$ podman images\nREPOSITORY                              TAG      IMAGE ID      CREATED        SIZE\ndocker.io\/kanboard\/kanboard             v1.2.19  2cb48121b743  4 days ago     61.3 MB\nregistry.redhat.io\/rhel8\/postgresql-96  1-127    9c6ab01c1474  2 weeks ago    449 MB\nregistry.redhat.io\/rhel8\/postgresql-96  latest   4ce7daa6dc1d  7 weeks ago    451 MB\ndocker.io\/kanboard\/kanboard             v1.2.18  e7ee6403944b  3 months ago   58.6 MB\nk8s.gcr.io\/pause                        3.2      80d28bedfe5d  14 months ago  688 kB<\/code><\/pre>\n\n\n\n<p>Mit den folgenden Befehlen werden Informationen zum laufenden Pod angezeigt, der Service wird gestoppt und der Pod inkl. seiner Container entfernt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman pod ls\nPOD ID        NAME         STATUS   CREATED      INFRA ID      # OF CONTAINERS\n2f3aa7d07e6e  kanboardpod  Running  4 weeks ago  34e8479a2847  3\n\n$ systemctl --user stop pod-kanboardpod.service\n\n$ podman pod ls\nPOD ID        NAME         STATUS  CREATED      INFRA ID      # OF CONTAINERS\n2f3aa7d07e6e  kanboardpod  Exited  4 weeks ago  34e8479a2847  3\n\n$ podman pod rm kanboardpod\n2f3aa7d07e6eb7d4c3a0c9927dac222be52b8992f95929c12af8ce4afafd4eb1<\/code><\/pre>\n\n\n\n<p>In mein Wrapper-Skript (<a href=\"#umgebung\">siehe Abschnitt Umgebung<\/a>) trage ich die neuen Versionsnummern bei den entsprechenden Aufrufen ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\npodman run -d --pod new:kanboardpod --name kanboard --privileged -p 127.0.0.1:8080:80 -v kanboard_datadir:\/var\/www\/app\/data:Z -v kanboard_pluginsdir:\/var\/www\/app\/plugins:Z kanboard\/kanboard:v1.2.19\n\npodman run -d --pod kanboardpod --name pgsql_db -e POSTGRESQL_USER=&lt;USERNAME&gt; -e POSTGRESQL_PASSWORD=&lt;Verrate ich nicht&gt; -e POSTGRESQL_DATABASE=kanboard -v pgsql_dbdir:\/var\/lib\/pgsql\/data:Z rhel8\/postgresql-96:1-127<\/code><\/pre>\n\n\n\n<p>Nachdem das obige Wrapper-Skript ausgef\u00fchrt wurde, pr\u00fcfe ich, ob die neue Pod-Instanz l\u00e4uft, erstelle die Service-Units und aktiviere diese:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman pod ls\nPOD ID        NAME         STATUS   CREATED             INFRA ID      # OF CONTAINERS\n85273ee9bb82  kanboardpod  Running  About a minute ago  82f45a722dff  3\n\n$ podman container ls\nCONTAINER ID  IMAGE                                         COMMAND         CREATED             STATUS                 PORTS                   NAMES\n6becc68a9c20  registry.redhat.io\/rhel8\/postgresql-96:1-127  run-postgresql  About a minute ago  Up About a minute ago  127.0.0.1:8080-&gt;80\/tcp  pgsql_db\n82f45a722dff  k8s.gcr.io\/pause:3.2                                          About a minute ago  Up About a minute ago  127.0.0.1:8080-&gt;80\/tcp  85273ee9bb82-infra\ne72ca46110be  docker.io\/kanboard\/kanboard:v1.2.19                           About a minute ago  Up About a minute ago  127.0.0.1:8080-&gt;80\/tcp  kanboard\n\n$ podman generate systemd --files --name kanboardpod\n\/home\/bob\/pod-kanboardpod.service\n\/home\/bob\/container-kanboard.service\n\/home\/bob\/container-pgsql_db.service\n\n$ mv *.service .config\/systemd\/user\/\n\n$ podman pod stop kanboardpod\n85273ee9bb82e49e236ae37d9320fd95af1eb186d7d965d72b9e2a270ca5cedf\n\n$ systemctl --user daemon-reload\n$ systemctl --user start pod-kanboardpod.service<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Das war einfacher als gedacht. Oder anders formuliert, es hat tats\u00e4chlich so funktioniert, wie ich es erwartet habe.<\/p>\n\n\n\n<p>Mein kleines Wochenend-Projekt skaliert sicher nicht gut und ist als Beispiel f\u00fcr Produktionsumgebungen vermutlich weniger geeignet. Doch um Software als rootless-Container auszuf\u00fchren und in kleinem Umfang zu testen, scheint dieser Weg durchaus geeignet  zu sein.<\/p>\n\n\n\n<p>Vielleicht schiebe ich in Zukunft noch einen Artikel unter Verwendung von podman-auto-update(1) nach.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dies ist der letzte Artikel in meiner kleinen Reihe, \u00fcber meinen Ausflug ins Container-Land, zur Bereitstellung der Anwendung Kanboard. Wie meine Reise ins Container-Land begonnen hat, kann in &#8222;Kanboard im Container\u2026&#8220; nachgelesen werden. Wie man einen Reverse-Proxy vor einem Pod betreibt sowie mit dem Thema Backup und Restore habe ich mich inzwischen ebenso besch\u00e4ftigt. Letzteres<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/aktualisierung-eines-kanboard-pods\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"","_metis_text_length":0,"_post_count":0,"footnotes":""},"categories":[57],"tags":[430,305,607,606,615],"class_list":["post-2812","post","type-post","status-publish","format-standard","hentry","category-wochenend-projekte","tag-osbn","tag-planet","tag-pod","tag-podman","tag-podman-generate-systemd"],"_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=2812"}],"version-history":[{"count":5,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2812\/revisions"}],"predecessor-version":[{"id":2825,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/2812\/revisions\/2825"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=2812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=2812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=2812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}