<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Jacob Baek's home</title>
    <link>https://mr100do.tistory.com/</link>
    <description>DevOps, Cloud, ...
if you have any question, please send mail to me
(dubaek@gmail.com)</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 01:10:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Jacob_baek</managingEditor>
    <image>
      <title>Jacob Baek's home</title>
      <url>https://t1.daumcdn.net/cfile/tistory/1273BE4F4F7FA2930F</url>
      <link>https://mr100do.tistory.com</link>
    </image>
    <item>
      <title>InternalTrafficPolicy</title>
      <link>https://mr100do.tistory.com/427938</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/&quot;&gt;https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결하려는 pod가 동일 node에 없는 경우 연결자체가 안된다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;## internaltrafficpolicy = local and pods are not in same node.
root@aks-nodepool1-23236778-vmss000002:/# iptables-save | grep -i nginx
-A KUBE-SERVICES -d 10.0.130.191/32 -p tcp -m comment --comment &quot;default/nginx-sample-svc has no local endpoints&quot; -j DROP
## internaltrafficpolicy = cluster
root@aks-nodepool1-23236778-vmss000002:/# iptables-save | grep -i nginx
-A KUBE-SEP-VKFWAD6C5GW7XJNY -s 10.240.0.50/32 -m comment --comment &quot;default/nginx-sample-svc&quot; -j KUBE-MARK-MASQ
-A KUBE-SEP-VKFWAD6C5GW7XJNY -p tcp -m comment --comment &quot;default/nginx-sample-svc&quot; -m tcp -j DNAT --to-destination 10.240.0.50:8080
-A KUBE-SERVICES -d 10.0.130.191/32 -p tcp -m comment --comment &quot;default/nginx-sample-svc cluster IP&quot; -j KUBE-SVC-JT67RD6F3OETQGP2
-A KUBE-SVC-JT67RD6F3OETQGP2 -d 10.0.130.191/32 ! -i azv+ -p tcp -m comment --comment &quot;default/nginx-sample-svc cluster IP&quot; -j KUBE-MARK-MASQ
-A KUBE-SVC-JT67RD6F3OETQGP2 -m comment --comment &quot;default/nginx-sample-svc -&amp;gt; 10.240.0.50:8080&quot; -j KUBE-SEP-VKFWAD6C5GW7XJNY&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 동일 node에 통신을 하려는 두 pod가 있는 경우는&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;## internaltrafficpolicy = local and pods are in same node. 
root@aks-nodepool1-23236778-vmss000002:/# iptables-save |grep nginx
-A KUBE-SEP-HLUNARSNCDYYPHUV -s 10.240.0.68/32 -m comment --comment &quot;default/nginx-sample-svc&quot; -j KUBE-MARK-MASQ
-A KUBE-SEP-HLUNARSNCDYYPHUV -p tcp -m comment --comment &quot;default/nginx-sample-svc&quot; -m tcp -j DNAT --to-destination 10.240.0.68:8080
-A KUBE-SERVICES -d 10.0.130.191/32 -p tcp -m comment --comment &quot;default/nginx-sample-svc cluster IP&quot; -j KUBE-SVL-JT67RD6F3OETQGP2
-A KUBE-SVL-JT67RD6F3OETQGP2 -d 10.0.130.191/32 ! -i azv+ -p tcp -m comment --comment &quot;default/nginx-sample-svc cluster IP&quot; -j KUBE-MARK-MASQ
-A KUBE-SVL-JT67RD6F3OETQGP2 -m comment --comment &quot;default/nginx-sample-svc -&amp;gt; 10.240.0.68:8080&quot; -j KUBE-SEP-HLUNARSNCDYYPHUV&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 아래와 같은 service endpoint 에 매칭되는 rule이 존재하며 nodeIP:port로 지정되어 있다.&lt;br /&gt;(여기서 10.240.0.41 는 nginx-sample pod가 동작되고 있는 node이다.)&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;-A KUBE-SVC-JT67RD6F3OETQGP2 -m comment --comment &quot;default/nginx-sample-svc -&amp;gt; 10.240.0.41:8080&quot; -j KUBE-SEP-I4JGEQAI6S5SYXV7&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 pod를 4개로 늘린 경우 아래와 같이 가중치가 붙는 형태로 rule이 생성된다.&lt;br /&gt;(여기서 10.240.0.73 이 실제 확인중인 node의 ip이다. 즉, 동일 node는 가중치가 없고 바로 연결을 지향한다.)&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;-A KUBE-SVC-JT67RD6F3OETQGP2 -m comment --comment &quot;default/nginx-sample-svc -&amp;gt; 10.240.0.148:8080&quot; -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-44HLQTUCEZ7VEBKD
-A KUBE-SVC-JT67RD6F3OETQGP2 -m comment --comment &quot;default/nginx-sample-svc -&amp;gt; 10.240.0.29:8080&quot; -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-7CLJKZYKU4YYJTUQ
-A KUBE-SVC-JT67RD6F3OETQGP2 -m comment --comment &quot;default/nginx-sample-svc -&amp;gt; 10.240.0.41:8080&quot; -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-I4JGEQAI6S5SYXV7
-A KUBE-SVC-JT67RD6F3OETQGP2 -m comment --comment &quot;default/nginx-sample-svc -&amp;gt; 10.240.0.73:8080&quot; -j KUBE-SEP-PD4DNTIBFNIHTOXJ&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/427938</guid>
      <comments>https://mr100do.tistory.com/427938#entry427938comment</comments>
      <pubDate>Tue, 25 Nov 2025 17:54:26 +0900</pubDate>
    </item>
    <item>
      <title>envoy gateway api controller</title>
      <link>https://mr100do.tistory.com/427937</link>
      <description>&lt;h1&gt;Background&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.kubernetes.dev/blog/2025/11/12/ingress-nginx-retirement/&quot;&gt;https://www.kubernetes.dev/blog/2025/11/12/ingress-nginx-retirement/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Envoy controller&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gateway.envoyproxy.io/docs/tasks/quickstart/&quot;&gt;https://gateway.envoyproxy.io/docs/tasks/quickstart/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Installation&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gateway.envoyproxy.io/docs/tasks/quickstart/&quot;&gt;https://gateway.envoyproxy.io/docs/tasks/quickstart/&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.0 -n envoy-gateway-system --create-namespace&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gateway.envoyproxy.io/latest/install/install-yaml/&quot;&gt;https://gateway.envoyproxy.io/latest/install/install-yaml/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;quick start and learn how it works&lt;/h1&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;$ kubectl apply -f https://github.com/envoyproxy/gateway/releases/download/v1.6.0/quickstart.yaml -n default
