- Context Engineering
- CAG
- CAG, TAG
- RAG 챗봇 실전 구축 가이드: LangChain과 벡터 DB 활용법
- 스탠포드 대학교 강의
네이버 클라우드 특강
https://brunch.co.kr/@topasvga/5244
AI 워크로드를 위한 네이버 클라우드 쿠버네티스
- 쿠버네티스(Kubernetes)의 일반적인 애플리케이션 배포 및 서비스 아키텍처

개발자가 코드를 작성하고 배포한 다음, 사용자가 서비스에 접속하는 전체적인 워크플로우 살펴보기
-
개발 및 이미지 생성
- 개발자가 코드를 작성하여 Git 리포지토리에 푸시
- 이벤트(예: 코드 푸시)를 감지하는 Webhook이 동작하여 빌드 프로세스를 시작
- 코드 빌드를 통해 컨테이너 이미지 생성
- 이미지는 ★컨테이너 레지스트리★에 저장
① 도커로 이미지 만들어서 컨테이너 레지스트리에 올리기
② 빌드를 해서 k8s의 워커노드에 pod의 형태로 배포
③ 사용자는 Ingress가 제공하는 외부 URL을 통해 애플리케이션에 접근 → 외부에서 클러스터로 들어오는 트래픽은 L4 로드밸런서(L4 스위치)를 통해 인그레스 컨트롤러로 전달되고, 인그레스 컨트롤러가 L7 로드밸런서처럼 작동하여 적절한 서비스로 트래픽을 보냄
→ 인그레스는 L7 로드 밸런서 이므로 L4 로드 밸런서로 라우팅을 해줄 수 있음
→ 클라우드에서 제공하는 로드밸런서와 파드를 연결한 후 해당 로드밸런서 IP를 이용해 클러스터 외부에서 파드에 접근할 수 있도록 함
(외부 트래픽이 로드밸런서를 통해 인그레스 컨트롤러로 들어오고 내부 Pod로까지 이어짐: 참고)
-
배포
- 개발자가 kubectl 또는 Helm과 같은 도구를 사용하여 쿠버네티스 API 서버에 배포 명령을 보냄
- Kubernetes API 서버는 배포 요청을 받아들이고, Control Plane의 컴포넌트(예: Scheduler)는 Pod를 실행할 적절한 Node (Worker)를 결정
- Deployment는 배포된 애플리케이션의 상태를 관리하고, 원하는 수의 Pod 복제본이 항상 실행되도록 보장함
-
서비스 노출
- Node (Worker)에 있는 Pod
- 실제 애플리케이션 컨테이너를 실행하는 가장 작은 배포 단위
- 하나 이상의 컨테이너를 포함할 수 있습니다
- Service는 Pod들의 논리적인 그룹을 정의하고, 안정적인 네트워크 접근을 위한 고정된 가상 IP와 DNS 이름을 제공함
- Pod가 재생성되어 IP가 바뀌더라도 Service를 통해 Pod에 접근할 수 있음
- Ingress는 클러스터 외부의 트래픽을 내부 서비스로 라우팅하는 규칙을 정의
- Ingress Controller는 이 규칙에 따라 트래픽을 적절한 Service로 전달
-
사용자 접근
- 최종 사용자는 Ingress가 제공하는 외부 URL을 통해 애플리케이션에 접근할 수 있음
- 사용자의 요청은 Ingress Controller를 거쳐 Service로 전달되고, Service는 Pod 중 하나로 트래픽을 분산하여 최종적으로 애플리케이션에 도달함
- 포인트
- 도커로 이미지 만들기
- 컨테이너 레지스트리에 올리기
- 쿠버네티스에 올려 배포하기
- 쿠버네티스 구축 & 실체 구축한 모델 도커에 올리고 빌드해서 쿠버네티스 worker에 넣기
- 도커는 따로 공부하기~
AI workloads로 쿠버네티스 사용하기
- 목표
- 쿠버네티스 사용 네트워크 생성
- NKS 생성
- 로키 리눅스로 명령서버 생성
- 쿠버네티스에 서비스 올리기
AI 워크로드란?
- 쿠버네티스 네트워크 생성
- NCP Kubernetes 클러스터 생성
- Container Registry 이용 Container 이미지 관리
- Container 이미지 이용 Pod 생성
- LoadBalancer 확인 및 서비스 접속 테스트
- Pod 운영/관리
1. 쿠버네티스 네트워크 생성
- 네이버 클라우드 네트워크 특징
- NATGW 전용 서브넷 구축 필요
- LoadBalancer 전용 서브넷 구축 필요

