<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>초급에서 고급까지</title>
    <link>https://jfbta.tistory.com/</link>
    <description>내가 알아낸 정보를 기록하면서 동시에 공유하고 싶은 마음으로 시작합니다.</description>
    <language>ko</language>
    <pubDate>Wed, 12 Aug 2026 00:03:17 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>초고도</managingEditor>
    <image>
      <title>초급에서 고급까지</title>
      <url>https://tistory1.daumcdn.net/tistory/3197461/attach/134ca2f566564c1cb07454aa54d59cc0</url>
      <link>https://jfbta.tistory.com</link>
    </image>
    <item>
      <title>[쿠버네티스] rook-ceph 대시보드 패스워드 변경</title>
      <link>https://jfbta.tistory.com/337</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ceph 명령어 입력을 위한 파드 내부 접속&lt;/h2&gt;
&lt;pre id=&quot;code_1741571807959&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl -n rook-ceph exec -it $(kubectl -n rook-ceph get pod -l &quot;app=rook-ceph-tools&quot; -o jsonpath='{.items[0].metadata.name}') bash&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;패스워드 변경&lt;/h2&gt;
&lt;pre id=&quot;code_1741571830653&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo -n &quot;1234&quot; &amp;gt; /tmp/password.txt
ceph dashboard ac-user-set-password admin -i /tmp/password.txt --force-password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;/tmp 경로에서 텍스트 파일을 생성하는 이유는 권한 때문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1741571992704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{&quot;username&quot;: &quot;admin&quot;, &quot;password&quot;: &quot;$2b$12$RbbOcLS1bZx0wkwYpiy5cOjpVmrSoAOLesE9aaCEY7Rkvd//lsfNe&quot;, &quot;roles&quot;: [&quot;administrator&quot;], &quot;name&quot;: null, &quot;email&quot;: null, &quot;lastUpdate&quot;: 1741571460, &quot;enabled&quot;: true, &quot;pwdExpirationDate&quot;: null, &quot;pwdUpdateRequired&quot;: false}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 뜨면 변경 성공이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ceph 계정 잠금 해제&lt;/h2&gt;
&lt;pre id=&quot;code_1741841847811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bash-5.1$ ceph dashboard ac-user-show admin
```
{&quot;username&quot;: &quot;admin&quot;, &quot;password&quot;: &quot;$2b$12$dvI.JwJXCWpqL2k2CXFXs.WKcL5I8yDkYvuq7xdlMkVB/ULCminPe&quot;, &quot;roles&quot;: [&quot;administrator&quot;], &quot;name&quot;: null, &quot;email&quot;: null, &quot;lastUpdate&quot;: 1741841522, &quot;enabled&quot;: false, &quot;pwdExpirationDate&quot;: null, &quot;pwdUpdateRequired&quot;: false}
```

bash-5.1$ ceph dashboard ac-user-enable admin
```
{&quot;username&quot;: &quot;admin&quot;, &quot;password&quot;: &quot;$2b$12$dvI.JwJXCWpqL2k2CXFXs.WKcL5I8yDkYvuq7xdlMkVB/ULCminPe&quot;, &quot;roles&quot;: [&quot;administrator&quot;], &quot;name&quot;: null, &quot;email&quot;: null, &quot;lastUpdate&quot;: 1741841571, &quot;enabled&quot;: true, &quot;pwdExpirationDate&quot;: null, &quot;pwdUpdateRequired&quot;: false}
```&lt;/code&gt;&lt;/pre&gt;</description>
      <category>최근 포스팅</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/337</guid>
      <comments>https://jfbta.tistory.com/337#entry337comment</comments>
      <pubDate>Mon, 10 Mar 2025 11:00:07 +0900</pubDate>
    </item>
    <item>
      <title>[kubernetes] CentOS에서 k8s 설치하기(docker X, containerd O)</title>
      <link>https://jfbta.tistory.com/286</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;시작하며&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;k8s v1.20 이후 부터 container runtime으로 docker를 사용하는 것을 중단하였다. 심지어 대안책으로 나온 dockershim까지 v1.24 이후 부터 지원을 중단하면서 docker가 필요없어져서 삭제하기로 했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;그러나 런타임에서 docker를 제거하더라도 docker에서 만든 컨테이너 이미지를 등록하고 실행하는 것은 가능하다. 이유는 docker가 생성하는 이미지는 docker에만 특정된 이미지가 아닌 OCI(Open Container Initiative)와 호환되는 이미지이기 때문이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;대안으로는 컨테이너 런타임을 위해 containerd를 설치하기로 했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;docker와 기존에 설치한 k8s를 삭제하는 방법은 아래 포스팅을 참고하길 바란다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/284&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jfbta.tistory.com/284&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709467797512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[kubernetes] CentOS에서 Docker 완전 삭제하기&quot; data-og-description=&quot;목차 시작하며 k8s v1.20 이후 부터 container runtime으로 docker를 사용하는 것을 중단하였다. 심지어 대안책으로 나온 dockershim까지 v1.24 이후 부터 지원을 중단하면서 docker가 필요없어져서 삭제하기로 &quot; data-og-host=&quot;jfbta.tistory.com&quot; data-og-source-url=&quot;https://jfbta.tistory.com/284&quot; data-og-url=&quot;https://jfbta.tistory.com/284&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b47uHh/hyVulmIwSz/8MKWcXykYUW9ZkK4ErVre0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bFNlnu/hyVueOEWZt/YA3FdgLerfewUBFVpOuVNK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/284&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jfbta.tistory.com/284&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b47uHh/hyVulmIwSz/8MKWcXykYUW9ZkK4ErVre0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bFNlnu/hyVueOEWZt/YA3FdgLerfewUBFVpOuVNK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[kubernetes] CentOS에서 Docker 완전 삭제하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 시작하며 k8s v1.20 이후 부터 container runtime으로 docker를 사용하는 것을 중단하였다. 심지어 대안책으로 나온 dockershim까지 v1.24 이후 부터 지원을 중단하면서 docker가 필요없어져서 삭제하기로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jfbta.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/285&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jfbta.tistory.com/285&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709467798428&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[kubernetes] CentOS에서 k8s 완전 삭제하기&quot; data-og-description=&quot;목차 실행 중인 도커(컨테이너, 볼륨, 이미지) 모두 제거 # 이미지 목록 docker images # 이미지 삭제 docker rmi {이미지이름} # 네트워크 목록 docker network ls # 네트워크 삭제 docker network rm {네트워크이름}&quot; data-og-host=&quot;jfbta.tistory.com&quot; data-og-source-url=&quot;https://jfbta.tistory.com/285&quot; data-og-url=&quot;https://jfbta.tistory.com/285&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/r3LIs/hyVufmvQJ2/Ilw7qqoa5C1dNSK7vjKc60/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/vSEHs/hyVulG1sCJ/KM3GfWFYj4cwdYWhGfVO0K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/285&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jfbta.tistory.com/285&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/r3LIs/hyVufmvQJ2/Ilw7qqoa5C1dNSK7vjKc60/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/vSEHs/hyVulG1sCJ/KM3GfWFYj4cwdYWhGfVO0K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[kubernetes] CentOS에서 k8s 완전 삭제하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 실행 중인 도커(컨테이너, 볼륨, 이미지) 모두 제거 # 이미지 목록 docker images # 이미지 삭제 docker rmi {이미지이름} # 네트워크 목록 docker network ls # 네트워크 삭제 docker network rm {네트워크이름}&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jfbta.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최소 사양&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;마스터 노드(Master Node):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU: 2 코어 이상&lt;/li&gt;
&lt;li&gt;RAM: 2GB 이상&lt;/li&gt;
&lt;li&gt;디스크: 20GB 이상의 여유 공간&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;워커 노드(Worker Node):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU: 1 코어 이상&lt;/li&gt;
&lt;li&gt;RAM: 1GB 이상&lt;/li&gt;
&lt;li&gt;디스크: 10GB 이상의 여유 공간&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;selinux 비활성화&lt;/h2&gt;
&lt;pre id=&quot;code_1709469089551&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 etc]# setenforce 0
setenforce: SELinux is disabled&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;swap 비활성화&lt;/h2&gt;
&lt;pre id=&quot;code_1709469061984&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 etc]# swapoff -a&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;방화벽 비활성화&lt;/h2&gt;
&lt;pre id=&quot;code_1709469172979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 etc]# systemctl disable firewalld
[root@docker03 etc]# systemctl stop firewalld&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;containerd 설치 및 설정&lt;/h2&gt;
&lt;pre id=&quot;code_1709470242028&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 etc]# yum install -y yum-utils
[root@docker03 etc]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@docker03 etc]# yum install containerd.io&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1709470583187&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 yum.repos.d]# cd /etc/modules-load.d/
[root@docker03 modules-load.d]# vim containerd.conf
---
overlay
br_netfilter
---
:wq
---
[root@docker03 modules-load.d]# modprobe overlay
[root@docker03 modules-load.d]# modprobe br_netfilter
[root@docker03 modules-load.d]# cd /etc/sysctl.d/
[root@docker03 modules-load.d]# vim 99-kubernetes-cri.conf
---
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
---
:wq
---
[root@docker03 sysctl.d]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
kernel.kptr_restrict = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/99-kubernetes-cri.conf ...
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
vm.swappiness = 1
* Applying /etc/sysctl.conf ...
vm.swappiness = 1&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1709470855348&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 modules-load.d]# vim /etc/containerd/config.toml
# 주석처리
disabled_plugins = [&quot;cri&quot;]
# 내용 추가
[plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.default_runtime.options]
SystemdCgroup = true&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다시 시작해서 적용&lt;/h3&gt;
&lt;pre id=&quot;code_1709470907067&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 modules-load.d]# systemctl restart containerd&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1709470940305&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 sysctl.d]# systemctl status containerd
● containerd.service - containerd container runtime
   Loaded: loaded (/usr/lib/systemd/system/containerd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2024-03-03 21:46:33 KST; 40s ago
     Docs: https://containerd.io
  Process: 36278 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
 Main PID: 36280 (containerd)
    Tasks: 95
   Memory: 2.5G
   CGroup: /system.slice/containerd.service
           ├─33552 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id 79fc1589e50c808b...
           ├─33571 /usr/bin/containerd-shim-runc-v2 -namespace k8s.io -id c89976f208042e39...
           ├─36280 /usr/bin/containerd
           ├─kubepods-burstable-pod00e23bc2_2a42_4688_8dd5_5d8f22291121.slice:cri-containerd:c78bcd5704bb8620872079872938755f1216650dd4b02bbc0ba429f725cfc11b
           │ ├─33952 /usr/local/bin/runsvdir -P /etc/service/enabled
           │ ├─34028 runsv felix
           │ ├─34029 runsv monitor-addresses
           │ ├─34030 runsv allocate-tunnel-addrs
           │ ├─34031 runsv node-status-reporter
           │ ├─34032 runsv bird
           │ ├─34033 runsv bird6
           │ ├─34034 runsv confd
           │ ├─34035 runsv cni
           │ ├─34037 calico-node -monitor-addresses
           │ ├─34039 calico-node -status-reporter
           │ ├─34041 calico-node -confd
           │ ├─34060 calico-node -monitor-token
           │ ├─34199 bird6 -R -s /var/run/calico/bird6.ctl -d -c /etc/calico/confd/config/...
           │ ├─34200 bird -R -s /var/run/calico/bird.ctl -d -c /etc/calico/confd/config/bi...
           │ ├─35416 calico-node -allocate-tunnel-addrs
           │ └─36086 calico-node -felix
           ├─kubepods-burstable-pod00e23bc2_2a42_4688_8dd5_5d8f22291121.slice:cri-containerd:c89976f208042e39c49168c7e4d49078e525a215b1fd3f19bef7ed33140ff078
           │ └─33608 /pause
           └─kubepods-besteffort-pod6ba323f8_4720_4a5d_9da5_01efa499f1d4.slice:cri-containerd:79fc1589e50c808bb945cefd1b62eadde9c5135d66e0edc6d83711adea15425d
             └─33598 /pause

Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.076602139+09:00&quot; l...60
Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.076983484+09:00&quot; l...io
Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.077003570+09:00&quot; l...m&quot;
Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.087167717+09:00&quot; l...n&quot;
Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.268915488+09:00&quot; l...r&quot;
Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.268974607+09:00&quot; l...r&quot;
Mar 03 21:46:33 docker03 systemd[1]: Started containerd container runtime.
Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.268990433+09:00&quot; l...t&quot;
Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.269000696+09:00&quot; l...r&quot;
Mar 03 21:46:33 docker03 containerd[36280]: time=&quot;2024-03-03T21:46:33.269077615+09:00&quot; l...s&quot;
Hint: Some lines were ellipsized, use -l to show in full.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;k8s 설치하기&lt;/h2&gt;
&lt;pre id=&quot;code_1709471026394&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 modules-load.d]# cd /etc/yum.repos.d/
[root@docker03 modules-load.d]# vim kubernetes.repo
---
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
---
:wq
---
[root@docker03 modules-load.d]# mv kubernetes.repo Kubernetes.repo
[root@docker03 modules-load.d]# yum install kubelet kubeadm kubectl --disableexcludes=kubernetes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;설치중 404 에러가 뜨는서버가 하나가 있었다. 이때는 repository 내용을 아래로 변경해서 설치하면 된다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709519635899&quot; class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;---
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
---
:wq
---&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;쿠버네티스 버전이 1.29 이후로는 아래 저장소를 사용해야한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737006097103&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
---
:wq
---&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;호스트 정보 등록&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;마스터와 워커 노드들의 정보를 입력해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1741259627145&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vim /etc/hosts

