<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Maciej[cc] &#187; docker</title><atom:link href="https://nabozny.io/tag/docker/index.xml" rel="self" type="application/rss+xml"/><link>https://nabozny.io/tag/docker/</link><description>Blog o programowaniu i nie tylko</description><lastBuildDate>Tue, 12 Mar 2024 10:03:44 +0000</lastBuildDate><language>pl-PL</language><generator>Hugo 0.167.0</generator><item><title>Debugowanie kontenerów w kubernetesie – część 2</title><link>https://nabozny.io/debugowanie-kontenerow-w-kubernetesie-czesc-2/</link><dc:creator>maciej</dc:creator><pubDate>Tue, 12 Mar 2024 10:02:11 +0000</pubDate><category>Cloud</category><category>Linux</category><category>docker</category><category>linux</category><category>k8s</category><category>kubernetes</category><category>sieci</category><guid isPermaLink="true">https://nabozny.io/debugowanie-kontenerow-w-kubernetesie-czesc-2/</guid><description>Po poprzedniej części zapraszam na kolejną, pokazującą jak poradzić sobie z ograniczeniami które wprowadza Kubernetes podczas debugowania aplikacji sieciowych.
Wykonanie pojedynczego polecenia/shelll kubectl -n my_namespace exec -it pod -- /bin/some_command Gdzie zwykle /bin/some_command można …</description><content:encoded>&lt;p&gt;Po poprzedniej &lt;a href="https://nabozny.io/debugowanie-kontenerow-w-chmurze/"&gt;części&lt;/a&gt; zapraszam na kolejną, pokazującą jak poradzić sobie z ograniczeniami które wprowadza Kubernetes podczas debugowania aplikacji sieciowych.&lt;/p&gt;&#10;&lt;h3 id="wykonanie-pojedynczego-poleceniashelll"&gt;Wykonanie pojedynczego polecenia/shelll&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl -n my_namespace exec -it pod -- /bin/some_command&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Gdzie zwykle &lt;em&gt;/bin/some_command&lt;/em&gt; można zastąpić &lt;em&gt;/bin/bash&lt;/em&gt;&lt;/p&gt;&#10;&lt;h3 id="kontener-do-debugowania"&gt;Kontener do debugowania&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl debug my_pod_name -n my_namespace -it --image=ubuntu:latest /bin/bash&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Powyższe spowoduje uruchomienie nowego kontenera w tym samym podzie. Dzięki temu możemy połączyć się do localhost (127.0.0.1) i sprawdzić jak działają nasze serwisy za pomocą curl/wget. W trybie debug mamy też dostęp do roota, dzięki czemu hardening właściwej aplikacji nie jest aż tak straszny i nie ogranicza nas, np. w zainstalowaniu nowych paczek. Taki kontener nie współdzieli też systemu plików z oryginalnymi kontenerami z poda, dzięki temu nie namieszamy zbyt dużo.&lt;/p&gt;&#10;&lt;h3 id="lepszy-kontener-do-debugowania"&gt;Lepszy kontener do debugowania&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl debug my_pod_name -n my_namespace -it --image=ubuntu:latest --share-processes -c container_name --copy-to=mg-debug&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Jest to trochę bardziej rozbudowana wersja poprzedniego polecenia. Odpalając taki kontener do debugowania możemy wybrać jeden z istniejących kontenerów i kubectl skopiuje jego konfiguracje (zamontowane &lt;em&gt;volumes&lt;/em&gt;, sieć i przestrzeń procesów). Zabawa w takim środowisku daje już dość duże możliwości interakcji z innymi kontenerami. Można wysłać przyjacieski sygnał -KILL do procesów, pogrzebać w podmontowanych wolumenach lub sprawdzić sieć, również bez ograniczeń hardeningu.&lt;/p&gt;&#10;&lt;h3 id="shell-noda"&gt;Shell noda&lt;/h3&gt;&#10;&lt;p&gt;Link dla zdesperowanych: &lt;a href="https://github.com/kvaps/kubectl-node-shell"&gt;https://github.com/kvaps/kubectl-node-shell&lt;/a&gt;. Skrypt potrafi uruchomić shell na nodzie kubernetesa. Dzięki niemu możemy dostać się jako root na dowolnego noda z klastra jako root i wprost pogrzebać w systemie. Chyba najbardziej &amp;ldquo;wszechmocna&amp;rdquo; opcja do zabawy w szukanie dziury w całym.&lt;/p&gt;&#10;&lt;p&gt;Miłego debugowania!&lt;/p&gt;&#10;</content:encoded></item><item><title>Czego w dockerze nie zrobisz?</title><link>https://nabozny.io/czego-w-dockerze-nie-zrobisz/</link><dc:creator>maciej</dc:creator><pubDate>Tue, 02 Jan 2018 17:20:07 +0000</pubDate><category>Cloud</category><category>Linux</category><category>cloud</category><category>docker</category><guid isPermaLink="true">https://nabozny.io/czego-w-dockerze-nie-zrobisz/</guid><description>Lista jest pewnie dużo dłuższa, ale poniższe dały mi się we znaki:</description><content:encoded>&lt;p&gt;Lista jest pewnie dużo dłuższa, ale poniższe dały mi się we znaki:&lt;/p&gt;&#10;&lt;h5 id="nie-uruchomisz-openvpna"&gt;Nie uruchomisz openvpn&amp;rsquo;a&lt;/h5&gt;&#10;&lt;p&gt;Kontenery domyślnie nie pozwalają na ingerencje w sieci systemu operacyjnego. Przez to nie da się w łatwy sposób uruchomić np. OpenVPN, który potrzebuje stworzyć własny interfejs sieciowy tun/tap. Czasami uruchamiając kontenery w różnych miejscach świata i w różnych serwerowniach postawienie VPN&amp;rsquo;a spinającego je wszystkie ze sobą jest dość wygodnym rozwiązaniem, dodatkowo dającym bezpieczeństwo.&lt;/p&gt;&#10;&lt;p&gt;Aby podłączyć taką sieć do kontenera trzeba się albo pogimnastykować z routingiem w systemie gospodarza albo poczarować z uprawnieniami kontenera. Aby to zrobić trzeba uruchomić nowy obraz z parametrem &lt;em&gt;--cap-add=NET_ADMIN&lt;/em&gt;, który zwiększa możliwości ingerencji w macierzysty system, a w szczególności w konfigurację jego sieci.&lt;/p&gt;&#10;&lt;h5 id="nie-poda-piwa"&gt;Nie poda piwa&lt;/h5&gt;&#10;&lt;p&gt;z drugiej strony zwykły desktop też piwa nie poda. Ale chociaż potrzyma na tacce cd, a docker nie. Idźmy dalej.&lt;/p&gt;&#10;&lt;h5 id="debugowanie-programów"&gt;Debugowanie programów&lt;/h5&gt;&#10;&lt;p&gt;Kolejną rzeczą jest debugowanie kodu. Debugger (np. gdb) wymaga dość głębokiego integrowania się z inną aplikacją, które jest zwykle wykonywane przez funkcję &lt;em&gt;ptrace&lt;/em&gt;. Funkcja ta pozwala pisać i czytać po pamięci innych programów, które chcemy badać. Dzięki ptrace debuger może zatrzymać wykonywanie programu w wybranym przez siebie miejscu, wykonywać go krok po kroku lub przechwytywać (i zmieniać) przerwania systemowe. Z systemowej funkcji &lt;em&gt;ptrace&lt;/em&gt; korzysta też programik strace, pokazujący co program aktualnie robi, przechwytując jego przerwania oraz User Mode Linux, który podmienia przerwania systemowe na własne.&lt;/p&gt;&#10;&lt;p&gt;Aby umożliwić korzystanie z ptrace w kontenerze, musimy dodać mu flagę &lt;em&gt;--cap-add SYS_PTRACE&lt;/em&gt;, która przez linux capabilities pozwoli na dostęp do tej funkcji.&lt;/p&gt;&#10;&lt;h5 id="nici-z-network-namespaces"&gt;Nici z network namespaces&lt;/h5&gt;&#10;&lt;p&gt;Czasami potrzeba wykonać coś więcej, niż sam VPN i poczarować np. z przestrzeniami nazw aby uruchomić niektóre narzędzia (np. podczas pisania i testów &lt;a href="https://cloudover.org/"&gt;CoreCluster&lt;/a&gt;). Podobnie jak przy konfiguracji VPN, tutaj też Docker ograniczy nam taką możliwość. Można to obejść podobnie, przez capabilities.&lt;/p&gt;&#10;&lt;h3 id="czyli-jak-się-da-obejść-to-jednak-nie-ogranicza"&gt;Czyli jak się da obejść to jednak nie ogranicza?&lt;/h3&gt;&#10;&lt;p&gt;W sumie tak. Ale należy pamiętać, że dodając kontenerowi każdą taką flagę ryzykujemy, że kod uruchomiony w kontenerze będzie mógł w jakiś sposób przejść do systemu gospodarza. Idąc tą drogą możemy pozdejmować wszystkie ograniczenia Dockera (lub innego silnika kontenerów) i cieszyć się nieskrępowaną pracą w łatwo zarządzalnym &lt;em&gt;chroot&lt;/em&gt;. W ten sposób dostajemy wtedy sam chroot, z którego prawdopodobnie będziemy mogli łatwo wyjść, podobnie jak potencjalny intruz, który mógłby być nieco lepiej powstrzymany przez ograniczonego dockera (w domyślnej konfiguracji). Z drugiej strony wszyscy więksi dostawcy usług, oferujący silnik kontenerów nigdy nie dają dockera bezpośrednio na swoim sprzęcie, a za pośrednictwem wirtualnych maszyn, które nie są współdzielone pomiędzy użytkownikami.&lt;/p&gt;&#10;&lt;p&gt;Podsumowując, Docker mimo swoich fajnych narzędzi pozostawia trochę ograniczeń na to, co możemy wykonać w kontenerze. Tyczy się to prawdopodobnie również innych silników. W takich przypadkach (których zapewne znajdzie się znacznie więcej) możemy posiłkować się starą, dobrą wirtualizacją, która daje w pełni funkcjonalny system. Wykorzystując obrazy Copy On Write i &lt;a href="https://en.wikipedia.org/wiki/Kernel_same-page_merging"&gt;Kernel Same Page Mapping&lt;/a&gt; możemy znacznie ograniczyć użycie pamięci i przestrzeni dyskowej potrzebnej na wirtualne maszyny, zachowując pełną funkcjonalność.&lt;/p&gt;</content:encoded></item></channel></rss>