- 네트워크 구축: 6개 서브넷
- VPC (Virtual Private Cloud) > VPC Management > VPC 생성
- VPC 이름: agame-dev-vpc
- IP 주소 범위: 10.0.0.0/20 → C-Class 16개(일반적으로 /20 정도면 1개 서비스를 운영하는데 큰 이슈는 없다고 함)
- 유형: NORMAL
- Subnet Management
- Subnet 이름: pri1, VPC: agame-dev-vpc(10.0.0.0/20), IP 주소 범위: 10.0.0.0/23, 가용 Zone: KR1, Network ACL: agame-dev-vpc-default-network-acl, Internet Gateway 전용 여부: N(Private), 용도: 일반
- Subnet 이름: pub1, VPC: agame-dev-vpc(10.0.0.0/20), IP 주소 범위: 10.0.2.0/24, 가용 Zone: KR1, Network ACL: agame-dev-vpc-default-network-acl, Internet Gateway 전용 여부: Y(Public), 용도: 일반
- Subnet 이름: pri-db1, VPC: agame-dev-vpc(10.0.0.0/20), IP 주소 범위: 10.0.3.0/24, 가용 Zone: KR1, Network ACL: agame-dev-vpc-default-network-acl, Internet Gateway 전용 여부: N(Private), 용도: 일반
- Subnet 이름: pub-nat1, VPC: agame-dev-vpc(10.0.0.0/20), IP 주소 범위: 10.0.4.0/24, 가용 Zone: KR1, Network ACL: agame-dev-vpc-default-network-acl, Internet Gateway 전용 여부: Y(Public), 용도: NatGateway
- Subnet 이름: pub-lb1, VPC: agame-dev-vpc(10.0.0.0/20), IP 주소 범위: 10.0.5.0/24, 가용 Zone: KR1, Network ACL: agame-dev-vpc-default-network-acl, Internet Gateway 전용 여부: Y(Public), 용도: LoadBalancer
- Subnet 이름: pri-lb1, VPC: agame-dev-vpc(10.0.0.0/20), IP 주소 범위: 10.0.6.0/24, 가용 Zone: KR1, Network ACL: agame-dev-vpc-default-network-acl, Internet Gateway 전용 여부: N(Private), 용도: LoadBalancer

각 서브넷 CIDR 블록에서 첫 4개의 IP 주소와 마지막 IP 주소는 사용자가 사용할 수 없으므로 EC2 인스턴스 등의 리소스에 할당할 수 없습니다. 예를 들어 10.0.0.0/24 CIDR 블록의 서브넷에서는 다음 5개 IP 주소가 예약되어 있습니다.
10.0.0.0: 네트워크 주소.( 일반적으로 하나의 네트워크를 통칭하기 위해 사용하는 주소)
10.0.0.1: AWS에서 VPC 라우터용으로 예약한 주소.
10.0.0.2: AWS에서 예약한 주소. DNS 서버의 IP 주소는 기본 VPC 네트워크 범위에 2를 더한 주소입니다. CIDR 블록이 여러 개인 VPC의 경우, DNS 서버의 IP 주소가 기본 CIDR에 위치합니다. 또한 각 서브넷 범위의 기본에 2를 더한 주소를 VPC의 모든 CIDR 블록에 대해 예약합니다. 자세한 내용은 Amazon DNS 서버 섹션을 참조하세요.
10.0.0.3: AWS에서 앞으로 사용하려고 예약한 주소.
10.0.0.255: 네트워크 브로드캐스트 주소. VPC에서는 브로드캐스트를 지원하지 않으므로, 이 주소를 예약합니다.(네트워크 보안상의 이유로 막아 놓은것 - DDoS 공격을 방지하기 위해)
- NATGW 생성