```
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.10.10.121 jfbta1 
10.10.10.122 jfbta2
10.10.10.123 jfbta3
10.10.10.124 jfbta4
```
we
```&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;호스트 정보를 정상적으로 입력하지 않은 경우 아래와 같은 에러가 발생한다.&lt;/h2&gt;
&lt;pre id=&quot;code_1741260238872&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[WARNING FileExisting-tc]: tc not found in system path
[WARNING Hostname]: hostname &quot;docker5&quot; could not be reached
[WARNING Hostname]: hostname &quot;docker5&quot;: lookup docker5 on 8.8.8.8:53: no such host&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Master인 경우&lt;/h2&gt;
&lt;pre id=&quot;code_1709471321791&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 modules-load.d]# systemctl enable kubelet
[root@docker03 modules-load.d]# kubeadm init

[root@docker03 modules-load.d]# mkdir -p $HOME/.kube
[root@docker03 modules-load.d]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@docker03 modules-load.d]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@docker03 modules-load.d]# export KUBECONFIG=/etc/kubernetes/admin.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;export KUBECONFIG=/etc/kubernetes/admin.conf -&amp;gt; 이렇게만 설정하면 서버에 접속할 때 풀릴 수가 있다. -&amp;gt; 이 경우 kubectl 명령어가 동작하지 않는다. 아래와 같이 영구적으로 저장되게 변경한다.&lt;/p&gt;
&lt;pre id=&quot;code_1741259815491&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' &amp;gt;&amp;gt; ~/.bashrc
source ~/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Worker Node인 경우&lt;/h2&gt;
&lt;pre id=&quot;code_1709471517763&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 modules-load.d]# kubeadm reset
[root@docker03 modules-load.d]# kubeadm join {Master_IP}:6443 --token {token_키} --discovery-token-ca-cert-hash sha256:{hash_token_키}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;node 추가를 위해 join하는 방법 정리 포스팅은 아래를 참고하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/287&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jfbta.tistory.com/287&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1709471784186&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[kubernetes] token, hash token 발급 후 join, node 추가 방법&quot; data-og-description=&quot;# 인증서 업데이트 kubeadm alpha certs renew all # 인증서 갱신 여부 확인 openssl x509 -in apiserver.crt -noout -text |grep ' Not ' # token 생성 및 확인(만료되면 사라지기 때문에 재생성必) kubeadm token create --print-join-&quot; data-og-host=&quot;jfbta.tistory.com&quot; data-og-source-url=&quot;https://jfbta.tistory.com/287&quot; data-og-url=&quot;https://jfbta.tistory.com/287&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bsxKQw/hyVujoUXus/xs8EW55E76Jt7sWzf1ZxcK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bdUrRl/hyVuics1Hj/446hDn3x7ZbG4KTxFEN0C0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/287&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jfbta.tistory.com/287&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bsxKQw/hyVujoUXus/xs8EW55E76Jt7sWzf1ZxcK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bdUrRl/hyVuics1Hj/446hDn3x7ZbG4KTxFEN0C0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[kubernetes] token, hash token 발급 후 join, node 추가 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;# 인증서 업데이트 kubeadm alpha certs renew all # 인증서 갱신 여부 확인 openssl x509 -in apiserver.crt -noout -text |grep ' Not ' # token 생성 및 확인(만료되면 사라지기 때문에 재생성必) kubeadm token create --print-join-&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jfbta.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Infrastructure/Docker &amp;amp; Kubernetes</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/286</guid>
      <comments>https://jfbta.tistory.com/286#entry286comment</comments>
      <pubDate>Thu, 16 Jan 2025 14:45:50 +0900</pubDate>
    </item>
    <item>
      <title>[쿠버네티스] kubectl 명령어 사용자 권한 설정 방법</title>
      <link>https://jfbta.tistory.com/336</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;root 계정에서 사용하는 경우&lt;/h2&gt;
&lt;pre id=&quot;code_1736312264335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 modules-load.d]# systemctl enable kubelet
[root@docker03 modules-load.d]# kubeadm init

[root@docker03 modules-load.d]# mkdir -p $HOME/.kube
[root@docker03 modules-load.d]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@docker03 modules-load.d]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@docker03 modules-load.d]# export KUBECONFIG=/etc/kubernetes/admin.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;user01 계정에서 사용하는 경우&lt;/h2&gt;
&lt;pre id=&quot;code_1736312344653&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[root@docker03 modules-load.d]# systemctl enable kubelet
[root@docker03 modules-load.d]# kubeadm init

[user01@docker03 modules-load.d]# mkdir -p /home/user01/.kube
[user01@docker03 modules-load.d]# sudo cp -i /etc/kubernetes/admin.conf /home/user01/.kube/config
[user01@docker03 modules-load.d]# sudo chown user01:user01 /home/user01/.kube/config
[user01@docker03 modules-load.d]# export KUBECONFIG=/home/user01/.kube/config&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>최근 포스팅</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/336</guid>
      <comments>https://jfbta.tistory.com/336#entry336comment</comments>
      <pubDate>Wed, 8 Jan 2025 14:06:02 +0900</pubDate>
    </item>
    <item>
      <title>[쿠버네티스] Ubuntu 22.04 쿠버네티스 설치 방법</title>
      <link>https://jfbta.tistory.com/334</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;목차&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;book-toc&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시작하며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 22.04 서버에 쿠버네티스를 한 번에 설치하는 글을 찾지 못하였다. 이 글로 정리하려한다. 먼저, 런타임 환경이 도커에서 컨테이너D로 변경되었기 때문에 도커를 설치할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;저장소 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. apt 업데이트&lt;/h3&gt;
&lt;pre id=&quot;code_1736145843404&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update
 
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 도커 공식 GPG key 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1736147451894&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;Stable repository 설정&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1736147474364&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;런타임 엔진 설치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;1. containerd 설치&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1736147565732&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install containerd.io&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;2. containerd 설치 및 동작 확인&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1736147804795&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;systemctl status containerd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;쿠버네티스 설치&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 메모리 스왑&lt;/h3&gt;
&lt;pre id=&quot;code_1736148048882&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo swapoff -a &amp;amp;&amp;amp; sudo sed -i '/swap/s/^/#/' /etc/fstab&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 노드간 통신을 위한 iptables에 브릿지 관련 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1736148084883&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736148458159&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1736148479429&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo sysctl --system&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. apt 업데이트 및 ca 관련&amp;nbsp; 패키지 다운로드 및 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1736148669014&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. Google Cloud GPG 키 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1736148207879&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo tee /etc/apt/trusted.gpg.d/kubernetes.asc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 쿠버네티스 gpg 및 소스 리스트 내용 추가 및 apt 업데이트&lt;/h3&gt;
&lt;pre id=&quot;code_1736148231354&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main&quot; | sudo tee /etc/apt/sources.list.d/kubernetes.list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. Kubernetes APT 저장소 추가&lt;/h3&gt;
&lt;pre id=&quot;code_1736148799652&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;deb https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /&quot; | sudo tee /etc/apt/sources.list.d/kubernetes.list

cat /etc/apt/sources.list.d/kubernetes.list&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. 패키지 목록 다시 업데이트 및 설치 목록 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1736148879499&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update

apt-cache policy kubelet&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. kubelet, kubeadm, kubectl 설치&lt;/h3&gt;
&lt;pre id=&quot;code_1736148258145&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install -y kubelet kubeadm kubectl

kubectl version --client &amp;amp;&amp;amp; kubeadm version&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9. kubelet 활성화 및 상태 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1736149085809&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl enable kubelet --now
sudo systemctl status kubelet&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10. containerd 설정 파일 수정&lt;/h3&gt;
&lt;pre id=&quot;code_1736149289416&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = &quot;&quot;
required_plugins = []
root = &quot;/var/lib/containerd&quot;
state = &quot;/run/containerd&quot;
temp = &quot;&quot;
version = 2

[cgroup]
  path = &quot;&quot;

[debug]
  address = &quot;&quot;
  format = &quot;&quot;
  gid = 0
  level = &quot;&quot;
  uid = 0

[grpc]
  address = &quot;/run/containerd/containerd.sock&quot;
  gid = 0
  max_recv_message_size = 16777216
  max_send_message_size = 16777216
  tcp_address = &quot;&quot;
  tcp_tls_ca = &quot;&quot;
  tcp_tls_cert = &quot;&quot;
  tcp_tls_key = &quot;&quot;
  uid = 0

[metrics]
  address = &quot;&quot;
  grpc_histogram = false

[plugins]

  [plugins.&quot;io.containerd.gc.v1.scheduler&quot;]
    deletion_threshold = 0
    mutation_threshold = 100
    pause_threshold = 0.02
    schedule_delay = &quot;0s&quot;
    startup_delay = &quot;100ms&quot;

  [plugins.&quot;io.containerd.grpc.v1.cri&quot;]
    device_ownership_from_security_context = false
    disable_apparmor = false
    disable_cgroup = false
    disable_hugetlb_controller = true
    disable_proc_mount = false
    disable_tcp_service = true
    drain_exec_sync_io_timeout = &quot;0s&quot;
    enable_selinux = false
    enable_tls_streaming = false
    enable_unprivileged_icmp = false
    enable_unprivileged_ports = false
    ignore_deprecation_warnings = []
    ignore_image_defined_volumes = false
    max_concurrent_downloads = 3
    max_container_log_line_size = 16384
    netns_mounts_under_state_dir = false
    restrict_oom_score_adj = false
    sandbox_image = &quot;registry.k8s.io/pause:3.6&quot;
    selinux_category_range = 1024
    stats_collect_period = 10
    stream_idle_timeout = &quot;4h0m0s&quot;
    stream_server_address = &quot;127.0.0.1&quot;
    stream_server_port = &quot;0&quot;
    systemd_cgroup = false
    tolerate_missing_hugetlb_controller = true
    unset_seccomp_profile = &quot;&quot;

    [plugins.&quot;io.containerd.grpc.v1.cri&quot;.cni]
      bin_dir = &quot;/opt/cni/bin&quot;
      conf_dir = &quot;/etc/cni/net.d&quot;
      conf_template = &quot;&quot;
      ip_pref = &quot;&quot;
      max_conf_num = 1

    [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd]
      default_runtime_name = &quot;nvidia&quot;
      disable_snapshot_annotations = true
      discard_unpacked_layers = false
      ignore_rdt_not_enabled_errors = false
      no_pivot = false
      snapshotter = &quot;overlayfs&quot;

      [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.default_runtime]
        base_runtime_spec = &quot;&quot;
        cni_conf_dir = &quot;&quot;
        cni_max_conf_num = 0
        container_annotations = []
        pod_annotations = []
        privileged_without_host_devices = false
        runtime_engine = &quot;&quot;
        runtime_path = &quot;&quot;
        runtime_root = &quot;&quot;
        runtime_type = &quot;&quot;

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.default_runtime.options]

      [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes]

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes.nvidia]
          base_runtime_spec = &quot;&quot;
          cni_conf_dir = &quot;&quot;
          cni_max_conf_num = 0
          container_annotations = []
          pod_annotations = []
          privileged_without_host_devices = false
          runtime_engine = &quot;&quot;
          runtime_path = &quot;&quot;
          runtime_root = &quot;&quot;
          runtime_type = &quot;io.containerd.runc.v2&quot;

          [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes.nvidia.options]
            BinaryName = &quot;/usr/local/nvidia/toolkit/nvidia-container-runtime&quot;
            CriuImagePath = &quot;&quot;
            CriuPath = &quot;&quot;
            CriuWorkPath = &quot;&quot;
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = &quot;&quot;
            ShimCgroup = &quot;&quot;
            SystemdCgroup = true

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes.nvidia-cdi]
          base_runtime_spec = &quot;&quot;
          cni_conf_dir = &quot;&quot;
          cni_max_conf_num = 0
          container_annotations = []
          pod_annotations = []
          privileged_without_host_devices = false
          runtime_engine = &quot;&quot;
          runtime_path = &quot;&quot;
          runtime_root = &quot;&quot;
          runtime_type = &quot;io.containerd.runc.v2&quot;

          [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes.nvidia-cdi.options]
            BinaryName = &quot;/usr/local/nvidia/toolkit/nvidia-container-runtime.cdi&quot;
            CriuImagePath = &quot;&quot;
            CriuPath = &quot;&quot;
            CriuWorkPath = &quot;&quot;
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = &quot;&quot;
            ShimCgroup = &quot;&quot;
            SystemdCgroup = true

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes.nvidia-legacy]
          base_runtime_spec = &quot;&quot;
          cni_conf_dir = &quot;&quot;
          cni_max_conf_num = 0
          container_annotations = []
          pod_annotations = []
          privileged_without_host_devices = false
          runtime_engine = &quot;&quot;
          runtime_path = &quot;&quot;
          runtime_root = &quot;&quot;
          runtime_type = &quot;io.containerd.runc.v2&quot;

          [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes.nvidia-legacy.options]
            BinaryName = &quot;/usr/local/nvidia/toolkit/nvidia-container-runtime.legacy&quot;
            CriuImagePath = &quot;&quot;
            CriuPath = &quot;&quot;
            CriuWorkPath = &quot;&quot;
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = &quot;&quot;
            ShimCgroup = &quot;&quot;
            SystemdCgroup = true

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes.runc]
          base_runtime_spec = &quot;&quot;
          cni_conf_dir = &quot;&quot;
          cni_max_conf_num = 0
          container_annotations = []
          pod_annotations = []
          privileged_without_host_devices = false
          runtime_engine = &quot;&quot;
          runtime_path = &quot;&quot;
          runtime_root = &quot;&quot;
          runtime_type = &quot;io.containerd.runc.v2&quot;

          [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.runtimes.runc.options]
            BinaryName = &quot;&quot;
            CriuImagePath = &quot;&quot;
            CriuPath = &quot;&quot;
            CriuWorkPath = &quot;&quot;
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = &quot;&quot;
            ShimCgroup = &quot;&quot;
            SystemdCgroup = true

      [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.untrusted_workload_runtime]
        base_runtime_spec = &quot;&quot;
        cni_conf_dir = &quot;&quot;
        cni_max_conf_num = 0
        container_annotations = []
        pod_annotations = []
        privileged_without_host_devices = false
        runtime_engine = &quot;&quot;
        runtime_path = &quot;&quot;
        runtime_root = &quot;&quot;
        runtime_type = &quot;&quot;

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.containerd.untrusted_workload_runtime.options]

    [plugins.&quot;io.containerd.grpc.v1.cri&quot;.image_decryption]
      key_model = &quot;node&quot;

    [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry]
      config_path = &quot;&quot;

      [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.auths]

      [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.configs]

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.configs.&quot;10.10.50.116:30002&quot;]

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.configs.&quot;10.10.50.135:30002&quot;]

          [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.configs.&quot;10.10.50.135:30002&quot;.tls]

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.configs.&quot;ghcr.io&quot;]

          [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.configs.&quot;ghcr.io&quot;.auth]
            password = &quot;ghp_irQW06Xlqwinedlinaskl;cmnlk&quot;
            username = &quot;chogodo@naver.com&quot;

      [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.headers]

      [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.mirrors]

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.mirrors.&quot;10.10.50.116:30002&quot;]
          endpoint = [&quot;http://10.10.50.116:30002&quot;]

        [plugins.&quot;io.containerd.grpc.v1.cri&quot;.registry.mirrors.&quot;ghcr.io&quot;]
          endpoint = [&quot;https://ghcr.io&quot;]

    [plugins.&quot;io.containerd.grpc.v1.cri&quot;.x509_key_pair_streaming]
      tls_cert_file = &quot;&quot;
      tls_key_file = &quot;&quot;

  [plugins.&quot;io.containerd.internal.v1.opt&quot;]
    path = &quot;/opt/containerd&quot;

  [plugins.&quot;io.containerd.internal.v1.restart&quot;]
    interval = &quot;10s&quot;

  [plugins.&quot;io.containerd.internal.v1.tracing&quot;]
    sampling_ratio = 1.0
    service_name = &quot;containerd&quot;

  [plugins.&quot;io.containerd.metadata.v1.bolt&quot;]
    content_sharing_policy = &quot;shared&quot;

  [plugins.&quot;io.containerd.monitor.v1.cgroups&quot;]
    no_prometheus = false

  [plugins.&quot;io.containerd.runtime.v1.linux&quot;]
    no_shim = false
    runtime = &quot;runc&quot;
    runtime_root = &quot;&quot;
    shim = &quot;containerd-shim&quot;
    shim_debug = false

  [plugins.&quot;io.containerd.runtime.v2.task&quot;]
    platforms = [&quot;linux/amd64&quot;]
    sched_core = false

  [plugins.&quot;io.containerd.service.v1.diff-service&quot;]
    default = [&quot;walking&quot;]

  [plugins.&quot;io.containerd.service.v1.tasks-service&quot;]
    rdt_config_file = &quot;&quot;

  [plugins.&quot;io.containerd.snapshotter.v1.aufs&quot;]
    root_path = &quot;&quot;

  [plugins.&quot;io.containerd.snapshotter.v1.btrfs&quot;]
    root_path = &quot;&quot;

  [plugins.&quot;io.containerd.snapshotter.v1.devmapper&quot;]
    async_remove = false
    base_image_size = &quot;&quot;
    discard_blocks = false
    fs_options = &quot;&quot;
    fs_type = &quot;&quot;
    pool_name = &quot;&quot;
    root_path = &quot;&quot;

  [plugins.&quot;io.containerd.snapshotter.v1.native&quot;]
    root_path = &quot;&quot;

  [plugins.&quot;io.containerd.snapshotter.v1.overlayfs&quot;]
    mount_options = []
    root_path = &quot;&quot;
    sync_remove = false
    upperdir_label = false

  [plugins.&quot;io.containerd.snapshotter.v1.zfs&quot;]
    root_path = &quot;&quot;

  [plugins.&quot;io.containerd.tracing.processor.v1.otlp&quot;]
    endpoint = &quot;&quot;
    insecure = false
    protocol = &quot;&quot;

[proxy_plugins]

[stream_processors]

  [stream_processors.&quot;io.containerd.ocicrypt.decoder.v1.tar&quot;]
    accepts = [&quot;application/vnd.oci.image.layer.v1.tar+encrypted&quot;]
    args = [&quot;--decryption-keys-path&quot;, &quot;/etc/containerd/ocicrypt/keys&quot;]
    env = [&quot;OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf&quot;]
    path = &quot;ctd-decoder&quot;
    returns = &quot;application/vnd.oci.image.layer.v1.tar&quot;

  [stream_processors.&quot;io.containerd.ocicrypt.decoder.v1.tar.gzip&quot;]
    accepts = [&quot;application/vnd.oci.image.layer.v1.tar+gzip+encrypted&quot;]
    args = [&quot;--decryption-keys-path&quot;, &quot;/etc/containerd/ocicrypt/keys&quot;]
    env = [&quot;OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf&quot;]
    path = &quot;ctd-decoder&quot;
    returns = &quot;application/vnd.oci.image.layer.v1.tar+gzip&quot;

[timeouts]
  &quot;io.containerd.timeout.bolt.open&quot; = &quot;0s&quot;
  &quot;io.containerd.timeout.shim.cleanup&quot; = &quot;5s&quot;
  &quot;io.containerd.timeout.shim.load&quot; = &quot;5s&quot;
  &quot;io.containerd.timeout.shim.shutdown&quot; = &quot;3s&quot;
  &quot;io.containerd.timeout.task.state&quot; = &quot;2s&quot;

[ttrpc]
  address = &quot;&quot;
  gid = 0
  uid = 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;11. containerd 사용 시 설정 변경 적용&lt;/h3&gt;
&lt;pre id=&quot;code_1736149658741&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

sudo systemctl restart containerd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12. br_netfilter 모듈 로드 및&amp;nbsp; br_netfilter 모듈이 자동으로 로드되도록 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1736151455740&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo modprobe br_netfilter
echo 'br_netfilter' | sudo tee /etc/modules-load.d/br_netfilter.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;13. /proc/sys/net/bridge/bridge-nf-call-iptables 및 ip_forward 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1736151520384&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo &quot;net.bridge.bridge-nf-call-iptables = 1&quot; | sudo tee -a /etc/sysctl.conf
echo &quot;net.bridge.bridge-nf-call-ip6tables = 1&quot; | sudo tee -a /etc/sysctl.conf
echo &quot;net.ipv4.ip_forward = 1&quot; | sudo tee -a /etc/sysctl.conf

sudo sysctl --system

sysctl net.bridge.bridge-nf-call-iptables
sysctl net.bridge.bridge-nf-call-ip6tables
sysctl net.ipv4.ip_forward&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;14. join 하기&lt;/h3&gt;
&lt;pre id=&quot;code_1736149702984&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubeadm join {Master_IP}:6443 --token {token_키} --discovery-token-ca-cert-hash sha256:{hash_token_키}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>최근 포스팅</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/334</guid>
      <comments>https://jfbta.tistory.com/334#entry334comment</comments>
      <pubDate>Mon, 6 Jan 2025 16:52:35 +0900</pubDate>
    </item>
    <item>
      <title>[쿠버네티스] externalTrafficPolicy 옵션으로 Ingress 접근 범위 설정하기</title>
      <link>https://jfbta.tistory.com/330</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;1. externalTrafficPolicy란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;externalTrafficPolicy는 외부에서 접근하는 트래픽이 클러스터 내부로 전달되는 방식을 결정하는 옵션이다. 이 설정은 주로 NodePort 또는 LoadBalancer 타입의 서비스에서 사용되며, 외부 트래픽을 클러스터의 각 노드에 어떻게 분산할지를 지정한다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Local&amp;nbsp; &amp;nbsp;:&amp;nbsp; 트래픽을 수신한 노드의 IP로 접근 가능&lt;br /&gt;Cluster:&amp;nbsp; 모든 노드에서 수신 가능하며, 서비스의 엔드포인트를 가진 모든 Pod로 분산&lt;/blockquote&gt;
&lt;pre id=&quot;code_1731637522226&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl edit svc ingress-nginx-controller -n ingress-nginx&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1731637522226&quot; class=&quot;avrasm&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로컬로 설정하면 파드가 할당된 노드 IP로만 인그레스 접근이 가능하다.
externalTrafficPolicy: Local
# 클러스터로 설정하면 마스터노드~모든 워커노드 IP에서 인그레스 접근이 가능하다.
externalTrafficPolicy: Cluster&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;2. externalTrafficPolicy의 두 가지 설정 예시&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;2.1 externalTrafficPolicy: Local&lt;/h3&gt;
&lt;pre id=&quot;code_1731637522227&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Local 옵션을 선택하면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Pod가 실제로 할당된 노드에서만 트래픽을 수신&lt;/b&gt;할 수 있다. 이 설정은 클러스터 내 특정 노드에 할당된 Pod에서만 트래픽을 처리하도록 제한하고, 다음과 같은 특성이 있다:&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;트래픽 제한: 요청을 받은 노드에 해당 Pod가 할당되지 않은 경우 트래픽은 전달되지 않는다.&lt;br /&gt;원본 IP 유지: 요청을 전달할 때 외부 클라이언트의 IP 주소가 그대로 유지된다.&lt;br /&gt;로드 밸런서 비용 절감: 불필요한 로드 밸런서 비용을 줄일 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;2.2 externalTrafficPolicy: Cluster&lt;/h3&gt;
&lt;pre id=&quot;code_1731637522227&quot; class=&quot;routeros&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  type: LoadBalancer
  externalTrafficPolicy: Cluster
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cluster 옵션을 선택하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;모든 노드에서 외부 트래픽을 수신&lt;/b&gt;할 수 있다. 트래픽은 클러스터의 모든 노드에서 받아들이고, 각 노드는 트래픽을 해당 서비스의 Pod로 전달한다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;트래픽 분산&amp;nbsp; &amp;nbsp;:&amp;nbsp; 모든 노드에서 트래픽을 받아들여, 클러스터 전체에서 트래픽이 적절히 분산된다.&lt;br /&gt;원본 IP 손실&amp;nbsp; :&amp;nbsp; 트래픽이 클러스터 내부에서 라우팅될 때 원본 IP 주소가 손실될 수 있다.&lt;br /&gt;유연한 확장성:&amp;nbsp; 여러 노드에서 트래픽을 받아들이므로 확장성이 높다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>최근 포스팅</category>
      <category>오블완</category>
      <category>티스토리챌린지</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/330</guid>
      <comments>https://jfbta.tistory.com/330#entry330comment</comments>
      <pubDate>Fri, 15 Nov 2024 11:25:56 +0900</pubDate>
    </item>
    <item>
      <title>[쿠버네티스] ingress-nginx 설치</title>
      <link>https://jfbta.tistory.com/329</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. ingress 설치&lt;/h2&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.6.4/deploy/static/provider/cloud/deploy.yaml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. ingress-nginx 전체 조회&lt;/h2&gt;
&lt;pre id=&quot;code_1731392243728&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl get all -n ingress-nginx&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1731569222175&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NAME                                            READY   STATUS    RESTARTS   AGE
pod/ingress-nginx-controller-7c8d7f6869-6qxkv   1/1     Running   0          16d

NAME                                         TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   1x.9x.1x.4x    1x.1x.5x.2xx   80:3xxxx/TCP,443:3xxxx/TCP   115d
service/ingress-nginx-controller-admission   ClusterIP      1x.1x.2x.1x   &amp;lt;none&amp;gt;         443/TCP                      115d

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           115d

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-594555f486   0         0         0       115d
replicaset.apps/ingress-nginx-controller-7c8d7f6869   1         1         1       40d

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           3s         115d
job.batch/ingress-nginx-admission-patch    1/1           4s         115d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. ConfigMap&amp;nbsp;(false로&amp;nbsp;되어있으면&amp;nbsp;true로&amp;nbsp;변경)&lt;/h2&gt;
&lt;pre id=&quot;code_1741226986626&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl edit configmap/ingress-nginx-controller -n ingress-nginx
```
data:
  allow-snippet-annotations: &quot;true&quot;
