Kubernetes 기초(minikube), docker image 최적화(멀티스테이징), AWS IAM & EC2

박재하·2023년 12월 3일
0

DevOps 기초

목록 보기
1/9

목표

  • NestJS docker image 최적화
  • 로컬 환경에서 minikube 설치 및 실행
  • 프로젝트 kubernetes pod로 실행하기
  • 트러블 슈팅
  • kubernetes 서비스 만들고 실행하기
  • AWS에서 실행하기

NestJS docker image 최적화

NestJS로 Hello World만 찍어주는 간단한 웹서버를 만들고, Dockerfile을 생성해 이미지로 빌드해놓자.

nest new .
스크린샷 2023-12-03 오후 8 53 32

잘 세팅됐고, 실행도 한번 확인해보자.

npm run start:dev
스크린샷 2023-12-03 오후 8 55 13

굳. 빠르게 도커파일도 만들어보자.

FROM node:20-alpine AS builder

WORKDIR /app

COPY . /app
RUN cd /app && \
    npm run build

FROM node:20-alpine AS app

WORKDIR /app

USER node

COPY --chown=node:node --from=builder /app/dist /app/dist
COPY --chown=node:node --from=builder /app/node_modules /app/node_modules

RUN cd /app

EXPOSE 3000

CMD ["node", "dist/main"]

Dockerfile 멀티스테이징을 통해 이미지 최적화도 한번 해봄. 꼭 필요한 부분만 들어가게!

docker build -t qkrwogk/kube-test:ver1 .
스크린샷 2023-12-03 오후 10 07 02
docker push qkrwogk/kube-test:ver1

로컬 환경에서 minikube 설치 및 실행

macOS 환경에서 minikube를 설치 및 실행해본다.

도커는 설치되어 있어야 함 (다른 vm을 활용할수도 있지만 일반적으로 docker driver를 사용한다)

brew install minikube
스크린샷 2023-12-03 오후 7 05 10

홈브루를 활용해 minikube 설치

minikube start
스크린샷 2023-12-03 오후 7 11 13

실행. 뭔가 귀염뽀짝하다.
docker 드라이버를 사용한다는 문구를 확인할 수 있다. 좀 걸림

minikube dashboard
스크린샷 2023-12-03 오후 7 13 01

기본 제공되는 대시보드 기능을 켜본다.

스크린샷 2023-12-03 오후 7 12 45

잘 됨! 여기에 우리가 원하는 pod들을 띄우면 보기좋게 정보를 확인할 수 있다.

스크린샷 2023-12-03 오후 9 54 37

docker 컨테이너도 잘 띄워져 있더라.

참고로 pod는 docker의 container처럼, kubernetes의 기본 실행단위라고 보면 되시겠다. 자세한 정보는 공부하면서 차차 알아가자.

이걸 대체 왜 쓰는지도!

프로젝트 kubernetes pod로 실행하기

이제 minikube로 아까 생성한 이미지를 띄워보자.

먼저 kubernetes yaml 설정파일을 만들어야 한다.

kubectl을 이용해 자동 생성하는게 국룰.

kubectl run kube-test --image=qkrwogk/kube-test:ver1 --port 3000 -o yaml > kube-test.yml

포트 지정해주는 것 까먹지 않기! 파일 확인해보면 다음과 같다.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2023-12-03T13:59:33Z"
  labels:
    run: kube-test
  name: kube-test
  namespace: default
  resourceVersion: "5698"
  uid: d2995dcf-e84a-43cd-9384-10bc215bd6a6
spec:
  containers:
  - image: qkrwogk/kube-test:ver1
    imagePullPolicy: IfNotPresent
    name: kube-test
    ports:
    - containerPort: 3000
      protocol: TCP
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-ttwx2
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-ttwx2
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  phase: Pending
  qosClass: BestEffort

자 됐다. 이제 정상적으로 실행되고 있는지 확인

kubectl get nodes # node 확인(minikube)
kubectl get pods # 방금 실행한 pod 확인
스크린샷 2023-12-03 오후 10 42 31

좋다. 끄고 싶으면 kubectl delete

kubectl delete -n default pod kube-test
스크린샷 2023-12-03 오후 10 43 56 스크린샷 2023-12-03 오후 11 00 55

잘 실행되네욤

트러블 슈팅

1

스크린샷 2023-12-03 오후 10 50 50

슈팅1. docker 로그인 안된다는 문제.

docker push qkrwogk/kube-test:ver1

이상해서 docker push 한번 해보니 해결됨.

2

스크린샷 2023-12-03 오후 11 16 03

슈팅2. 그래도 안되더라. 포트 문제인가 싶어 생각해보니
container 포트를 열어준 기억이 없더라.

kubectl run kube-test --image=qkrwogk/kube-test:ver1 --port 3000 -o yaml > kube-test.yml
...
spec:
  containers:
  - image: qkrwogk/kube-test:ver1
    imagePullPolicy: IfNotPresent
    name: kube-test
    ports:
    - containerPort: 3000
      protocol: TCP
    resources: {}

containerPort 3000 여는 것을 설정파일에서 확인할 수 있음.

3

슈팅 3. 그래~도~ 안되더라.

kubectl exec kube-test -it /bin/sh

docker exec처럼 들어가서 확인해봄.