gatewayclass.gateway.networking.k8s.io/eg created
gateway.gateway.networking.k8s.io/eg created
serviceaccount/backend created
service/backend created
deployment.apps/backend created
httproute.gateway.networking.k8s.io/backend created&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;following the below service, you can access URL using external-ip&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ kubectl get svc -n envoy-gateway-system -l app.kubernetes.io/instance=eg
NAME            TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                                            AGE
envoy-gateway   ClusterIP   10.0.173.35   &amp;lt;none&amp;gt;        18000/TCP,18001/TCP,18002/TCP,19001/TCP,9443/TCP   76m
$ kubectl get svc -n envoy-gateway-system -l app.kubernetes.io/name=envoy
NAME                        TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
envoy-default-eg-e41e7b31   LoadBalancer   10.0.42.162   x.x.x.x        80:30436/TCP   72m
$ kubectl get gateway
NAME   CLASS   ADDRESS        PROGRAMMED   AGE
eg     eg      x.x.x.x        True         74m&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;ingress와의 차이점&lt;/h1&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;th&gt;ingress&lt;/th&gt;
&lt;th&gt;gateway api&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;component&lt;/td&gt;
&lt;td&gt;ingress&lt;/td&gt;
&lt;td&gt;gateway / httproute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;additional features&lt;/td&gt;
&lt;td&gt;annotation&lt;/td&gt;
&lt;td&gt;CRD로 추가 제공&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 생성시에는 ingress와 비교해보았을때에는 gateway 와 httproute만 제공되면 서비스가 가능하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gateway : listener 역할 수행&lt;/li&gt;
&lt;li&gt;httproute : ingress에서 path 로 ingress내에 선언하였던 부분을 분리하여 설정할수 있다.&lt;/li&gt;
&lt;li&gt;그외에도 다양한 crd를 활용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ kubectl get crd | grep gateway
backends.gateway.envoyproxy.io                        2025-11-21T04:43:10Z
backendtlspolicies.gateway.networking.k8s.io          2025-11-21T04:43:08Z
backendtrafficpolicies.gateway.envoyproxy.io          2025-11-21T04:43:11Z
clienttrafficpolicies.gateway.envoyproxy.io           2025-11-21T04:43:12Z
envoyextensionpolicies.gateway.envoyproxy.io          2025-11-21T04:43:12Z
envoypatchpolicies.gateway.envoyproxy.io              2025-11-21T04:43:13Z
envoyproxies.gateway.envoyproxy.io                    2025-11-21T04:43:14Z
gatewayclasses.gateway.networking.k8s.io              2025-11-21T04:43:08Z
gateways.gateway.networking.k8s.io                    2025-11-21T04:43:08Z
grpcroutes.gateway.networking.k8s.io                  2025-11-21T04:43:08Z
httproutefilters.gateway.envoyproxy.io                2025-11-21T04:43:15Z
httproutes.gateway.networking.k8s.io                  2025-11-21T04:43:09Z
referencegrants.gateway.networking.k8s.io             2025-11-21T04:43:08Z
securitypolicies.gateway.envoyproxy.io                2025-11-21T04:43:16Z
tcproutes.gateway.networking.k8s.io                   2025-11-21T04:43:08Z
tlsroutes.gateway.networking.k8s.io                   2025-11-21T04:43:08Z
udproutes.gateway.networking.k8s.io                   2025-11-21T04:43:08Z
xbackendtrafficpolicies.gateway.networking.x-k8s.io   2025-11-21T04:43:08Z
xlistenersets.gateway.networking.x-k8s.io             2025-11-21T04:43:08Z
xmeshes.gateway.networking.x-k8s.io                   2025-11-21T04:43:07Z&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;configuration&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;envoy-gateway.yaml&lt;/p&gt;
&lt;h1&gt;Usages&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gateway.envoyproxy.io/docs/tasks/security/restrict-ip-access/&quot;&gt;whitelist&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;stylus&quot;&gt;&lt;code&gt;$ curl -H &quot;Host: www.example.com&quot; xxx.xxx.xxx.xxx
RBAC: access denied&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;spec:
  authorization:
    defaultAction: Deny
    rules:
    - action: Allow
      principal:
        clientCIDRs:
        - 218.238.135.0/24
        - 4.194.122.0/24&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/427937</guid>
      <comments>https://mr100do.tistory.com/427937#entry427937comment</comments>
      <pubDate>Mon, 17 Nov 2025 14:36:18 +0900</pubDate>
    </item>
    <item>
      <title>AKS-MCP</title>
      <link>https://mr100do.tistory.com/427921</link>
      <description>&lt;h1&gt;What is AKS MCP&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can operate your AKS cluster using AI.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There are 15 functions&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xQjfv/btsPUdJDeg3/SF077BZlqEh0uKgltw4RTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xQjfv/btsPUdJDeg3/SF077BZlqEh0uKgltw4RTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xQjfv/btsPUdJDeg3/SF077BZlqEh0uKgltw4RTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxQjfv%2FbtsPUdJDeg3%2FSF077BZlqEh0uKgltw4RTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;306&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Prerequiste&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VSCode&lt;/li&gt;