```&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. ingress 접속 정보 설정&lt;/h2&gt;
&lt;pre id=&quot;code_1741261745467&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;kubectl edit service/ingress-nginx-controller -n ingress-nginx
```
spec:
  allocateLoadBalancerNodePorts: true
  clusterIP: 10.96.220.148
  clusterIPs:
  - 10.96.220.148
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
```&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;externalTrafficPolicy: Local -&amp;gt; Cluster&lt;br /&gt;Local : 수정하면 파드가 실행중인 노드에서만 접속됌&lt;br /&gt;Cluster : 모든 마스터 및 워커노드 IP에서 접속 가능&lt;/p&gt;</description>
      <category>최근 포스팅</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/329</guid>
      <comments>https://jfbta.tistory.com/329#entry329comment</comments>
      <pubDate>Thu, 14 Nov 2024 19:27:51 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] brew 설치 방법</title>
      <link>https://jfbta.tistory.com/299</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;brew 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1712212914788&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1712212870582&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;root@datapecker3:/home# sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)&quot;
Warning: Linuxbrew has been merged into Homebrew.
Please migrate to the following command:
  /bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quot;

==&amp;gt; Checking for `sudo` access (which may request your password)...
Don't run this as root!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;root 계정으로 설치 명령어를 실행하면 다음과 같은 결과가 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 때문에 계정을 사용자 계정으로 변경 후 설치하자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712212937636&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;su user
sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1712212681683&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;root@datapecker3:/home# su user
user@datapecker3:/home$ sh -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)&quot;
Warning: Linuxbrew has been merged into Homebrew.
Please migrate to the following command:
  /bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)&quot;

==&amp;gt; Checking for `sudo` access (which may request your password)...
[sudo] password for user:
==&amp;gt; This script will install:
/home/linuxbrew/.linuxbrew/bin/brew
/home/linuxbrew/.linuxbrew/share/doc/homebrew
/home/linuxbrew/.linuxbrew/share/man/man1/brew.1
/home/linuxbrew/.linuxbrew/share/zsh/site-functions/_brew
/home/linuxbrew/.linuxbrew/etc/bash_completion.d/brew
/home/linuxbrew/.linuxbrew/Homebrew
==&amp;gt; The following new directories will be created:
/home/linuxbrew/.linuxbrew/bin
/home/linuxbrew/.linuxbrew/etc
/home/linuxbrew/.linuxbrew/include
/home/linuxbrew/.linuxbrew/lib
/home/linuxbrew/.linuxbrew/sbin
/home/linuxbrew/.linuxbrew/share
/home/linuxbrew/.linuxbrew/var
/home/linuxbrew/.linuxbrew/opt
/home/linuxbrew/.linuxbrew/share/zsh
/home/linuxbrew/.linuxbrew/share/zsh/site-functions
/home/linuxbrew/.linuxbrew/var/homebrew
/home/linuxbrew/.linuxbrew/var/homebrew/linked
/home/linuxbrew/.linuxbrew/Cellar
/home/linuxbrew/.linuxbrew/Caskroom
/home/linuxbrew/.linuxbrew/Frameworks

Press RETURN/ENTER to continue or any other key to abort:

// #Enter 를 누르자&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1712213092217&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo 'eval &quot;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)&quot;' &amp;gt;&amp;gt; ~/.profile
eval &quot;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)&quot;
brew doctor&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1712212797555&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user@datapecker3:/home$ echo 'eval &quot;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)&quot;' &amp;gt;&amp;gt; ~/.profile
user@datapecker3:/home$ eval &quot;$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)&quot;
user@datapecker3:/home$ brew doctor
Your system is ready to brew.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;최신버전의 os에선 이렇게만 하면 설치가 완료된다. 하지만 centos 7과 같이 낮은 버전의 os에서는 git과 curl 버전을 yum 저장소에서 낮은 버전만 지원하기 때문에 최신버전으로 별도의 설치가 필요할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Error Case&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) Please update your system curl or set HOMEBREW_CURL_PATH to a newer version.&lt;/p&gt;
&lt;pre id=&quot;code_1712558098547&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export HOMEBREW_CURL_PATH=/usr/local/bin/curl &amp;gt;&amp;gt; ~/.bashrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HOMEBREW_CURL_PATH 환경 변수 설정을 하라는 에러이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) Running&amp;nbsp;Homebrew&amp;nbsp;as&amp;nbsp;root&amp;nbsp;is&amp;nbsp;extremely&amp;nbsp;dangerous&amp;nbsp;and&amp;nbsp;no&amp;nbsp;longer&amp;nbsp;supported. &lt;br /&gt;As&amp;nbsp;Homebrew&amp;nbsp;does&amp;nbsp;not&amp;nbsp;drop&amp;nbsp;privileges&amp;nbsp;on&amp;nbsp;installation&amp;nbsp;you&amp;nbsp;would&amp;nbsp;be&amp;nbsp;giving&amp;nbsp;all&lt;/p&gt;
&lt;pre id=&quot;code_1712558175619&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;su user&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;root 계정이 아닌 사용 계정으로 로그인해서 사용하면 해결된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3) Please note that these warnings are just used to help the Homebrew maintainers with debugging if you file an issue. If everything you use Homebrew for is working fine: please don't worry or file an issue; just ignore this. Thanks! Warning: No developer tools installed. Install Clang or run brew install gcc.&lt;/p&gt;
&lt;pre id=&quot;code_1731304014132&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install gcc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Homebrew를 정상적으로 사용하기 위해서는 개발 도구(Developer Tools) 또는 컴파일러(GCC)가 필요하다. 이는 Homebrew에서 소프트웨어 패키지를 빌드하거나 설치할 때 필요한 의존성 때문이다.&lt;br /&gt;위 명령어로 gcc를 설치해주면 된다.&lt;/p&gt;</description>
      <category>Infrastructure/Linux</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/299</guid>
      <comments>https://jfbta.tistory.com/299#entry299comment</comments>
      <pubDate>Mon, 11 Nov 2024 14:55:32 +0900</pubDate>
    </item>
    <item>
      <title>[머신러닝] 쿠버네티스 트리톤 서버에서 onnx API 호출 시 413 Request Entity Too Large 이슈 해결하기</title>
      <link>https://jfbta.tistory.com/326</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관련글&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;saved_model 배포 방법을 한 번 시도해보고 읽어보길 권장&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/320&quot;&gt;https://jfbta.tistory.com/320&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1728269884411&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[머신러닝] 쿠버네티스에서 TensorFlow 모델 Triton 서버를 활용해서 서빙하기(saved_model)&quot; data-og-description=&quot;목차&amp;nbsp;쿠버네티스에서 트리톤 이미지 파드로 띄우기kubectl create -f triton-pvc.yamlkubectl create -f triton-deployment.yaml&amp;#96;&amp;#96;&amp;#96;triton-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: triton-pvc namespace: ${네임스페이&quot; data-og-host=&quot;jfbta.tistory.com&quot; data-og-source-url=&quot;https://jfbta.tistory.com/320&quot; data-og-url=&quot;https://jfbta.tistory.com/320&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SAmUd/hyXecnZ433/2cJQemWs6KdjF9zCuMlkmK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/czUCdi/hyXeelOogO/HmKOhtPMDkPjy3fHFZCNh0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/320&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jfbta.tistory.com/320&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SAmUd/hyXecnZ433/2cJQemWs6KdjF9zCuMlkmK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/czUCdi/hyXeelOogO/HmKOhtPMDkPjy3fHFZCNh0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[머신러닝] 쿠버네티스에서 TensorFlow 모델 Triton 서버를 활용해서 서빙하기(saved_model)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&amp;nbsp;쿠버네티스에서 트리톤 이미지 파드로 띄우기kubectl create -f triton-pvc.yamlkubectl create -f triton-deployment.yaml```triton-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: triton-pvc namespace: ${네임스페이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jfbta.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;onnx 모델 생성하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727870762441&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import numpy as np
from torchvision.datasets import ImageFolder
import torchvision.transforms as transforms
from torch.utils.data import Dataset, DataLoader
from torch.utils.data import random_split
import os
from PIL import Image

class CustomDataset(Dataset):
    def __init__(self, root_dir, transform=None):
        self.root_dir = root_dir
        self.transform = transform
        self.images = []
        self.labels = []

        # 이미지 파일 경로와 레이블 수집
        for filename in os.listdir(root_dir):
            if filename.endswith(&quot;.jpg&quot;):  # JPEG 이미지 파일만 포함
                label = 0 if 'cat' in filename else 1  # 'cat'이면 0, 'dog'이면 1
                self.images.append(os.path.join(root_dir, filename))
                self.labels.append(label)

    def __len__(self):
        return len(self.images)

    def __getitem__(self, idx):
        img_path = self.images[idx]
        image = Image.open(img_path).convert(&quot;RGB&quot;)  # 이미지를 RGB 모드로 열기
        label = self.labels[idx]

        if self.transform:
            image = self.transform(image)

        return image, label
    
train_transforms = transforms.Compose([transforms.RandomRotation(30), # 랜덤 각도 회전
                                       transforms.RandomResizedCrop(224), # 랜덤 리사이즈 크롭
                                       transforms.RandomHorizontalFlip(), # 랜덤으로 수평 뒤집기
                                       transforms.ToTensor(), # 이미지를 텐서로
                                       transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])]) #