- VPC > NAT Gateway > NAT Gateway 생성 > nat1
- Route Table > default-private-table > Routes 설정
- Destination: 0.0.0.0/0, Target Type: NATGW, Target Name: nat1 생성 > 확인
- 외부 라이브러리나 프로그램 등을 받아오려면 외부 통신이 되어야 하기 때문 → NAT를 통해 통신
- NAT 확인
- Route Table > default-private-table > Routes에서 확인
2. NCP Kubernetes 클러스터 생성
- Services > Containers > Ncloud Kubernetes Service > 생성하기
- 클러스터 이름: agame-k8s
- 네트워크 타입: public
- 나머지는 default값 유지

-
노드풀 설정 > 추가
- 노드풀 이름: agame-np
- 노드 수: 2 (실습이니까 1로 해도 괜찮음)
- 노드(워커노드)에 실제 pod(서버)들이 할당됨
-
POINT
- 쿠버네티스는 3개의 subnet이 필요함
- 서브넷 지정이 안 되면 생성이 안 됨
- 설치는 public/private 모두 가능
- 노드 수는 보통 이중화 때문에 2개 함
- 클러스터 생성이 완료된 이후 UUID 필요하니까 복사해두기
- 외부에서 서비스에 접근할 수 있게 해주는 네트워크 장비: LoadBalancer
- 현재까지 진행 순서
- 클러스터 생성 완료되면 명령 서버 만들기
3. Container Registry 이용 Container 이미지 관리
- Container Registry 생성 순서
- Object Storage 버켓 생성
- Services > Storage > Object Storage > 버킷 생성
- 버킷 이름: ncp-kube-1
- 전체 공개: 공개 안함 (디폴트)
- Container Registry 생성
- Services > Container Registry > 레지스트리 생성
- 레지스트리 이름: k8s-edu-1
- 버킷: ncp-kube-1
- 명령 서버 생성하기, pod(서버) 생성하기

