NestJS로 Hello World만 찍어주는 간단한 웹서버를 만들고, Dockerfile을 생성해 이미지로 빌드해놓자.
nest new .
잘 세팅됐고, 실행도 한번 확인해보자.
npm run start:dev
굳. 빠르게 도커파일도 만들어보자.
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 .
docker push qkrwogk/kube-test:ver1
macOS 환경에서 minikube를 설치 및 실행해본다.
도커는 설치되어 있어야 함 (다른 vm을 활용할수도 있지만 일반적으로 docker driver를 사용한다)
brew install minikube
홈브루를 활용해 minikube 설치
minikube start
실행. 뭔가 귀염뽀짝하다.
docker 드라이버를 사용한다는 문구를 확인할 수 있다. 좀 걸림
minikube dashboard
기본 제공되는 대시보드 기능을 켜본다.
잘 됨! 여기에 우리가 원하는 pod들을 띄우면 보기좋게 정보를 확인할 수 있다.
docker 컨테이너도 잘 띄워져 있더라.
참고로 pod는 docker의 container처럼, kubernetes의 기본 실행단위라고 보면 되시겠다. 자세한 정보는 공부하면서 차차 알아가자.
이걸 대체 왜 쓰는지도!
이제 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 확인
좋다. 끄고 싶으면 kubectl delete
kubectl delete -n default pod kube-test
잘 실행되네욤
슈팅1. docker 로그인 안된다는 문제.
docker push qkrwogk/kube-test:ver1
이상해서 docker push 한번 해보니 해결됨.
슈팅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. 그래~도~ 안되더라.
kubectl exec kube-test -it /bin/sh
docker exec
처럼 들어가서 확인해봄.
node dist/main
netstat -an
ps -ef | grep node
분명 잘 돌아가고 있는데.. localhost가 아니라 docker network처럼 별도의 도메인이 있는걸까?
드디어 비밀을 찾았다.. service를 만들어야만 외부로 노출시킬 수 있는거였다..
처음 봤던 학습메모 8에도 다 있었던건데.. 문서 좀 제대로 보자.
kubectl expose pod kube-test --type=LoadBalancer
kubectl get service
이걸론 안되고, minikube에서 서비스를 실행해줘야 한다.
minikube service kube-test
드디어 된다. 눈물이 난다.
IAM 계정부터 만들어주자.
루트 사용자 계정으로 절대 관리하지 말 것! 호눅스님의 첫 번째 지침!
권한 정책 AdministratorAccess를 찾아 사용자 그룹도 만들어주고
여기다 만든 계정 넣어서 사용자 생성!
비번은 안전하게 바꾸고 로그인해준다. (계정 지웠으니 넘보지마셈ㅋ)
EC2 인스턴스 생성해보자!
AMI는 (프리티어 사용가능한) 추천하는대로,
인스턴스 유형은 (마찬가지로 프리티어 사용가능한) t2.micro!
키페어는 안전하게 pem 파일로 떨궈주고
보안 그룹(SG)는 따로 생성하도록 해서 필요할 때 편집할 수 있게.
SSH와 HTTP 트래픽은 꼭꼭 허용해서 관리와 웹 접근이 가능하게 한다.
테스트용이니 볼륨은 10GB면 충분
자 생성 잘 됐다.
SSH 클라이언트 연결에 대한 정보를 얻어보자.
기본 생성되는 계정 이름은 ec2-user. 키페어는 -i 옵션으로 접근하면 됨.
chmod 400 [키페어파일.pem]
근데 그전에 키페어 파일 400으로 퍼미션 바꿔야 됨
잘되쥬?
도커 설치를 쭉 해보자.
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
아 맞다 플랫폼.. 도커 빌드 다시 해서 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
이거지
잘 된다 ㅠㅠ 흑흑 대성공
백그라운드에서 실행하려면 -d 옵션 주면 된다. NCP 할때 다 했으니 생략