dataset = CustomDataset(root_dir='C:/Users/Downloads/modelapi/model/onnx_model/data/train/test', transform=train_transforms) # 파일 디렉토리

trainset, validset = random_split(dataset, [3,1]) # 학습데이터를 학습과 검증데이터로 쪼갬

batch_size=10
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=True)
validloader = torch.utils.data.DataLoader(validset, batch_size=batch_size, shuffle=True)
classes = ['cat', 'dog']

# 코드 작성
import torch.nn as nn
import torch.nn.functional as F

# 좀 더 심플한 네트워크
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()

        # input image = 224 x 224 x 3

        # 224 x 224 x 3 --&amp;gt; 112 x 112 x 32 maxpool
        self.conv1 = nn.Conv2d(3, 32, 3, padding=1) 
        # 112 x 112 x 32 --&amp;gt; 56 x 56 x 64 maxpool
        self.conv2 = nn.Conv2d(32, 64, 3, padding=1) 
        # 56 x 56 x 64 --&amp;gt; 28 x 28 x 128 maxpool
        self.conv3 = nn.Conv2d(64, 128, 3, padding=1)    

        # maxpool 2 x 2
        self.pool = nn.MaxPool2d(2, 2)

        # 28 x 28 x 128 vector flat 256개
        self.fc1 = nn.Linear(128 * 28 * 28, 256)
        # 카테고리 2개 클래스
        self.fc2 = nn.Linear(256, 2) 

        # dropout 적용
        self.dropout = nn.Dropout(0.5)

    def forward(self, x):
        # conv1 레이어에 relu 후 maxpool. 112 x 112 x 32
        x = self.pool(F.relu(self.conv1(x)))
        # conv2 레이어에 relu 후 maxpool. 56 x 56 x 64
        x = self.pool(F.relu(self.conv2(x)))
        # conv3 레이어에 relu 후 maxpool. 28 x 28 x 128
        x = self.pool(F.relu(self.conv3(x)))

        # 이미지 펴기
        x = x.view(-1, 128 * 28 * 28)
        # dropout 적용
        x = self.dropout(x)
        # fc 레이어에 삽입 후 relu
        x = F.relu(self.fc1(x))
        # dropout 적용
        x = self.dropout(x)

        # 마지막 logsoftmax 적용
        x = F.log_softmax(self.fc2(x), dim=1)
        return x


