{"id":6628,"date":"2020-03-29T21:19:34","date_gmt":"2020-03-29T19:19:34","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=6628"},"modified":"2020-03-29T21:19:36","modified_gmt":"2020-03-29T19:19:36","slug":"kubernetes-objekte-fuer-tests-zur-laufzeit-veraendern-beispiel-am-hcl-connections-component-pack","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/kubernetes-objekte-fuer-tests-zur-laufzeit-veraendern-beispiel-am-hcl-connections-component-pack\/","title":{"rendered":"Kubernetes-Objekte f\u00fcr Tests zur Laufzeit ver\u00e4ndern: Beispiel am HCL Connections Component Pack"},"content":{"rendered":"<p>Analyse und Debugging von Kubernetes-Elementen k\u00f6nnen sich als schwierig herausstellen. Vor allem wenn es sich um propriet\u00e4re Software handelt, bei der man nicht wei\u00df, was im Container vor sich geht. Manchmal ist es notwendig, Code, Skripte oder andere Elemente im Container testweise zu ver\u00e4ndern. <\/p>\n<p>Da Container kurzlebig sind, kann man nicht den Quellcode einer Anwendung \u00e4ndern und diese neu starten. Der Container w\u00fcrde in diesem Falle auf Basis des Images neu gebaut. Zwar k\u00f6nnte man ein eigenes Image erstellen, dass auf dem originalen aufbaut. F\u00fcr schnelle Tests gestaltet sich dies jedoch als aufw\u00e4ndig. Zumal man die nicht mehr ben\u00f6tigten Images sp\u00e4ter aus der Registry l\u00f6schen sollte.<\/p>\n<h2 class=\"wp-block-heading\">Beispiel: Debugging des HCL Connections Component Pack<\/h2>\n<p>Ein solcher Beispielfall war der<a href=\"https:\/\/u-labs.de\/portal\/doppelter-hostname-in-header-bei-kubernetes-ingress-backend-connections-component-pack-bad-request\/\"> doppelte Hostname im IHS hinter einem Nginx-Ingress<\/a>. Mittels <strong>kubectl exec<\/strong> konnte der Quellcode der NodeJS-Anwendung zwar analysiert werden. Zur Fehleranalyse war jedoch Debugging notwendig &#8211; zumindest in Form von Variablenausgaben. <\/p>\n<p>Konkretes Beispiel: In der Datei <strong>\/home\/ibm\/app\/lib\/server\/suggestedCommunitiesService.js<\/strong> ist folgende Zeile zu finden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-javascript\" data-line=\"\">const scHeaders = utilsOrientServer.sanitizeHeaders(req);<\/code><\/pre>\n<p>Hier vermutete ich ein Problem mit den Headern, beispielsweise fehlende oder ung\u00fcltige Authentifizierungstokens. Daher wollte ich nach dieser Zeile gerne die Variable <strong>scHeaders<\/strong> mit <strong>console.log()<\/strong> ausgeben.<\/p>\n<h2 class=\"wp-block-heading\">Anpassung des Einstiegspunktes<\/h2>\n<p>Interessant ist diesbez\u00fcglich die Anpassung des Einstiegspunktes. Jedes Image besitzt einen, meist in Form einer <strong>ENTRYPOINT<\/strong> Anweisung. Sie legt fest, welcher Befehl nach dem Buildprozess ausgef\u00fchrt werden soll, um die gew\u00fcnschte Anwendung zu starten. Jeder Container besitzt hierf\u00fcr in Kubernetes die Eigenschaft <strong>command<\/strong>. Sie erm\u00f6glicht das \u00dcberschreiben des Einstiegspunktes. <\/p>\n<h3 class=\"wp-block-heading\">Optional: Reduzierung von Replikas<\/h3>\n<p>Geh\u00f6rt der Container zu einem Deployment oder ReplikaSet, sollte man zumindest auf Testsystemen zuvor die Replikas auf 1 reduzieren. Ansonsten m\u00fcsste man jeden zugeh\u00f6rigen Pod anpassen oder darauf hoffen, dass die Anfrage beim angepassten Pod landet. In diesem Beispiel arbeiten wir mit dem Deployment namens <strong>community-suggestions<\/strong> vom Component Pack:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">kubectl scale deploy community-suggestions --replicas=1<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Alten Einstiegspunkt ermitteln<\/h3>\n<p>Nun sollte nur noch ein Pod laufen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ kubectl get po | grep community-suggestions\ncommunity-suggestions-77d4b99c4c-4l47r    1\/1       Running     0          5d<\/code><\/pre>\n<p>Zun\u00e4chst m\u00fcssen wir herausfinden, was im Container l\u00e4uft. Daf\u00fcr wechseln wir mit <strong>kubectl exec<\/strong> in den Container:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">$ kubectl exec community-suggestions-77d4b99c4c-4l47r -- ps\nPID   USER     TIME  COMMAND\n    1 root      0:00 node \/home\/ibm\/app\/node_modules\/.bin\/cross-env NODE_ENV=production node lib\/server\/server.js\n   14 root      2:04 node lib\/server\/server.js<\/code><\/pre>\n<p>Der Einstiegspunkt lautet hier:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">\/home\/ibm\/app\/node_modules\/.bin\/cross-env NODE_ENV=production node lib\/server\/server.js<\/code><\/pre>\n<h3 class=\"wp-block-heading\">Einstiegspunkt mit Modifikation \u00fcberschreiben<\/h3>\n<p>Um unsere Modifikation vorzunehmen, \u00fcberschreiben wir den Einstiegspunkt: Er soll zun\u00e4chst JS-Code zum Debuggen in die Datei einf\u00fcgen, bevor der Applikationsserver gestartet wird. Daf\u00fcr bearbeiten wir das Deployment<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">kubectl edit deploy community-suggestions<\/code><\/pre>\n<p>und suchen nach der Eigenschaft <strong>containers<\/strong>. Hier legen wir entsprechend einger\u00fcckt unseren Einstiegspunkt fest:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-yaml\" data-line=\"\">containers:\n- command:\n  - sh\n  - -c\n  - sed -i &#039;s\/\\(const scHeaders = utilsOrientServer.sanitizeHeaders(req);\\)\/\\1console.log(&quot;MY_TEST_HEADERS:&quot;, scHeaders);\/g&#039; \/home\/ibm\/app\/lib\/server\/suggestedCommunitiesService.js;\n    node \/home\/ibm\/app\/node_modules\/.bin\/cross-env NODE_ENV=production node lib\/server\/server.js\n  # ...<\/code><\/pre>\n<p>Die Codedatei f\u00fchr nach der Deklaration und Zuweisung von <strong>scHeaders<\/strong> nun die Konsolenausgabe aus. Das Pr\u00e4fix <strong>MY_TEST_HEADERS<\/strong> hilft uns, dies in den Logs einfacher wiederzufinden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ kubectl logs -f $(kubectl get po | grep community-suggestions | awk &#039;{print $1}&#039;)\nMY_TEST_HEADERS: { &#039;x-request-id&#039;: &#039;8f12bf924eecc1a3e84ed91f823d35b9&#039;,\n  &#039;x-forwarded-host&#039;: &#039;cnx65-k8s.internal, cnx65-k8s.internal&#039; }<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Analyse und Debugging von Kubernetes-Elementen k\u00f6nnen sich als schwierig herausstellen. Vor allem wenn es sich um propriet\u00e4re Software handelt, bei der man nicht wei\u00df, was im Container vor sich geht. Manchmal ist es notwendig, Code, Skripte oder andere Elemente im Container testweise zu ver\u00e4ndern. Da Container kurzlebig sind, kann man nicht den Quellcode einer Anwendung &#8230;<\/p>\n","protected":false},"author":5,"featured_media":6663,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,78],"tags":[792,719],"class_list":["post-6628","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","category-software","tag-hcl-component-pack","tag-kubernetes"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6628","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=6628"}],"version-history":[{"count":3,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6628\/revisions"}],"predecessor-version":[{"id":6631,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6628\/revisions\/6631"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/6663"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=6628"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=6628"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=6628"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}