[인공지능사관학교: 자연어분석A반] 기업연계 프로젝트 19일차

Suhyeon Lee·2025년 11월 4일

네이버 클라우드 특강

https://brunch.co.kr/@topasvga/5244

AI 워크로드를 위한 네이버 클라우드 쿠버네티스

  • 쿠버네티스(Kubernetes)의 일반적인 애플리케이션 배포 및 서비스 아키텍처

개발자가 코드를 작성하고 배포한 다음, 사용자가 서비스에 접속하는 전체적인 워크플로우 살펴보기

  1. 개발 및 이미지 생성

    • 개발자가 코드를 작성하여 Git 리포지토리에 푸시
    • 이벤트(예: 코드 푸시)를 감지하는 Webhook이 동작하여 빌드 프로세스를 시작
    • 코드 빌드를 통해 컨테이너 이미지 생성
      - 이미지는 ★컨테이너 레지스트리★에 저장

      ① 도커로 이미지 만들어서 컨테이너 레지스트리에 올리기
      ② 빌드를 해서 k8s의 워커노드에 pod의 형태로 배포
      ③ 사용자는 Ingress가 제공하는 외부 URL을 통해 애플리케이션에 접근 → 외부에서 클러스터로 들어오는 트래픽은 L4 로드밸런서(L4 스위치)를 통해 인그레스 컨트롤러로 전달되고, 인그레스 컨트롤러가 L7 로드밸런서처럼 작동하여 적절한 서비스로 트래픽을 보냄
      → 인그레스는 L7 로드 밸런서 이므로 L4 로드 밸런서로 라우팅을 해줄 수 있음
      → 클라우드에서 제공하는 로드밸런서와 파드를 연결한 후 해당 로드밸런서 IP를 이용해 클러스터 외부에서 파드에 접근할 수 있도록 함
      (외부 트래픽이 로드밸런서를 통해 인그레스 컨트롤러로 들어오고 내부 Pod로까지 이어짐: 참고)

  2. 배포

    • 개발자가 kubectl 또는 Helm과 같은 도구를 사용하여 쿠버네티스 API 서버에 배포 명령을 보냄
    • Kubernetes API 서버는 배포 요청을 받아들이고, Control Plane의 컴포넌트(예: Scheduler)는 Pod를 실행할 적절한 Node (Worker)를 결정
    • Deployment는 배포된 애플리케이션의 상태를 관리하고, 원하는 수의 Pod 복제본이 항상 실행되도록 보장함
  3. 서비스 노출

    • Node (Worker)에 있는 Pod
      • 실제 애플리케이션 컨테이너를 실행하는 가장 작은 배포 단위
      • 하나 이상의 컨테이너를 포함할 수 있습니다
    • Service는 Pod들의 논리적인 그룹을 정의하고, 안정적인 네트워크 접근을 위한 고정된 가상 IP와 DNS 이름을 제공함
      • Pod가 재생성되어 IP가 바뀌더라도 Service를 통해 Pod에 접근할 수 있음
    • Ingress는 클러스터 외부의 트래픽을 내부 서비스로 라우팅하는 규칙을 정의
      • Ingress Controller는 이 규칙에 따라 트래픽을 적절한 Service로 전달
  4. 사용자 접근

    • 최종 사용자는 Ingress가 제공하는 외부 URL을 통해 애플리케이션에 접근할 수 있음
    • 사용자의 요청은 Ingress Controller를 거쳐 Service로 전달되고, Service는 Pod 중 하나로 트래픽을 분산하여 최종적으로 애플리케이션에 도달함
  • 포인트
    • 도커로 이미지 만들기
    • 컨테이너 레지스트리에 올리기
    • 쿠버네티스에 올려 배포하기
      • 쿠버네티스 구축 & 실체 구축한 모델 도커에 올리고 빌드해서 쿠버네티스 worker에 넣기
      • 도커는 따로 공부하기~

AI workloads로 쿠버네티스 사용하기

  • 목표
    1. 쿠버네티스 사용 네트워크 생성
    2. NKS 생성
    3. 로키 리눅스로 명령서버 생성
    4. 쿠버네티스에 서비스 올리기

AI 워크로드란?

  • 목차
  1. 쿠버네티스 네트워크 생성
  2. NCP Kubernetes 클러스터 생성
  3. Container Registry 이용 Container 이미지 관리
  4. Container 이미지 이용 Pod 생성
  5. LoadBalancer 확인 및 서비스 접속 테스트
  6. Pod 운영/관리

1. 쿠버네티스 네트워크 생성

  • 네이버 클라우드 네트워크 특징
    1. NATGW 전용 서브넷 구축 필요
    2. LoadBalancer 전용 서브넷 구축 필요

  • 네트워크 구축: 6개 서브넷
    1. VPC (Virtual Private Cloud) > VPC Management > VPC 생성
      • VPC 이름: agame-dev-vpc
      • IP 주소 범위: 10.0.0.0/20 → C-Class 16개(일반적으로 /20 정도면 1개 서비스를 운영하는데 큰 이슈는 없다고 함)
      • 유형: NORMAL
    2. 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개 함
      • 우리는 실습이니까 그냥 1개만 설정해도 됨
    • 클러스터 생성이 완료된 이후 UUID 필요하니까 복사해두기
    • 외부에서 서비스에 접근할 수 있게 해주는 네트워크 장비: LoadBalancer
    • 현재까지 진행 순서
      • vpc
      • subnet
      • kubernetes
    • 클러스터 생성 완료되면 명령 서버 만들기
      • 새로운 공인 IP 할당 꼭 하기~

3. Container Registry 이용 Container 이미지 관리

  • Container Registry 생성 순서
    1. Object Storage 버켓 생성
      • Services > Storage > Object Storage > 버킷 생성
      • 버킷 이름: ncp-kube-1
      • 전체 공개: 공개 안함 (디폴트)
    2. 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로 설정
  • 로키 리눅스 생성: 도커 설치용
    • 로키 리눅스 생성
      • docker1, ncp-docker1
    • 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
      • unzip lab_source.zip
  • Docker 설치
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 .
    • 이미지 잘 만들어졌는지 확인
      • docker images
    • nginx는 컨테이너 이름, image는 이미지 이름
    • 이미지를 만들고 컨테이너를 실행
  • 참고: Dockerfile 예제
  • 컨테이너 레지스트리에 이미지 넣기
    • 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 생성

  • ncloud CLI 다운로드
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 → 그냥 엔터 치면 됨
  • 사용을 위한 인증: ncp-iam 설치
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
  • kubectl 설치
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 로 변경
    • k edit svc kube-ops-view

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에 있는 거 배포
    • secret 생성
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
  • lab3으로 이동 후 배포
cd
cd lab_source/
cd lab3/
  • vi create_deployment.yaml 해서 image 부분 수정하기
  • 로드밸런서 생성
    • k create -f create_service.yaml
profile
2 B R 0 2 B

0개의 댓글