model = Net() # 모델 생성
print(model) # 출력


# 코드
import torch.optim as optim

criterion = nn.NLLLoss()

optimizer = optim.SGD(model.parameters(), lr=0.01)


# 코드 작성

# epochs 30
n_epochs = 10

valid_loss_min = np.Inf

for epoch in range(1, n_epochs+1):
    # train, valid loss
    print(epoch)
    train_loss = 0.0
    valid_loss = 0.0
    
    # 모델 트레이닝
    model.train()
    # training set
    for batch_idx, (data, target) in enumerate(trainloader, 1):
        # cuda 사용
        # 역전파 실행 전 gradient 0 초기화
        optimizer.zero_grad()
        # 모델 계산 후 output 저장
        output = model(data)
        # 로스율 계산
        loss = criterion(output, target)
        # 가중치 계산
        loss.backward()
        # 모델 parameter 업데이트
        optimizer.step()
        # 트레이닝 로스 계산
        train_loss += loss.item()*data.size(0)
        # 배치마다 트레이닝 손실 출력
        if batch_idx % 10 == 0:  # 예: 10번째 배치마다 출력
            print(f&quot;  Batch {batch_idx}, Loss: {loss.item():.6f}&quot;)

    # validation 모델
    model.eval()
    validation_iter = iter(validloader)
    with torch.no_grad():  # validation 시 gradient 계산 안 함
        for data, target in validation_iter:
            # cuda 사용
            # 모델 계산 후 output 저장
            output = model(data)
            # 로스율 계산
            loss = criterion(output, target)
            # validation 로스율 계산
            valid_loss += loss.item()*data.size(0)

    # 평균 로스율
    train_loss = train_loss/len(trainloader.sampler)
    valid_loss = valid_loss/len(validloader.sampler)

    # training set, validation set 로스율 출력
    print('Epoch: {} \tTraining Loss: {:.6f} \tValidation Loss: {:.6f}'.format(
        epoch, train_loss, valid_loss))
    
    # 로스율이 낮아지면 model_catdog.pt에 저장
    if valid_loss &amp;lt;= valid_loss_min:
        print('Validation loss decreased ({:.6f} --&amp;gt; {:.6f}).  Saving model ...'.format(
        valid_loss_min,
        valid_loss))
        torch.save(model.state_dict(), 'model_catdog.pt')
        valid_loss_min = valid_loss
    