&lt;li&gt;MCP binary (&lt;a href=&quot;https://github.com/Azure/aks-mcp/releases&quot;&gt;https://github.com/Azure/aks-mcp/releases&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I used aks-mcp binary on WSL.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;How to use&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;vscode and github copilot&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;github copilot&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LtZjm/btsPWd2QwDA/RHqadUJY6vAkn1NcLCLQHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LtZjm/btsPWd2QwDA/RHqadUJY6vAkn1NcLCLQHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LtZjm/btsPWd2QwDA/RHqadUJY6vAkn1NcLCLQHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLtZjm%2FbtsPWd2QwDA%2FRHqadUJY6vAkn1NcLCLQHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;175&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;configure tools on github copilot&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JSTZi/btsPWoXqkah/sNCIfoQ44mlCM3dqOHaNbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JSTZi/btsPWoXqkah/sNCIfoQ44mlCM3dqOHaNbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JSTZi/btsPWoXqkah/sNCIfoQ44mlCM3dqOHaNbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJSTZi%2FbtsPWoXqkah%2FsNCIfoQ44mlCM3dqOHaNbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;98&quot; data-origin-width=&quot;411&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mcp.json file&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxIptH/btsPUglOKbk/EkhXcPqTOuXTNJ9zN5xvz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxIptH/btsPUglOKbk/EkhXcPqTOuXTNJ9zN5xvz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxIptH/btsPUglOKbk/EkhXcPqTOuXTNJ9zN5xvz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxIptH%2FbtsPUglOKbk%2FEkhXcPqTOuXTNJ9zN5xvz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;344&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test result&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQmHOy/btsPXJfO0ds/qKYIK4SMOekGomcCPmCiY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQmHOy/btsPXJfO0ds/qKYIK4SMOekGomcCPmCiY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQmHOy/btsPXJfO0ds/qKYIK4SMOekGomcCPmCiY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQmHOy%2FbtsPXJfO0ds%2FqKYIK4SMOekGomcCPmCiY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;246&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;you should input your subscription.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;claude desktop&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;claude_desktop_config.json file.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BZAxp/btsPXUuAfal/VdXfJxNpeAhk65bduyuHqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BZAxp/btsPXUuAfal/VdXfJxNpeAhk65bduyuHqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BZAxp/btsPXUuAfal/VdXfJxNpeAhk65bduyuHqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBZAxp%2FbtsPXUuAfal%2FVdXfJxNpeAhk65bduyuHqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;350&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;restart claude desktop and you can see below Local MCP servers&lt;br /&gt;(I recommend to Exit button on the menu)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;717&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hf14D/btsPXB9S4qP/SRfnxkidsk3uvV6xRtkouK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hf14D/btsPXB9S4qP/SRfnxkidsk3uvV6xRtkouK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hf14D/btsPXB9S4qP/SRfnxkidsk3uvV6xRtkouK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHf14D%2FbtsPXB9S4qP%2FSRfnxkidsk3uvV6xRtkouK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;717&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test result&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmdsZ9/btsPXCAZKAR/Jsm5Q6dihZb7VkT26STKwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmdsZ9/btsPXCAZKAR/Jsm5Q6dihZb7VkT26STKwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmdsZ9/btsPXCAZKAR/Jsm5Q6dihZb7VkT26STKwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmdsZ9%2FbtsPXCAZKAR%2FJsm5Q6dihZb7VkT26STKwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;755&quot; height=&quot;527&quot; data-origin-width=&quot;755&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;doesn't need subscription id.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/ko-kr/azure/developer/azure-mcp-server/tools/azure-aks&quot;&gt;https://learn.microsoft.com/ko-kr/azure/developer/azure-mcp-server/tools/azure-aks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.aks.azure.com/2025/08/06/aks-mcp-server&quot;&gt;https://blog.aks.azure.com/2025/08/06/aks-mcp-server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://modelcontextprotocol.io/quickstart/user&quot;&gt;https://modelcontextprotocol.io/quickstart/user&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Cloud/Public Cloud</category>
      <category>aks-mcp</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/427921</guid>
      <comments>https://mr100do.tistory.com/427921#entry427921comment</comments>
      <pubDate>Mon, 18 Aug 2025 11:26:55 +0900</pubDate>
    </item>
    <item>
      <title>how to check ACR login user</title>
      <link>https://mr100do.tistory.com/427918</link>
      <description>&lt;p&gt;Refresh token을 사용하여 아래와 같은 JWT 형태의 token을 decode 해볼수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;JWT=$(az acr login -n &amp;lt;ACRName&amp;gt; -t --query refreshToken -o tsv)
jq -R &amp;#39;split(&amp;quot;.&amp;quot;) | .[0],.[1] | @base64d | fromjson&amp;#39; &amp;lt;&amp;lt;&amp;lt; $(echo &amp;quot;$JWT&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://prefetch.net/blog/2020/07/14/decoding-json-web-tokens-jwts-from-the-linux-command-line/&quot;&gt;https://prefetch.net/blog/2020/07/14/decoding-json-web-tokens-jwts-from-the-linux-command-line/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Cloud/Public Cloud</category>
      <category>ACR Login</category>
      <category>token decode</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/427918</guid>
      <comments>https://mr100do.tistory.com/427918#entry427918comment</comments>
      <pubDate>Mon, 4 Aug 2025 14:24:28 +0900</pubDate>
    </item>
    <item>
      <title>ingress-nginx</title>
      <link>https://mr100do.tistory.com/427917</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 에러가 발생되는 경우&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Error from server (BadRequest): error when creating &quot;nginx-with-svc-ingress.yaml&quot;: admission webhook &quot;validate.nginx.ingress.kubernetes.io&quot; denied the request: annotation group ConfigurationSnippet contains risky annotation based on ingress configuration&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 방식으로 ingress-nginx를 업데이트 해줘야 한다.&amp;nbsp;&lt;br /&gt;helm 으로 ingress-nginx 를 배포하는 경우 아래와 같은 annotations-risk-level 과 allowSnippetAnnotations 설정추가가 필요하다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;helm upgrade --install ingress-nginx ingress-nginx \
 --repo [https://kubernetes.github.io/ingress-nginx](https://kubernetes.github.io/ingress-nginx) \
 --namespace ingress-nginx --create-namespace \
 --set controller.allowSnippetAnnotations=true \
 --set controller.config.annotations-risk-level=Critical \
 --set controller.image.tag=v1.10.1 \
 --set controller.service.annotations.&quot;service\\.beta\\.kubernetes\\.io/azure-load-balancer-health-probe-request-path&quot;=/healthz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ellie.wtf/notes/ingress-nginx-risky-annotations&quot;&gt;https://ellie.wtf/notes/ingress-nginx-risky-annotations&lt;/a&gt;&lt;/p&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/427917</guid>
      <comments>https://mr100do.tistory.com/427917#entry427917comment</comments>
      <pubDate>Mon, 14 Jul 2025 11:09:52 +0900</pubDate>
    </item>
    <item>
      <title>Entra ID token</title>
      <link>https://mr100do.tistory.com/427907</link>
      <description>&lt;p&gt;Azure infra 상에서 동작되는 app에서 azure infra의 resource를 사용하거나 접근해야할 경우 token 기반으로 접근이 이루어지는 경우들이 있다. 해당 token은 Entra ID에서 발급받고 관리되어진다. 이와 같은 경우 token에 대한 이해가 없다면 동작방식을 이해하는데 어려움이 따를수 있다.&lt;/p&gt;
&lt;h1&gt;Tokens&lt;/h1&gt;
&lt;p&gt;제공되는 token의 종류는 총 3가지로 아래와 같다. &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Access Token : Oauth2 용(즉, 허가용)&lt;/li&gt;
&lt;li&gt;Refresh Token : Access Token 재발급을 위한 token&lt;/li&gt;
&lt;li&gt;ID token : OIDC 용 (즉, 인증용)  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity-platform/security-tokens&quot;&gt;https://learn.microsoft.com/en-us/entra/identity-platform/security-tokens&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Token configuration&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Access token lifecycle : 기본으로 60 ~ 90 min (&lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity-platform/access-tokens#token-lifetime&quot;&gt;https://learn.microsoft.com/en-us/entra/identity-platform/access-tokens#token-lifetime&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Refresh token lifecycle :&lt;ul&gt;
&lt;li&gt;사용할때마다 갱신 되며 최대는 90 days (&lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity-platform/configurable-token-lifetimes#refresh-and-session-token-lifetime-policy-properties&quot;&gt;https://learn.microsoft.com/en-us/entra/identity-platform/configurable-token-lifetimes#refresh-and-session-token-lifetime-policy-properties&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;access token을 1시간마다 재발급 받는 과정에서 refresh token도 새로 발급됨 : &lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens#token-lifetime&quot;&gt;https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens#token-lifetime&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;Refresh token expire time은 지정불가&lt;br&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens#token-timeouts&quot;&gt;https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens#token-timeouts&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;default token revocation 기간&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens#token-revocation&quot;&gt;https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens#token-revocation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;2021-01-30 이후로 default로만 제공되며 이전에는 refresh token 설정이 가능했다.&lt;br&gt;현재는 conditional access 정책으로 관리하도록 한다.&lt;br&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity-platform/configurable-token-lifetimes#refresh-and-session-token-lifetime-policy-properties&quot;&gt;https://learn.microsoft.com/en-us/entra/identity-platform/configurable-token-lifetimes#refresh-and-session-token-lifetime-policy-properties&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;다음과 같은 conditional access 정책에 따라 인증을 해제할수 있다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity/conditional-access/howto-conditional-access-session-lifetime&quot;&gt;https://learn.microsoft.com/en-us/entra/identity/conditional-access/howto-conditional-access-session-lifetime&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Refresh Token Expire&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;최대 수명 : 90일&lt;br&gt;(Refresh Token이 rotation을 계속 하더라도 90일 이후에는 재로그인이 필요)&lt;/li&gt;
&lt;li&gt;idle Timeout : 14일&lt;br&gt;(Refresh Token 사용 안하고 14일 지나면 expire)&lt;ul&gt;
&lt;li&gt;여기서 사용을 안한다는 의미는 cli나 sdk 등을 통한 인증과정이 한번이라도 포함된 명령 수행이 없는 경우를 의미해.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;Refresh token이 만료되지 않은 경우 cli/sdk 등을 통한 인증과정을 같이 수행하는 명령이 수행되어지는 경우&lt;br&gt;Access Token이 만료되어 있다면 재발급이 이루어진다. 즉, CLI / SDK / Application 이 idle 상태로 인증을 수행하는 과정이 없는 경우라면 재발급이 발생되지 않는다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;Refresh tokens replace themselves with a fresh token upon every use&lt;/code&gt;&lt;br&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens#token-lifetime&quot;&gt;https://learn.microsoft.com/en-us/entra/identity-platform/refresh-tokens#token-lifetime&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cswrld.com/2024/06/microsoft-entra-id-token-lifetime-and-revocation/&quot;&gt;https://www.cswrld.com/2024/06/microsoft-entra-id-token-lifetime-and-revocation/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Cloud/Public Cloud</category>
      <category>Entra ID token</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/427907</guid>
      <comments>https://mr100do.tistory.com/427907#entry427907comment</comments>
      <pubDate>Wed, 26 Feb 2025 10:20:06 +0900</pubDate>
    </item>
    <item>
      <title>fluentbit with azure blob storage</title>
      <link>https://mr100do.tistory.com/427869</link>
      <description>&lt;h1&gt;installation&lt;/h1&gt;
&lt;p&gt;fluentbit install using helm chart&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ helm repo add fluent https://fluent.github.io/helm-charts
$ kubectl create ns logging
$ helm upgrade --install fluent-bit fluent/fluent-bit -n logging&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;create storage account and blob container&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ az storage account create -n fluentbitteststor -g fluentbittest-rg -l koreacentral --sku Standard_LRS&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;config for azure blob&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ kubectl edit configmap fluent-bit -n logging
...
    [OUTPUT]
        name                  azure_blob
        match                 *
        account_name          fluentbitteststor
        shared_key            xxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
        path                  k8slogs
        container_name        fluentbittest
        auto_create_container on
        tls                   on&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;a href=&quot;https://docs.fluentbit.io/manual/pipeline/outputs/azure_blob&quot;&gt;https://docs.fluentbit.io/manual/pipeline/outputs/azure_blob&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;full configmap&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  custom_parsers.conf: |
    [PARSER]
        Name docker_no_time
        Format json
        Time_Keep Off
        Time_Key time
        Time_Format %Y-%m-%dT%H:%M:%S.%L
  fluent-bit.conf: |
    [SERVICE]
        Daemon Off
        Flush 1
        Log_Level info
        Parsers_File /fluent-bit/etc/parsers.conf
        Parsers_File /fluent-bit/etc/conf/custom_parsers.conf
        HTTP_Server On
        HTTP_Listen 0.0.0.0
        HTTP_Port 2020
        Health_Check On

    [INPUT]
        Name tail
        Path /var/log/containers/*.log
        multiline.parser docker, cri
        Tag kube.*
        Mem_Buf_Limit 5MB
        Skip_Long_Lines On

    [INPUT]
        Name systemd
        Tag host.*
        Systemd_Filter _SYSTEMD_UNIT=kubelet.service
        Read_From_Tail On

    [INPUT]
        Name tail
        Path /var/log/*.log
        Tag system.*

    [FILTER]
        Name kubernetes
        Match kube.*
        Merge_Log On
        Keep_Log Off
        K8S-Logging.Parser On
        K8S-Logging.Exclude On

    [OUTPUT]
        name                  azure_blob
        match                 *
        account_name          fluentbitteststor
        shared_key            xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
        path                  k8slogs
        container_name        fluentbittest
        auto_create_container on
        tls                   on&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;restart daemonset&lt;/h1&gt;
&lt;p&gt;After modifying the fluent-bit configmap, run rollout like below. &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ kubectl rollout restart ds fluent-bit -n logging
daemonset.apps/fluent-bit restarted&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;storage browser&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SdlVl/btsJifd74UZ/GlNLqtorTWn0S8CQsYkK5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SdlVl/btsJifd74UZ/GlNLqtorTWn0S8CQsYkK5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SdlVl/btsJifd74UZ/GlNLqtorTWn0S8CQsYkK5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSdlVl%2FbtsJifd74UZ%2FGlNLqtorTWn0S8CQsYkK5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;676&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/427869</guid>
      <comments>https://mr100do.tistory.com/427869#entry427869comment</comments>
      <pubDate>Tue, 27 Aug 2024 13:32:00 +0900</pubDate>
    </item>
    <item>
      <title>kubernetes authentication with cURL using service account</title>
      <link>https://mr100do.tistory.com/1601</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;kubernetes service account를 사용하여 cURL로 kubernetes에 접근하는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 yaml을 통해 SA(service account) role, rolebinding 그리고 secret을 생성한다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: onlypods
rules:
- apiGroups: [&quot;&quot;]
  resources: [&quot;pods&quot;]
  verbs: [&quot;get&quot;, &quot;watch&quot;, &quot;list&quot;]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: curltest
  namespace: default
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: onlyreadpods
  namespace: default
subjects:
- kind: ServiceAccount
  name:  curltest
roleRef:
  kind: Role
  name: onlypods
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: curltest-secret
  annotations:
    kubernetes.io/service-account.name: curltest&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 1.24 이후부터 service account를 생성하더라도 secret을 자동으로 만들지 않기에 직접 생성을 해주어야 한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 kubectl 명령 수행이 가능한 환경이라면 가능하다면 아래와 같은 TOKEN과 ca.crt를 가져와 cURL을 통핸 pod 정보를 가져올수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;#!/bin/bash

APISERVER=$(kubectl config view -o jsonpath='{.clusters[].cluster.server}')

TOKEN=$(kubectl get secret curltest-secret -o jsonpath='{.data.token}' | base64 -d)

kubectl get secret curltest-secret -o jsonpath='{.data.ca\.crt}' | base64 -d &amp;gt; test-ca.crt

curl -H &quot;Authorization: Bearer $TOKEN&quot; --cacert kube-ca.crt &quot;$APISERVER/api/v1/namespaces/default/pods&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 아래와 같은 결과가 출력된다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;{
  &quot;kind&quot;: &quot;PodList&quot;,
  &quot;apiVersion&quot;: &quot;v1&quot;,
  &quot;metadata&quot;: {
  ...&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Reference&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/55415867/curl-kubernetes-with-serivceaccount-token-it-always-returns-unauthorized&quot;&gt;https://stackoverflow.com/questions/55415867/curl-kubernetes-with-serivceaccount-token-it-always-returns-unauthorized&lt;/a&gt;&lt;/p&gt;</description>
      <category>Cloud/Cloud Native</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/1601</guid>
      <comments>https://mr100do.tistory.com/1601#entry1601comment</comments>
      <pubDate>Tue, 2 Apr 2024 16:44:55 +0900</pubDate>
    </item>
    <item>
      <title>Retina</title>
      <link>https://mr100do.tistory.com/1600</link>
      <description>&lt;h1&gt;Introduce Retina&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 트래픽(capture)과 metric 수집하고 저장하는것을 도와주는 도구이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Metrics (eBPF 프로그램을 주입하여 지속가능한 형태로 저장)&lt;/li&gt;
&lt;li&gt;Captures (일시적인 tcpdump 형태이며 custom 하게 지정이 가능함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Retina 와 관련된 주요 링크들&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://retina.sh/&quot;&gt;https://retina.sh/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/retina&quot;&gt;https://github.com/microsoft/retina&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Architecture&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://retina.sh/docs/intro#extendable-architecture&quot;&gt;https://retina.sh/docs/intro#extendable-architecture&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;Install&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식적인 helm chart를 제공하고 있지는 않다.&lt;br /&gt;이를 사용하기 위해서는 retina 공식 github 저장소에서 clone 받은 source를 이용하여&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;$ make helm-install
$ ## 혹은 operator를 통한 설치를 하고자 한다면,,
$ make helm-install-with-operator&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 배포시 아래와 같은 형태로 helm install이 진행된다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;helm upgrade --install retina ./deploy/manifests/controller/helm/retina/ \
        --namespace kube-system \
        --set image.repository=ghcr.io/microsoft/retina/retina-agent \
        --set image.initRepository=ghcr.io/microsoft/retina/retina-init \
        --set image.tag=v0.0.1 \
        --set operator.tag=v0.0.1 \
        --set image.pullPolicy=Always \
        --set logLevel=info \
        --set os.windows=true \
        --set operator.enabled=true \
        --set operator.enableRetinaEndpoint=true \
        --set operator.repository=ghcr.io/microsoft/retina/retina-operator \
        --skip-crds \
        --set enabledPlugin_linux=&quot;\[dropreason\,packetforward\,linuxutil\,dns\,packetparser\]&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 deployment 및 daemonset이 배포되어진다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ k get ds -n kube-system -l k8s-app=retina
NAME               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR              AGE
retina-agent       3         3         2       3            2           kubernetes.io/os=linux     3m17s
retina-agent-win   0         0         0       0            0           kubernetes.io/os=windows   3m17s&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;monitoring&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;additionalscrapconfigs를 추가한다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;$ cat retina-values.yaml
prometheus:
  prometheusSpec:
    additionalScrapeConfigs: |
      - job_name: &quot;retina-pods&quot;
        kubernetes_sd_configs:
          - role: pod
        relabel_configs:
          - source_labels: [__meta_kubernetes_pod_container_name]
            action: keep
            regex: retina(.*)
          - source_labels:
              [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
            separator: &quot;:&quot;
            regex: ([^:]+)(?::\d+)?
            target_label: __address__
            replacement: ${1}:${2}
            action: replace
          - source_labels: [__meta_kubernetes_pod_node_name]
            action: replace
            target_label: instance
        metric_relabel_configs:
          - source_labels: [__name__]
            action: keep
            regex: (.*)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/retina/blob/main/deploy/prometheus/values.yaml&quot;&gt;https://github.com/microsoft/retina/blob/main/deploy/prometheus/values.yaml&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ helm upgrade -f retina-values.yaml kube-prom-stack prometheus-community/kube-prometheus-stack -n monitoring&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;How to use&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;retina binary&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크를 따라 kubectl-retian binary를 설치한다.&lt;br /&gt;(krew로 설치하거나 download를 받아 PATH가 지정된 곳에 넣어주어도 된다.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://retina.sh/docs/installation/cli&quot;&gt;https://retina.sh/docs/installation/cli&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;job을 통해 capture를 수행하기에 별도의 CRD 설치가 필요하지는 않다.&lt;br /&gt;만약 blob의 token이 포함된 SAS등의 민감정보로 직접 명령을 수행하는것이 어렵다면&lt;br /&gt;CRD를 통해서도 capture가 가능하다. (&lt;a href=&quot;https://retina.sh/docs/captures/&quot;&gt;https://retina.sh/docs/captures/&lt;/a&gt;)&lt;br /&gt;다시 말하자면, kubectl-retian binary 설치만으로 kubectl 명령으로 capture 및 blob에 저장이 가능하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hostpath로 capture 파일 생성은 아래와 같은 명령으로 수행 가능하다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ kubectl retina capture create --name capturetestjacob0 --namespace default --pod-selectors=&quot;app=nginx-sample&quot;  --host-path /mnt/capture
ts=2024-06-04T10:58:53.947+0900 level=info caller=capture/create.go:243 msg=&quot;The capture duration is set to 1m0s&quot;
ts=2024-06-04T10:58:53.947+0900 level=info caller=capture/create.go:289 msg=&quot;The capture file max size is set to 100MB&quot;
ts=2024-06-04T10:58:53.947+0900 level=info caller=utils/capture_image.go:56 msg=&quot;Using capture workload image ghcr.io/microsoft/retina/retina-agent:v0.0.11 with version determined by CLI version&quot;
ts=2024-06-04T10:58:53.948+0900 level=info caller=capture/crd_to_job.go:201 msg=&quot;HostPath is not empty&quot; HostPath=/mnt/capture
ts=2024-06-04T10:58:54.083+0900 level=info caller=capture/crd_to_job.go:876 msg=&quot;The Parsed tcpdump filter is \&quot;\&quot;&quot;
ts=2024-06-04T10:58:54.109+0900 level=info caller=capture/create.go:369 msg=&quot;Packet capture job is created&quot; namespace=default capture job=capturetestjacob0-2xbnf
ts=2024-06-04T10:58:54.109+0900 level=info caller=capture/create.go:125 msg=&quot;Please manually delete all capture jobs&quot;
NAMESPACE   CAPTURE NAME        JOBS                      COMPLETIONS   AGE
default     capturetestjacob0   capturetestjacob0-2xbnf   0/1           1s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Azure Storage Account 의 blob에 capture 파일을 업로드 할수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ $ kubectl retina capture create --namespace default --pod-selectors=&quot;app=nginx-sample&quot; --blob-upload=&quot;https://azstorageaccountname.blob.core.windows.net/captureblob?sp=raw&amp;amp;st=xxxxxxxxxxxx&quot; --name capturetestbyjacob1
ts=2024-06-04T10:55:48.130+0900 level=info caller=capture/create.go:243 msg=&quot;The capture duration is set to 1m0s&quot;
ts=2024-06-04T10:55:48.130+0900 level=info caller=capture/create.go:289 msg=&quot;The capture file max size is set to 100MB&quot;
ts=2024-06-04T10:55:48.264+0900 level=info caller=utils/capture_image.go:56 msg=&quot;Using capture workload image ghcr.io/microsoft/retina/retina-agent:v0.0.11 with version determined by CLI version&quot;
ts=2024-06-04T10:55:48.266+0900 level=info caller=capture/crd_to_job.go:224 msg=&quot;BlobUpload is not empty&quot;
ts=2024-06-04T10:55:48.331+0900 level=info caller=capture/crd_to_job.go:876 msg=&quot;The Parsed tcpdump filter is \&quot;\&quot;&quot;
ts=2024-06-04T10:55:48.349+0900 level=info caller=capture/create.go:369 msg=&quot;Packet capture job is created&quot; namespace=default capture job=capturetestbyjacob1-2cz48
ts=2024-06-04T10:55:48.349+0900 level=info caller=capture/create.go:125 msg=&quot;Please manually delete all capture jobs&quot;
ts=2024-06-04T10:55:48.349+0900 level=info caller=capture/create.go:127 msg=&quot;Please manually delete capture secret&quot; namespace=default secret name=capture-blob-upload-secretsjvwh
NAMESPACE   CAPTURE NAME          JOBS                        COMPLETIONS   AGE
default     capturetestbyjacob1   capturetestbyjacob1-2cz48   0/1           0s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완료된후 kubectl-retina 에서 제공하는 capture list parameter로 확인 가능하며 job으로도 볼수 있다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ kubectl retina capture list
NAMESPACE   CAPTURE NAME           JOBS                         COMPLETIONS   AGE
default     retina-capture-2vqh6   retina-capture-2vqh6-cf4kg   1/1           4m30s
default     retina-capture-mb862   retina-capture-mb862-jzns9   1/1           2m16s
default     retina-capture-tckbw   retina-capture-tckbw-swlt7   1/1           4m42s

$ kubectl get jobs
NAME                         COMPLETIONS   DURATION   AGE
retina-capture-2vqh6-cf4kg   1/1           70s        4m17s
retina-capture-mb862-jzns9   1/1           71s        2m3s
retina-capture-tckbw-swlt7   1/1           80s        4m29s&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 capture 가 가능하며 실제로 storageaccount에서 확인해보면 아래와 같은 tar 파일이 생성된것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3WMZ9/btsHM6KXGjB/CqphcI6oFhO6Pm3GMv54Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3WMZ9/btsHM6KXGjB/CqphcI6oFhO6Pm3GMv54Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3WMZ9/btsHM6KXGjB/CqphcI6oFhO6Pm3GMv54Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3WMZ9%2FbtsHM6KXGjB%2FCqphcI6oFhO6Pm3GMv54Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1630&quot; height=&quot;452&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;azure storageaccount 및 hostpath, PVC를 통해 capture 된 tar 파일을 받을수도 있으며&lt;br /&gt;s3 규격을 맞춘 storage 의 경우 지원이 된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://retina.sh/docs/CRDs/Capture#fields&quot;&gt;https://retina.sh/docs/CRDs/Capture#fields&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;metric&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 plugin을 추가하여 다양한&lt;br /&gt;&lt;a href=&quot;https://retina.sh/docs/metrics/plugins/packetforward&quot;&gt;https://retina.sh/docs/metrics/plugins/packetforward&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 아래와 같은 metric이&lt;/p&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;root@aks-nodepool1-26826537-vmss00000A:/# curl 10.224.0.4:18080/metrics
# HELP certwatcher_read_certificate_errors_total Total number of certificate read errors
# TYPE certwatcher_read_certificate_errors_total counter
certwatcher_read_certificate_errors_total 0
# HELP certwatcher_read_certificate_total Total number of certificate reads
# TYPE certwatcher_read_certificate_total counter
certwatcher_read_certificate_total 0
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile=&quot;0&quot;} 5.0899e-05
go_gc_duration_seconds{quantile=&quot;0.25&quot;} 6.75e-05
go_gc_duration_seconds{quantile=&quot;0.5&quot;} 0.0001773
go_gc_duration_seconds{quantile=&quot;0.75&quot;} 0.000183199
go_gc_duration_seconds{quantile=&quot;1&quot;} 0.000394699
go_gc_duration_seconds_sum 0.000980497
go_gc_duration_seconds_count 6
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 30
# HELP go_info Information about the Go environment.
# TYPE go_info gauge
go_info{version=&quot;go1.21.8&quot;} 1
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
# TYPE go_memstats_alloc_bytes gauge
go_memstats_alloc_bytes 4.1930528e+07
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
# TYPE go_memstats_alloc_bytes_total counter
go_memstats_alloc_bytes_total 6.376612e+07
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table.
# TYPE go_memstats_buck_hash_sys_bytes gauge
go_memstats_buck_hash_sys_bytes 1.551113e+06
# HELP go_memstats_frees_total Total number of frees.
# TYPE go_memstats_frees_total counter
go_memstats_frees_total 198985
# HELP go_memstats_gc_sys_bytes Number of bytes used for garbage collection system metadata.
# TYPE go_memstats_gc_sys_bytes gauge
go_memstats_gc_sys_bytes 5.046112e+06
# HELP go_memstats_heap_alloc_bytes Number of heap bytes allocated and still in use.
# TYPE go_memstats_heap_alloc_bytes gauge
go_memstats_heap_alloc_bytes 4.1930528e+07
# HELP go_memstats_heap_idle_bytes Number of heap bytes waiting to be used.
# TYPE go_memstats_heap_idle_bytes gauge
go_memstats_heap_idle_bytes 8.97024e+06
# HELP go_memstats_heap_inuse_bytes Number of heap bytes that are in use.
# TYPE go_memstats_heap_inuse_bytes gauge
go_memstats_heap_inuse_bytes 4.4802048e+07
# HELP go_memstats_heap_objects Number of allocated objects.
# TYPE go_memstats_heap_objects gauge
go_memstats_heap_objects 368726
# HELP go_memstats_heap_released_bytes Number of heap bytes released to OS.
# TYPE go_memstats_heap_released_bytes gauge
go_memstats_heap_released_bytes 2.53952e+06
# HELP go_memstats_heap_sys_bytes Number of heap bytes obtained from system.
# TYPE go_memstats_heap_sys_bytes gauge
go_memstats_heap_sys_bytes 5.3772288e+07
# HELP go_memstats_last_gc_time_seconds Number of seconds since 1970 of last garbage collection.
# TYPE go_memstats_last_gc_time_seconds gauge
go_memstats_last_gc_time_seconds 1.7111824243566203e+09
# HELP go_memstats_lookups_total Total number of pointer lookups.
# TYPE go_memstats_lookups_total counter
go_memstats_lookups_total 0
# HELP go_memstats_mallocs_total Total number of mallocs.
# TYPE go_memstats_mallocs_total counter
go_memstats_mallocs_total 567711
# HELP go_memstats_mcache_inuse_bytes Number of bytes in use by mcache structures.
# TYPE go_memstats_mcache_inuse_bytes gauge
go_memstats_mcache_inuse_bytes 2400
# HELP go_memstats_mcache_sys_bytes Number of bytes used for mcache structures obtained from system.
# TYPE go_memstats_mcache_sys_bytes gauge
go_memstats_mcache_sys_bytes 15600
# HELP go_memstats_mspan_inuse_bytes Number of bytes in use by mspan structures.
# TYPE go_memstats_mspan_inuse_bytes gauge
go_memstats_mspan_inuse_bytes 482496
# HELP go_memstats_mspan_sys_bytes Number of bytes used for mspan structures obtained from system.
# TYPE go_memstats_mspan_sys_bytes gauge
go_memstats_mspan_sys_bytes 505176
# HELP go_memstats_next_gc_bytes Number of heap bytes when next garbage collection will take place.
# TYPE go_memstats_next_gc_bytes gauge
go_memstats_next_gc_bytes 8.2977432e+07
# HELP go_memstats_other_sys_bytes Number of bytes used for other system allocations.
# TYPE go_memstats_other_sys_bytes gauge
go_memstats_other_sys_bytes 611673
# HELP go_memstats_stack_inuse_bytes Number of bytes in use by the stack allocator.
# TYPE go_memstats_stack_inuse_bytes gauge
go_memstats_stack_inuse_bytes 753664
# HELP go_memstats_stack_sys_bytes Number of bytes obtained from system for stack allocator.
# TYPE go_memstats_stack_sys_bytes gauge
go_memstats_stack_sys_bytes 753664
# HELP go_memstats_sys_bytes Number of bytes obtained from system.
# TYPE go_memstats_sys_bytes gauge
go_memstats_sys_bytes 6.2255626e+07
# HELP go_threads Number of OS threads created.
# TYPE go_threads gauge
go_threads 9
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 1.4
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1.048576e+06
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 52
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 1.11316992e+08
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1.71118218107e+09
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 1.338843136e+09
# HELP process_virtual_memory_max_bytes Maximum amount of virtual memory available in bytes.
# TYPE process_virtual_memory_max_bytes gauge
process_virtual_memory_max_bytes 1.8446744073709552e+19
# HELP rest_client_request_duration_seconds Request latency in seconds. Broken down by verb, and host.
# TYPE rest_client_request_duration_seconds histogram
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;0.005&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;0.025&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;0.1&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;0.25&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;0.5&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;1&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;2&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;4&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;8&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;15&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;30&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;60&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;,le=&quot;+Inf&quot;} 2
rest_client_request_duration_seconds_sum{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;} 0.039509378
rest_client_request_duration_seconds_count{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/api&quot;,verb=&quot;GET&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;0.005&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;0.025&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;0.1&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;0.25&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;0.5&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;1&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;2&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;4&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;8&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;15&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;30&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;60&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;,le=&quot;+Inf&quot;} 2
rest_client_request_duration_seconds_sum{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;} 0.021485134
rest_client_request_duration_seconds_count{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/apis&quot;,verb=&quot;GET&quot;} 2
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;0.005&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;0.025&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;0.1&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;0.25&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;0.5&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;1&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;2&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;4&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;8&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;15&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;30&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;60&quot;} 1
rest_client_request_duration_seconds_bucket{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;,le=&quot;+Inf&quot;} 1
rest_client_request_duration_seconds_sum{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;} 0.001631895
rest_client_request_duration_seconds_count{host=&quot;https://karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443/version&quot;,verb=&quot;GET&quot;} 1
# HELP rest_client_request_size_bytes Request size in bytes. Broken down by verb and host.
# TYPE rest_client_request_size_bytes histogram
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;64&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;256&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;512&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;1024&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;4096&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;16384&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;65536&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;262144&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;1.048576e+06&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;4.194304e+06&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;1.6777216e+07&quot;} 5
rest_client_request_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;+Inf&quot;} 5
rest_client_request_size_bytes_sum{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;} 0
rest_client_request_size_bytes_count{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;} 5
# HELP rest_client_requests_total Number of HTTP requests, partitioned by status code, method, and host.
# TYPE rest_client_requests_total counter
rest_client_requests_total{code=&quot;200&quot;,host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,method=&quot;GET&quot;} 5
# HELP rest_client_response_size_bytes Response size in bytes. Broken down by verb and host.
# TYPE rest_client_response_size_bytes histogram
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;64&quot;} 0
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;256&quot;} 0
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;512&quot;} 1
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;1024&quot;} 1
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;4096&quot;} 1
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;16384&quot;} 3
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;65536&quot;} 5
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;262144&quot;} 5
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;1.048576e+06&quot;} 5
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;4.194304e+06&quot;} 5
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;1.6777216e+07&quot;} 5
rest_client_response_size_bytes_bucket{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;,le=&quot;+Inf&quot;} 5
rest_client_response_size_bytes_sum{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;} 84242
rest_client_response_size_bytes_count{host=&quot;karpenter2-karpenter2test-6fb462-rcp6iqyi.hcp.koreacentral.azmk8s.io:443&quot;,verb=&quot;GET&quot;} 5&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxYNcr/btsF9H0xtTI/tVkmupTmpChuKOLntfrD8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxYNcr/btsF9H0xtTI/tVkmupTmpChuKOLntfrD8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxYNcr/btsF9H0xtTI/tVkmupTmpChuKOLntfrD8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxYNcr%2FbtsF9H0xtTI%2FtVkmupTmpChuKOLntfrD8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1128&quot; height=&quot;650&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cliZgF/btsF8vNaJYj/9l2OCk9HVPgxjfdNh5bGC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cliZgF/btsF8vNaJYj/9l2OCk9HVPgxjfdNh5bGC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cliZgF/btsF8vNaJYj/9l2OCk9HVPgxjfdNh5bGC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcliZgF%2FbtsF8vNaJYj%2F9l2OCk9HVPgxjfdNh5bGC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;602&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLlj84/btsGbUEfU5f/1HYWUI5tn8r9LwyVt2IRm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLlj84/btsGbUEfU5f/1HYWUI5tn8r9LwyVt2IRm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLlj84/btsGbUEfU5f/1HYWUI5tn8r9LwyVt2IRm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLlj84%2FbtsGbUEfU5f%2F1HYWUI5tn8r9LwyVt2IRm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1862&quot; height=&quot;892&quot; data-origin-width=&quot;1862&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;drop_count&lt;/li&gt;
&lt;li&gt;drop_bytes&lt;/li&gt;
&lt;li&gt;forward_count&lt;/li&gt;
&lt;li&gt;forward_bytes&lt;/li&gt;
&lt;li&gt;tcp_state&lt;/li&gt;
&lt;li&gt;tcp_connection_remote&lt;/li&gt;
&lt;li&gt;tcp&lt;br /&gt;&lt;a href=&quot;https://github.com/microsoft/retina/blob/9f455ca581af8b5355386d55ed0a70e2ee86ef20/pkg/utils/metric_names.go#L14-L35&quot;&gt;https://github.com/microsoft/retina/blob/9f455ca581af8b5355386d55ed0a70e2ee86ef20/pkg/utils/metric_names.go#L14-L35&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;capture&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;azure blob storage로 capture 파일을 전달&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://retina.sh/docs/captures/#example-1&quot;&gt;https://retina.sh/docs/captures/#example-1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;kubectl-retina&lt;/h5&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CLI 도구로 사용이 가능하며 사용시 kubernetes 의 Node 단에 capture된 패킷 덤프 파일이 남겨지게 된다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;$ kubectl-retina
Usage:
   [command]

Available Commands:
  capture     Retina Capture - capture network traffic
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  version     Show version

Flags:
  -h, --help   help for this command

Use &quot; [command] --help&quot; for more information about a command.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://retina.sh/docs/captures/cli&quot;&gt;https://retina.sh/docs/captures/cli&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node 가 3개일 경우 3개의 job이 생성&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;$ kubectl retina capture list --namespace capture
NAMESPACE   CAPTURE NAME           JOBS                                                                               COMPLETIONS   AGE
capture     retina-capture-n4h8m   retina-capture-n4h8m-ffkpp,retina-capture-n4h8m-q75gj,retina-capture-n4h8m-zwfpp   3/3           5h40m&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ k get job -A
NAMESPACE   NAME                         COMPLETIONS   DURATION   AGE
capture     retina-capture-n4h8m-ffkpp   1/1           84s        5h40m
capture     retina-capture-n4h8m-q75gj   1/1           84s        5h40m
capture     retina-capture-n4h8m-zwfpp   1/1           87s        5h40m
$ k get pod -n capture
NAME                               READY   STATUS      RESTARTS   AGE
retina-capture-n4h8m-ffkpp-x8kr9   0/1     Completed   0          5h40m
retina-capture-n4h8m-q75gj-tddqc   0/1     Completed   0          5h40m
retina-capture-n4h8m-zwfpp-nf5dz   0/1     Completed   0          5h40m&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 노드로 접근(e.g. node-shell)하여 확인해보면 다음과 같은 경로에 tar 파일이 존재한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;root@aks-nodepool1-26826537-vmss000006:/mnt/capture# ls -al
total 464
drwxr-xr-x 2 root root   4096 Mar 22 03:03 .
drwxr-xr-x 4 root root   4096 Mar 22 03:01 ..
-rw-r--r-- 1 root root 464849 Mar 22 03:03 retina-capture-n4h8m-aks-nodepool1-26826537-vmss000006-20240322030207UTC.tar.gz&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;custom build&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://retina.sh/docs/contributing/developing#environment-config&quot;&gt;https://retina.sh/docs/contributing/developing#environment-config&lt;/a&gt;&lt;br /&gt;사전에 llvm 설치 필요.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;$ sudo apt install llvm clang -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 아래 명령을 통해 build 를 수행할수 있다.&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;$ make retina-binary&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;개인적으로 생각한 이점들&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 CNI에 종석되어 있지 않다. eBPF를 사용하여 CNI에 제한없이 사용이 가능&lt;/li&gt;
&lt;li&gt;packet dump를 하고 이를 다양한 목적지로 보내줄수 있다.&lt;/li&gt;
&lt;li&gt;단순 packet dump 만이 아닌 socket 정보 부터 arp, iptables 정보등 다양한 네트워크 단의 정보를 확인해볼수 있도록 해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/microsoft/retina/blob/main/docs/01-Introduction/01-intro.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/microsoft/retina/blob/main/docs/01-Introduction/01-intro.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Cloud/Kubernetes</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/1600</guid>
      <comments>https://mr100do.tistory.com/1600#entry1600comment</comments>
      <pubDate>Fri, 22 Mar 2024 17:42:51 +0900</pubDate>
    </item>
    <item>
      <title>how to check certificate with openssl</title>
      <link>https://mr100do.tistory.com/1567</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Subject : 소유자의 데이터로 domain 정보가 포함된다.&lt;/li&gt;
&lt;li&gt;Issuer : CA를 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;CA(Certificate Authority)&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subject 및 issuer 확인&lt;/p&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;$ curl -sL https://certs.godaddy.com/repository/gdroot-g2.crt | openssl x509 -subject -noout
subject=C = US, ST = Arizona, L = Scottsdale, O = &quot;GoDaddy.com, Inc.&quot;, CN = Go Daddy Root Certificate Authority - G2
$ curl -sL https://certs.godaddy.com/repository/gdroot-g2.crt | openssl x509 -issuer -noout
issuer=C = US, ST = Arizona, L = Scottsdale, O = &quot;GoDaddy.com, Inc.&quot;, CN = Go Daddy Root Certificate Authority - G2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;expire time 확인&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ curl -sL https://certs.godaddy.com/repository/gdroot-g2.crt | openssl x509 -enddate -noout
notAfter=Dec 31 23:59:59 2037 GMT&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;certificate&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subject 및 issuer 확인&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;$ cat jacobbaek.com/cert.pem  | openssl x509 -subject -noout
subject=CN = *.jacobbaek.com
$ cat jacobbaek.com/cert.pem  | openssl x509 -issuer -noout
issuer=C = US, O = Let's Encrypt, CN = R3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;expire time 확인&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$ cat jacobbaek.com/cert.pem  | openssl x509 -enddate -noout
notAfter=Jan 15 01:50:45 2024 GMT&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;certificate&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;아래는 실제 서비스 되고 있는 url에 직접 요청을 보내서 certificate 정보를 확인하는 방법이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;server certificate 가져오기&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;$ SERVERURL=&quot;www.google.com&quot;
$ openssl s_client -connect $SERVERURL:443 2&amp;gt;/dev/null &amp;lt;/dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;subjet 확인&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;$ SERVERURL=&quot;www.google.com&quot;
$ openssl s_client -connect $SERVERURL:443 2&amp;gt;/dev/null &amp;lt;/dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | openssl x509 -subject -noout&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ip와 domain을 포함시켜 요청을 보내 certificate 확인&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ openssl s_client -connect x.x.x.x:443 -servername testdomain.com &amp;lt; /dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;References&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/40061263/what-is-ca-certificate-and-why-do-we-need-it&quot;&gt;https://stackoverflow.com/questions/40061263/what-is-ca-certificate-and-why-do-we-need-it&lt;/a&gt;&lt;/p&gt;</description>
      <category>Security/System&amp;amp;Tools</category>
      <category>openssl certificate</category>
      <author>Jacob_baek</author>
      <guid isPermaLink="true">https://mr100do.tistory.com/1567</guid>
      <comments>https://mr100do.tistory.com/1567#entry1567comment</comments>
      <pubDate>Wed, 29 Nov 2023 10:38:50 +0900</pubDate>
    </item>
  </channel>
</rss>