<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>AKS on 엔지니어 생존기록</title><link>https://netscout.github.io/tags/AKS/</link><description>Recent content in AKS on 엔지니어 생존기록</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Tue, 03 Sep 2024 11:11:51 +0900</lastBuildDate><atom:link href="https://netscout.github.io/tags/AKS/index.xml" rel="self" type="application/rss+xml"/><item><title>k8s 노드에 접속하기(+ AKS 노드에 접속하기)</title><link>https://netscout.github.io/posts/k8s-%EB%85%B8%EB%93%9C%EC%97%90-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0-aks-%EB%85%B8%EB%93%9C%EC%97%90-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0/</link><pubDate>Tue, 03 Sep 2024 11:11:51 +0900</pubDate><guid>https://netscout.github.io/posts/k8s-%EB%85%B8%EB%93%9C%EC%97%90-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0-aks-%EB%85%B8%EB%93%9C%EC%97%90-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0/</guid><description>k8s에 대해서 스터디하거나 서비스를 배포하다 보면 가끔 워커 노드에 접속해야 할 때가 있습니다. 예를 들면 pod에서 DB나 Redis 등에 제대로 접속하지 못할 때 혹시 네트워크에 문제 있는지 확인하거나 워커 노드의 로그 등을 수집할 때 해당 로그의 위치가 …</description><content>&lt;p>k8s에 대해서 스터디하거나 서비스를 배포하다 보면 가끔 워커 노드에 접속해야 할 때가 있습니다. 예를 들면 pod에서 DB나 Redis 등에 제대로 접속하지 못할 때 혹시 네트워크에 문제 있는지 확인하거나 워커 노드의 로그 등을 수집할 때 해당 로그의 위치가 어디인지 등을 확인해야 할 때가 있습니다.&lt;/p>
&lt;p>이럴 때 노드에 접속할 수 있는 몇 가지 방법을 알아보겠습니다.&lt;/p>
&lt;h2 id="k9s-사용하기">k9s 사용하기&lt;/h2>
&lt;h3 id="k9s-설치하기">k9s 설치하기&lt;/h3>
&lt;p>&lt;a href="https://k9scli.io/">k9s&lt;/a>는 k8s 클러스터를 쉽게 관리할 수 있는 터미널 기반의 UI 도구입니다. k9s를 사용하면 k8s 클러스터의 상태를 실시간으로 확인하고, 리소스를 생성하거나 삭제할 수 있습니다. 또한 k8s 클러스터의 로그를 확인하거나, 특정 pod에 쉘로 접속하는 등의 작업을 쉽게 수행할 수 있습니다. 그래픽 환경이 아니라 처음엔 어색할 수 있지만, 익숙해지면 훨씬 빠르게 작업할 수 있습니다.&lt;/p>
&lt;p>k9s는 다음과 같이 설치할 수 있습니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># MacOS&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; brew install derailed/k9s/k9s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ubuntu(linuxbrew)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; brew install derailed/k9s/k9s
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Windows&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt; scoop install k9s
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>그리고 &lt;strong>k9s&lt;/strong>를 실행하면 됩니다.&lt;/p>
&lt;h3 id="k9s로-노드에-접속하기">k9s로 노드에 접속하기&lt;/h3>
&lt;p>k9s에서 &lt;strong>:pod&lt;/strong> 명령으로 pod를 선택하고 &lt;strong>s&lt;/strong>를 누르면 해당 pod에 쉘로 접속할 수 있습니다. 그런데 &lt;strong>:node&lt;/strong> 명령으로 노드 목록을 표시해보면 노드에는 쉘로 접속할 수 있는 &lt;strong>s&lt;/strong> 옵션이 표시되지 않습니다. 클러스터의 설정 파일을 찾아서 해당 클러스터에 대해서 쉘을 사용할 수 있도록 설정해줘야 합니다.&lt;/p>
&lt;p>클러스터 설정 파일을 찾으려면 다음 명령을 실행합니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&amp;gt; k9s info
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ____ __.________
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span>/ _/ __ &lt;span class="se">\_&lt;/span>_____
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &amp;lt; &lt;span class="se">\_&lt;/span>___ / ___/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="se">\ &lt;/span> / /&lt;span class="se">\_&lt;/span>__ &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>&lt;span class="p">|&lt;/span>____&lt;span class="p">|&lt;/span>__ &lt;span class="se">\ &lt;/span>/____//____ &amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="se">\/&lt;/span> &lt;span class="se">\/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Version: v0.32.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Config: /Users/onlifecoding/Library/Application Support/k9s/config.yaml
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Config&lt;/strong> 항목에 표시되는 경로에 이동하면 &lt;strong>clusters&lt;/strong> 폴더가 있고, 이 폴더에는 k9s로 접속한 적이 있는 k8s 클러스터의 설정 파일이 각 폴더 별로 저장되어 있습니다.&lt;/p>
&lt;p>쉘로 접속하려는 클러스터의 폴더로 이동해서 &lt;strong>config.yaml&lt;/strong> 파일의 &lt;strong>nodeShell&lt;/strong> 항목을 &lt;strong>true&lt;/strong>로 변경하면 됩니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">k9s&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cluster&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">aks-test-stg&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">active&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">default&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">lockFavorites&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">favorites&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">default&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">view&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">active&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">node&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">featureGates&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">nodeShell&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 노드에 쉘 접근 허용하기&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">portForwardAddress&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">localhost&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>그리고 다시 k9s에서 &lt;strong>:node&lt;/strong> 명령을 실행하면 노드에 쉘로 접속할 수 있는 &lt;strong>s&lt;/strong> 옵션이 표시됩니다. 해당 노드를 선택하고 &lt;strong>s&lt;/strong>를 누르면 노드에 pod이 배포되고, 해당 pod로 노드의 네트워크 통신 등을 테스트 할 수 있습니다.&lt;/p>
&lt;p>참고로, 생성되는 pod는 앞서 &lt;strong>k9s info&lt;/strong>로 확인했던 &lt;strong>Config&lt;/strong> 파일에 설정되어 있으며, 기본 값은 이렇습니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">shellPod&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">busybox:1.35.0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">namespace&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">default&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">limits&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">cpu&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">100m&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">memory&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">100Mi&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>이 방법은 매우 간단하긴 하지만 노드 자체에는 접근할 수 없다는 단점이 있습니다.&lt;/p>
&lt;h2 id="aks-노드에-접속하기">AKS 노드에 접속하기&lt;/h2>
&lt;p>AKS에서는 &lt;strong>kubectl debug&lt;/strong>를 통해 노드에 접속할 수 있습니다.&lt;/p>
&lt;p>우선 k9s나 kubectl을 통해 노드의 이름을 확인합니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&amp;gt; kubectl get nodes -o wide
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">aks-default-28123321-vmss000000 Ready &amp;lt;none&amp;gt; 18m v1.29.7 10.224.0.4 &amp;lt;none&amp;gt; Ubuntu 22.04.4 LTS 5.15.0-1071-azure containerd://1.7.20-1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>그리고 접속하려는 노드의 이름을 사용하여 &lt;strong>kubectl debug&lt;/strong> 명령을 실행합니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&amp;gt; kubectl debug node/aks-default-28123321-vmss000000 -it --image&lt;span class="o">=&lt;/span>mcr.microsoft.com/cbl-mariner/busybox:2.0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Creating debugging pod node-debugger-aks-default-28123321-vmss000000-2jj6t with container debugger on node aks-default-28123321-vmss000000.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">If you don&lt;span class="err">&amp;#39;&lt;/span>t see a &lt;span class="nb">command&lt;/span> prompt, try pressing enter.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>노드에 debug용 pod이 생성되고, 해당 pod에 접속되었습니다. 이제 다음 명령으로 node에 접근할 수 있습니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&amp;gt; chroot /host
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>노드에서 확인작업을 마치고 &lt;strong>exit&lt;/strong> 빠져나오면, pod은 종료되지만 삭제되지 않고 남아있는데요, k9s에서 &lt;strong>ctrl + d&lt;/strong>를 눌러 삭제하거나 &lt;strong>kubectl delete pod&lt;/strong> 명령으로 삭제할 수 있습니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&amp;gt; kubectl delete pod node-debugger-aks-default-28123321-vmss000000-2jj6t
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="혹시-클라우드-프로바이더에-상관없이-노드에-접속하는-방법은">혹시 클라우드 프로바이더에 상관없이 노드에 접속하는 방법은?&lt;/h2>
&lt;p>마지막으로 &lt;a href="https://github.com/luksa/kubectl-plugins">kubectl-plugins&lt;/a>를 이용하는 방법이 있습니다. 이 방법은 클라우드 프로바이더에 상관없이 노드에 접속할 수 있는 방법인데요, 클러스터의 어드민 권한이 필요합니다.&lt;/p>
&lt;h2 id="참고자료">참고자료&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://k9scli.io/topics/shell/">k9s NodeShell&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/ko-kr/azure/aks/node-access">유지 관리 또는 문제 해결을 위해 AKS(Azure Kubernetes Service) 클러스터 노드에 연결&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/luksa/kubectl-plugins">kubectl-plugins&lt;/a>&lt;/li>
&lt;/ul></content></item></channel></rss>