# 최종적으로 나온 모델을 onnx 파일로 저장    
import onnx
dummy_input = torch.randn(1, 3, 224, 224)  # 입력 크기에 맞게 조정

torch.onnx.export(model, dummy_input, &quot;cat_dog_model.onnx&quot;, 
                  input_names=[&quot;input_1&quot;], 
                  output_names=[&quot;output_1&quot;],
                  opset_version=11,
                  dynamic_axes={&quot;input_1&quot;: {0: &quot;batch_size&quot;}, &quot;output_1&quot;: {0: &quot;batch_size&quot;}})

# torch.onnx.export(model, dummy_input, &quot;cat_dog_model.onnx&quot;, 
#                   input_names=[&quot;input_1&quot;], output_names=[&quot;output_1&quot;],
#                   opset_version=11)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'dataset = CustomDataset(root_dir='C:/Users/Downloads/modelapi/model/onnx_model/data/train/test', transform=train_transforms)' 이 경로에 있는 많은 양의 강아지, 고양이 이미지를 학습시키는 머신러닝 코드이다. 실행이 완료되는데 반나절 정도의 시간이 걸리며 완료되면 model.onnx 파일이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;트리톤_서버에서_모델_디렉토리_Tree_형식으로_구조_파악하고_구성하기&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;트리톤 서버에서 모델 디렉토리 Tree 형식으로 구조 파악하고 구성하기&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;```디렉토리&amp;nbsp;구조&lt;br /&gt;/models&lt;br /&gt;&amp;nbsp;&amp;nbsp;/onnx_model&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/config.pbtxt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/model.onnx&lt;br /&gt;```&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;config.pbtxt 작성하기&lt;/h2&gt;
&lt;pre id=&quot;code_1728271536469&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: &quot;onnx_model&quot;
platform: &quot;onnxruntime_onnx&quot;
max_batch_size: 1
input [
  {
    name: &quot;input_1&quot;
    data_type: TYPE_FP32
    format: FORMAT_NCHW
    dims: [ 3, 224, 224 ]
  }
]
output [
  {
    name: &quot;output_1&quot;
    data_type: TYPE_FP32
    dims: [ 2 ]
  }
]
dynamic_batching {
  preferred_batch_size: [ 1 ]
  max_queue_delay_microseconds: 100
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이미지 크기를 224*224로 했더니 이미지를 json으로 변환해서 body에 입력하여 post api 호출했더니 다음과 같은 에러가 발생했다.&lt;/p&gt;
&lt;pre id=&quot;code_1728269927026&quot; class=&quot;xml&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;요청 실패: 413, &amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;413 Request Entity Too Large&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;413 Request Entity Too Large&amp;lt;/h1&amp;gt;&amp;lt;/center&amp;gt;
&amp;lt;hr&amp;gt;&amp;lt;center&amp;gt;nginx&amp;lt;/center&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'&amp;lt;center&amp;gt;nginx&amp;lt;/center&amp;gt;' 이 부분을 보니 ingress-nginx에서 size를 늘리는 설정이 필요한 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728270044015&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 100m
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  creationTimestamp: &quot;2024-09-23T06:30:26Z&quot;
  generation: 1
  name: triton-ingress-21
  namespace: &quot;2&quot;
  resourceVersion: &quot;52473063&quot;
  uid: 18374b2c-2759-49ea-b344-de5552b16951
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: triton-svc-21
            port:
              number: 8000
        path: /21(/|$)(.*)
        pathType: Prefix
status:
  loadBalancer:
    ingress:
    - ip: 10.10.12.123&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;'nginx.ingress.kubernetes.io/proxy-body-size: 100m' -&amp;gt; nginx에서 body size의 기본값은 1m 이다. 100m 까지 늘려준뒤 호출 해주면 정상적으로 동작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이미지를 triton body 입력 형식에 맞는 json타입으로 변환 후 POST API 호출하여 - 고양이, 강아지 예측하기&lt;/h2&gt;
&lt;pre id=&quot;code_1727871655231&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
import json
import numpy as np
from PIL import Image
import torchvision.transforms as transforms

# 입력데이터 전처리
def createInputData(image_path):
    input_image = Image.open(image_path)
    preprocess = transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])
    input_tensor = preprocess(input_image).unsqueeze(0)  # 배치 차원 추가
    input_data_flat = input_tensor.numpy().flatten().tolist()

    # JSON 형식으로 작성
    request_json = {
        &quot;inputs&quot;: [
            {
                &quot;name&quot;: &quot;input_1&quot;,  # 모델의 입력 이름
                &quot;shape&quot;: [1, 3, 224, 224],  # 배치 크기를 포함한 입력 형태
                &quot;datatype&quot;: &quot;FP32&quot;,  # 데이터 타입
                &quot;data&quot;: input_data_flat  # 플래트 형식의 데이터 배열
            }
        ]
    }
    return request_json
    