node dist/main
netstat -an
ps -ef | grep node
스크린샷 2023-12-03 오후 11 25 46

분명 잘 돌아가고 있는데.. localhost가 아니라 docker network처럼 별도의 도메인이 있는걸까?

스크린샷 2023-12-03 오후 11 38 34

드디어 비밀을 찾았다.. service를 만들어야만 외부로 노출시킬 수 있는거였다..

스크린샷 2023-12-03 오후 11 41 47

처음 봤던 학습메모 8에도 다 있었던건데.. 문서 좀 제대로 보자.

kubernetes 서비스 만들고 실행하기

kubectl expose pod kube-test --type=LoadBalancer
kubectl get service
스크린샷 2023-12-03 오후 11 43 45

이걸론 안되고, minikube에서 서비스를 실행해줘야 한다.

minikube service kube-test
스크린샷 2023-12-03 오후 11 47 49 스크린샷 2023-12-03 오후 11 49 38

드디어 된다. 눈물이 난다.

AWS에서 실행하기

IAM

스크린샷 2023-12-04 오전 12 02 48

IAM 계정부터 만들어주자.
루트 사용자 계정으로 절대 관리하지 말 것! 호눅스님의 첫 번째 지침!

스크린샷 2023-12-04 오전 12 04 45 스크린샷 2023-12-04 오전 12 05 05

권한 정책 AdministratorAccess를 찾아 사용자 그룹도 만들어주고

스크린샷 2023-12-04 오전 12 05 17

여기다 만든 계정 넣어서 사용자 생성!

스크린샷 2023-12-04 오전 12 05 30 스크린샷 2023-12-04 오전 12 08 37

비번은 안전하게 바꾸고 로그인해준다. (계정 지웠으니 넘보지마셈ㅋ)

EC2

스크린샷 2023-12-04 오전 12 15 28

EC2 인스턴스 생성해보자!

스크린샷 2023-12-04 오전 12 15 40

AMI는 (프리티어 사용가능한) 추천하는대로,
인스턴스 유형은 (마찬가지로 프리티어 사용가능한) t2.micro!

스크린샷 2023-12-04 오전 12 15 01

키페어는 안전하게 pem 파일로 떨궈주고

스크린샷 2023-12-04 오전 12 16 34

보안 그룹(SG)는 따로 생성하도록 해서 필요할 때 편집할 수 있게.
SSH와 HTTP 트래픽은 꼭꼭 허용해서 관리와 웹 접근이 가능하게 한다.

스크린샷 2023-12-04 오전 12 17 45

테스트용이니 볼륨은 10GB면 충분

스크린샷 2023-12-04 오전 12 17 50 스크린샷 2023-12-04 오전 12 18 23 스크린샷 2023-12-04 오전 12 18 50

자 생성 잘 됐다.

스크린샷 2023-12-04 오전 12 21 56

SSH 클라이언트 연결에 대한 정보를 얻어보자.
기본 생성되는 계정 이름은 ec2-user. 키페어는 -i 옵션으로 접근하면 됨.

chmod 400 [키페어파일.pem]
스크린샷 2023-12-04 오전 12 22 45

근데 그전에 키페어 파일 400으로 퍼미션 바꿔야 됨

스크린샷 2023-12-04 오전 12 22 29

잘되쥬?

docker로 실행

도커 설치를 쭉 해보자.

sudo yum update -y
sudo yum install docker -y
docker -v
sudo service docker start
sudo usermod -aG docker ec2-user

이제 아까 만든 도커 이미지를 가져오자

sudo docker pull qkrwogk/kube-test:ver1
sudo docker images
sudo docker run qkrwogk/kube-test:ver1 -p 80:3000
스크린샷 2023-12-04 오전 12 29 50

아 맞다 플랫폼.. 도커 빌드 다시 해서 push하자

docker build -t qkrwogk/kube-test:ver2 . --platform=linux/amd64
docker push qkrwogk/kube-test:ver2

이제 EC2에 와서 다시 pull 하자

sudo docker pull qkrwogk/kube-test:ver2
sudo docker run -p 80:3000 qkrwogk/kube-test:ver2
스크린샷 2023-12-04 오전 12 39 07

이거지

스크린샷 2023-12-04 오전 12 35 28

잘 된다 ㅠㅠ 흑흑 대성공

백그라운드에서 실행하려면 -d 옵션 주면 된다. NCP 할때 다 했으니 생략

학습 메모

  1. Mac OS에서 Minikube로 Kubernetes 로컬 개발환경 구축하기
  2. NestJS 프로젝트 docker 배포 + 이미지 크기 줄이기
  3. minikube를 이용하여 싱글 노드에 배포해보기
  4. [kubernetes] #6 쿠버네티스 YAML 설정 파일
  5. [Kubernetes] kubectl로 yaml 파일 생성하기 (+ yaml 파일 구성)
  6. 쿠버네티스 미니큐브 실습
  7. minikube 공식문서
  8. Minikube 실습 - Pod 생성 (docker build & kubectl run & service)
  9. [AWS] IAM 유저 생성하기
  10. [AWS] EC2 알아보기 + 인스턴스 생성하기
  11. [AWS] EC2 Linux에 Docker 설치하기
profile
해커 출신 개발자

0개의 댓글