- Server > 서버 생성
- vpc: agame-dev-vpc
- Subnet: pub1
- 서버 이름: agame-com1
- Network Interface 추가 누르기
- '새로운 공인 IP 할당' 누르기
- 네트워크 접근 설정 eth0 default로 설정
- 로키 리눅스 생성: 도커 설치용
- 로키 리눅스 생성
- Apache용 Dockerfile 생성
- 로키 리눅스에 도커 설치하고 Dockerfile로 홈페이지 만들기
- 도커 기반 컨테이너 생성
- 홈페이지뿐만 아니라 application도 만들 수 있음
- ACG 설정하기
- default 설정에서 8080 포트 열거나 my ip 전체 범위(1-65535)
- putty로 로그인
- passwd로 자주 쓰는 비밀번호로 바꿀 수도 있음
- 도커 파일 소스 다운로드
- Wget으로 소스파일 받기
wget https://kr.object.ncloudstorage.com/ncp-script2024/lab_source.zip
- Unzip
sudo dnf config-manager --set-disabled kubernetes
dnf install -y docker-ce --allowerasing
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker -version
systemctl enable --now docker
systemctl status docker
systemctl start docker
systemctl enable docker
→ 설치 과정에서 y 두 번 눌러야 함
- lab2에 있는 Dockerfile 사용
cd /root/lab_source/lab2
ls 명령어로 Dockerfile 확인
pwd: 현재 사용자가 위치한 작업 디렉토리의 절대 경로를 출력
more Dockerfile 명령어로 내용 확인
- 빌드
docker build -t test-image .
- 이미지 잘 만들어졌는지 확인
- nginx는 컨테이너 이름, image는 이미지 이름
- 이미지를 만들고 컨테이너를 실행
- 컨테이너 레지스트리에 이미지 넣기
- Container Registry의 Private Endpoint 확인
- 로그인
docker login xxxxxxxxx.kr.ncr.ntruss.com
- Username은 Access Key ID, Password는 Secret KEy 입력
- 도커 이미지 태그 붙이기 ★
docker image tag xxxxxxxxx.kr.ncr.ntruss.com/test-image:1.0
- 컨테이너 레지스트리에 이미지 넣기
docker push xxxxxxxxx.kr.ncr.ntruss.com/test-image:1.0
- 콘솔에서 이미지 잘 올라갔는지 확인하기
- Container Registry > 이미지 리스트
4. Container 이미지 이용 Pod 생성
wget https://www.ncloud.com/api/support/download/files/cli/CLI_1.1.26_20250918.zip
unzip CLI_1.1.26_20250918.zip
cd CLI_1.1.26_20250918/
cd cli_linux/
cp ncloud /usr/bin/
ncloud help
- 권한 설정:
ncloud configure
- Ncloud Access Key ID → Access Key 넣기
- Ncloud Secret Access Key → Secret Key 넣기
- Ncloud API URL → 그냥 엔터 치면 됨
cd
curl -o ncp-iam-authenticator -L https://github.com/NaverCloudPlatform/ncp-iam-authenticator/releases/latest/download/ncp-iam-authenticator_linux_amd64
chmod +x ./ncp-iam-authenticator
mkdir -p $HOME/bin && cp ./ncp-iam-authenticator $HOME/bin/ncp-iam-authenticator &&
export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bash_profile
ncp-iam-authenticator help
- 이후 아래 명령어에 쿠버네티스 클러스터 UUID 넣어서 입력
ncp-iam-authenticator create-kubeconfig --region KR --clusterUuid b01xxxxxxxxxx --output kubeconfig.yaml
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
- 파일 수정: alials 단축 명령어 등록
vi ~/.bash_profile
- 맨 마지막 줄에 아래 내용 추가
- O 눌러 수정 모드 진입
- 내용 추가 후 저장하고 나옴: esc 키 → :wq! 입력 후 엔터
- 나온 뒤에
source ~/.bash_profile
alias k='kubectl --kubeconfig="/root/kubeconfig.yaml"'
alias kw='watch -d kubectl get deploy,svc,pods --kubeconfig="/root/kubeconfig.yaml"'
alias kwn='watch -d kubectl get no,deploy,svc,pods --kubeconfig="/root/kubeconfig.yaml"'
- 노드 확인
k get nodes
- kwn 명령어: 모니터링하기
- 모니터링하기, 웹서비스 올리기
- kube-ops-view 설치
- 파드와 노드증가를 시각화 하여 확인하는 Kubeops view 설치
git clone https://codeberg.org/hjacobs/kube-ops-view.git
cd kube-ops-view/
k apply -k deploy
- 외부에서 kube-ops-view를 접속하기 위해서 Service Type을 LoadBalancer 로 변경
DNS CNAME
DNS CNAME은 "Canonical Name"의 약자로, DNS에서 한 도메인 이름을 다른 도메인 이름으로 별칭(alias)처럼 매핑하는 레코드 유형입니다. 즉, CNAME 레코드는 IP 주소를 직접 가리키는 것이 아니라, 다른 도메인 이름을 가리켜서 그 도메인 이름의 IP 주소를 참조하게 합니다. 예를 들어, blog.example.com에 대한 CNAME 레코드가 example.com을 가리킨다면, blog.example.com에 대한 DNS 조회 시 실제로 example.com의 IP 주소가 반환됩니다. 이를 통해 여러 도메인 이름을 하나의 IP 주소와 연결할 때 관리가 편리해지고 웹 트래픽 분산 등이 용이해집니다.
요약하자면, CNAME은 도메인의 별칭 설정으로 실제 IP 주소(예: A 레코드가 가지는)를 대신 다른 도메인 이름을 가리키는 방식입니다. 주로 www 같은 하위 도메인에 사용되며, 도메인을 관리하거나 웹서비스 주소를 유연하게 변경할 때 유용합니다.
이벤트 기반으로 접속자 많아지면 서버 늘어나게 할 수도 있음
- container registry에 있는 거 배포
k create secret docker-registry regcred --docker-server=xxxxxx.kr.private-ncr.ntruss.com --docker-username=ncp_iam_xxxxxx --docker-password=ncp_iam_xxxxxx --docker-email=xxxxxx@gmail.com
cd
cd lab_source/
cd lab3/
vi create_deployment.yaml 해서 image 부분 수정하기
- 로드밸런서 생성
k create -f create_service.yaml