# 응답 처리
def callAPI(input_data):
    response = requests.post(url, json=input_data)
    if response.status_code == 200:
        outputs = response.json()  # JSON 응답 파싱
        data_values = outputs['outputs'][0]['data']
        print(outputs)
        class_names = ['고양이', '강아지']
        result=class_names[np.argmax(data_values)]
        print(f&quot;예측 결과: {result}&quot;)
    else:
        print(f&quot;요청 실패: {response.status_code}, {response.text}&quot;)
    return requests.post(url, json=input_data)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1728271163320&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;image_path = 'cat.jpg'
input_data = createInputData(image_path)
# Triton API 호출을 위한 URL 설정
url = &quot;http://10.10.12.123/21/v2/models/onnx_model/infer&quot;
# API 호출 - 완전한 JSON 객체 전송
callAPI(input_data)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1728271196224&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;예측 결과: 고양이&lt;/code&gt;&lt;/pre&gt;</description>
      <category>최근 포스팅</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/326</guid>
      <comments>https://jfbta.tistory.com/326#entry326comment</comments>
      <pubDate>Wed, 2 Oct 2024 21:18:41 +0900</pubDate>
    </item>
    <item>
      <title>[머신러닝] 쿠버네티스에서 pytorch 모델 Triton서버를 활용해서 서빙하기(model.pt)</title>
      <link>https://jfbta.tistory.com/325</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;관련글&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;saved_model 배포 방법을 한 번 시도해보고 읽어보길 권장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/320&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jfbta.tistory.com/320&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1727846493820&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[머신러닝] 쿠버네티스에서 TensorFlow 모델 Triton 서버를 활용해서 서빙하기(saved_model)&quot; data-og-description=&quot;목차&amp;nbsp;쿠버네티스에서 트리톤 이미지 파드로 띄우기kubectl create -f triton-pvc.yamlkubectl create -f triton-deployment.yaml&amp;#96;&amp;#96;&amp;#96;triton-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: triton-pvc namespace: ${네임스페이&quot; data-og-host=&quot;jfbta.tistory.com&quot; data-og-source-url=&quot;https://jfbta.tistory.com/320&quot; data-og-url=&quot;https://jfbta.tistory.com/320&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7vhIQ/hyXaIVwfpw/iugbk8LchC7NsSqeXvuAm1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/v5Suk/hyXaDmokFc/gyFsq1dXUn04bs83oMIyI1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://jfbta.tistory.com/320&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jfbta.tistory.com/320&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7vhIQ/hyXaIVwfpw/iugbk8LchC7NsSqeXvuAm1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/v5Suk/hyXaDmokFc/gyFsq1dXUn04bs83oMIyI1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[머신러닝] 쿠버네티스에서 TensorFlow 모델 Triton 서버를 활용해서 서빙하기(saved_model)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차&amp;nbsp;쿠버네티스에서 트리톤 이미지 파드로 띄우기kubectl create -f triton-pvc.yamlkubectl create -f triton-deployment.yaml```triton-pvc.yamlapiVersion: v1kind: PersistentVolumeClaimmetadata: name: triton-pvc namespace: ${네임스페이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jfbta.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;modelpt 파이썬 코드 작성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;ChatGPT로 modelpt를 생성하기 위해 필요한 파이썬 코드를 생성했다.&lt;/p&gt;
&lt;pre id=&quot;code_1727838547897&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import torch.nn as nn

# 간단한 PyTorch 모델 정의 (예: MNIST 분류기)
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)
        self.fc2 = nn.Linear(128, 10)
    
    def forward(self, x):
        x = torch.flatten(x, 1)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 모델 인스턴스 생성 및 저장
model = SimpleModel()
dummy_input = torch.randn(1, 28 * 28)  # 더미 입력 데이터 (배치 크기 1)
torch.save(model, 'model.pt')  # 모델을 model.pt로 저장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;생성한 model.pt를 트리톤서버에 서빙하려면 torch.save(model, 'model.pt')로 모델을 저장하는 대신, Triton Inference Server와 호환되도록 JIT 형식으로 모델을 저장해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1727838399324&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import torch
import torch.nn as nn

# 간단한 PyTorch 모델 정의 (예: MNIST 분류기)
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)
        self.fc2 = nn.Linear(128, 10)
    
    def forward(self, x):
        x = torch.flatten(x, 1)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 모델 인스턴스 생성
model = SimpleModel()
model.eval()  # 모델을 평가 모드로 설정

# JIT 모델로 변환하여 저장
dummy_input = torch.randn(1, 1, 28, 28)  # MNIST는 1채널의 28x28 이미지
traced_model = torch.jit.trace(model, dummy_input)
traced_model.save('model.pt')  # JIT 형식으로 model.pt로 저장&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;model.py파일 실행&lt;/h2&gt;
&lt;pre id=&quot;code_1727846162353&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python modelpt.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;커맨드 입력하면 model.pt 파일이 py파일이 있는 경로에 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;config.pbtxt 파일 작성&lt;/h2&gt;
&lt;pre id=&quot;code_1727836681016&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;```config.pbtxt
name: &quot;pt_model&quot;
platform: &quot;pytorch_libtorch&quot;
max_batch_size: 0
input [
  {
    name: &quot;INPUT__0&quot;
    data_type: TYPE_FP32
    dims: [1, 1, 28, 28]
  }
]
output [
  {
    name: &quot;OUTPUT__0&quot;
    data_type: TYPE_FP32
    dims: [1, 10]
  }
]
```&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;트리톤_서버에서_모델_디렉토리_Tree_형식으로_구조_파악하고_구성하기&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;트리톤 서버에서 모델 디렉토리 Tree 형식으로 구조 파악하고 구성하기&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;```디렉토리&amp;nbsp;구조&lt;br /&gt;/models&lt;br /&gt;&amp;nbsp;&amp;nbsp;/pt_model&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/config.pbtxt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/model.pt&lt;br /&gt;```&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;/models/pt_model -&amp;gt; pt_model이 API path로 들어간다.&lt;br /&gt;ex) http://10.10.10.123/100/v2/models/pt_model/infer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;트리톤 서버 실행&lt;/h2&gt;
&lt;pre id=&quot;code_1727846245956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nohup tritonserver --model-repository=/models --log-verbose=1 &amp;gt; /${원하는디렉토리명}/triton_output.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Request Body 내용 작성&lt;/h2&gt;
&lt;pre id=&quot;code_1727836669730&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;POST http://10.10.10.123/100/v2/models/pt_model/infer

HEADERS
Content-Type : application/json

BODY
{
  &quot;inputs&quot;: [
    {
      &quot;name&quot;: &quot;INPUT__0&quot;,
      &quot;shape&quot;: [1, 1, 28, 28],
      &quot;datatype&quot;: &quot;FP32&quot;,
      &quot;data&quot;: [
        [
          [
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],
            [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
          ]
        ]
      ]
    }
  ]
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>최근 포스팅</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/325</guid>
      <comments>https://jfbta.tistory.com/325#entry325comment</comments>
      <pubDate>Wed, 2 Oct 2024 21:04:29 +0900</pubDate>
    </item>
    <item>
      <title>[도커] 로컬에 설치한 넥서스에 새로 빌드 후 이미지 push하기</title>
      <link>https://jfbta.tistory.com/323</link>
      <description>&lt;div class=&quot;book-toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc_list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dockerfile로 이미지에 필요한 커맨드 설치 및 필요한 디렉토리 생성하기&lt;/h2&gt;
&lt;pre id=&quot;code_1727092026204&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;```Dockerfile
FROM nvcr.io/nvidia/tritonserver:24.07-py3
RUN apt-get update &amp;amp;&amp;amp; apt-get install net-tools
RUN mkdir -p /logs
RUN mkdir -p /models
```&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;터미널에서 Dockerfile이 있는 위치로 이동하기&lt;/h2&gt;
&lt;pre id=&quot;code_1727092101842&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /${도커파일경로}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;현재 위치의 Dockerfile 빌드하기&lt;/h2&gt;
&lt;pre id=&quot;code_1727092175539&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker build --tag tritonserver:24.07-py3 .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;넥서스 도커서버에 로그인하기&lt;/h2&gt;
&lt;pre id=&quot;code_1727092198384&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker login http://${넥서스IP}:${넥서스PORT}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;넥서스 도커서버에 push하기&lt;/h2&gt;
&lt;pre id=&quot;code_1727092313094&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 구성
docker tag ${이미지ID} ${넥서스IP}:${넥서스Port}/triton/tritonserver:24.07-py3
docker push ${넥서스IP}:${넥서스Port}/triton/tritonserver:24.07-py3

# 예시
docker tag 17e685bd4759 10.10.50.123:5000/triton/tritonserver:24.07-py3
docker push 10.10.50.123:5000/triton/tritonserver:24.07-py3&lt;/code&gt;&lt;/pre&gt;</description>
      <category>최근 포스팅</category>
      <author>초고도</author>
      <guid isPermaLink="true">https://jfbta.tistory.com/323</guid>
      <comments>https://jfbta.tistory.com/323#entry323comment</comments>
      <pubDate>Mon, 23 Sep 2024 20:52:20 +0900</pubDate>
    </item>
  </channel>
</rss>