-
『EKS』EKS기반 인프라 및 CICD구성 실습 - 4AWS/아키텍쳐 구현 2022. 6. 22. 14:56
아키텍쳐
이전 포스팅을 보고 설정을 해야한다.
CodeBuild 및 ECR
aws에서 codebuild로 들어간다.
이제 처음에 다운받았던 node.js파일로 돌아가서 Dockerfile을 열어보자
# Docker Base Image # 기본이 되는 이미지 FROM node:16.15 # Use Command # 사용하는 명령어 RUN mkdir -p /apiapp # WORKDIR mean fixed and working dir # WORKDIR의 의미는 작업하는 디렉토리를 지정하는 것. WORKDIR /apiapp # copy files to /apiapp # 현재 디렉토리에 있는 파일을 /apiapp으로 복사한다. ADD . /apiapp # Use Command # 사용하는 명령어 RUN npm ci RUN apt-get update RUN apt-get install awscli -y RUN aws configure set aws_access_key_id <Access_ID> RUN aws configure set aws_secret_access_key <Secret_Access_Key> RUN aws configure set region <Region> # port listen # 포트리스닝 EXPOSE 8080 # docker run -> CMD # 도커 실행 후 사용할 명령어 CMD ["node", "server.js"]
이 파일의 aws configure set 부분의 Access_ID와 Secret_Access_Key부분을 삭제하고
Region을 ap-northeast-2로 바꾼다.
# Docker Base Image # 기본이 되는 이미지 FROM node:16.15 # Use Command # 사용하는 명령어 RUN mkdir -p /apiapp # WORKDIR mean fixed and working dir # WORKDIR의 의미는 작업하는 디렉토리를 지정하는 것. WORKDIR /apiapp # copy files to /apiapp # 현재 디렉토리에 있는 파일을 /apiapp으로 복사한다. ADD . /apiapp # Use Command # 사용하는 명령어 RUN npm ci RUN apt-get update RUN apt-get install awscli -y RUN aws configure set region ap-northeast-2 # port listen # 포트리스닝 EXPOSE 8080 # docker run -> CMD # 도커 실행 후 사용할 명령어 CMD ["node", "server.js"]
이제 Dockerfile은 준비가 끝났다. 다음 단계는 ecr을 생성하도록 하자. 별로 어렵지 않다.
이번에는 buildspec을 작성해야한다. codebuild가 작동하려면 반드시 필요한 작업이다.
version: 0.2 phases: install: runtime-versions: nodejs: latest pre_build: commands: - sudo yum install docker -y build: commands: - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin $AWS_ACCOUNT_NUMBER.dkr.ecr.ap-northeast-2.amazonaws.com - docker build -t ekci-repo . - docker tag ekci-repo:latest $AWS_ACCOUNT_NUMBER.dkr.ecr.ap-northeast-2.amazonaws.com/ekci-repo:latest - docker push $AWS_ACCOUNT_NUMBER.dkr.ecr.ap-northeast-2.amazonaws.com/ekci-repo:latest post_build: commands: - echo "Build End!"
$AWS_ACCOUNT_NUMBER는 자신의 것으로 바꿔서 사용하거나 codebuild에서 변수를 사용하면 된다.
그 다음 해당 파일들을 모으면 아래와 같이 된다.
이 내용들을 github의 dev라는 branch에 업로드한다. 그리고 생성할때 ops라는 branch까지 같이 만든다.
ops에는 manifest파일을 넣을 것이다.
배포할 파이프 라인을 만들어주도록 하자.
이렇게 하면 정상적으로 ECR로 이미지가 push가 된다.
이제 yaml manifest파일만 업로드하면 끝이다. 아래 코드들을 manifest라는 폴더안에 넣고 ops라는 브런치로 push한다.
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: ekci-dey labels: app: ekci-apps spec: replicas: 2 selector: matchLabels: app: ekci-app template: metadata: labels: app: ekci-app spec: serviceAccountName: ekci-irsa containers: - name: ekci-app image: <Account_Number>.dkr.ecr.ap-northeast-2.amazonaws.com/ekci-repo:latest imagePullPolicy: Always # https://m.blog.naver.com/vefe/221888345952 ports: - containerPort: 8080 name: apiport protocol: TCP
<Account_Number>는 자신의 값으로 바꾼다.(더이상 설명은 X)
아니면 configmap이나 secret을 통해서 변수로 사용해도 된다.
ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ekci-ingress annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/subnets: <Public_Subnet's> alb.ingress.kubernetes.io/load-balancer-name: ekci-alb spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: ekci-ser port: number: 8080
<Public_Subnet's>부분은 cloudformation의 public subnet부분을 복사 붙여넣기한다.
service.yaml
apiVersion: v1 kind: Service metadata: name: ekci-ser spec: selector: app: ekci-app ports: - port: 8080 targetPort: 8080 protocol: TCP nodePort: 30010 type: NodePort
이렇게 모든 준비가 완료되었으니 localhost로 포트포워딩한 ArgoCD로 접속하여 아래 과정을 따른다.
이제 눌러보자
정상적으로 작동하는 모습을 볼 수 있다. 이제 Applicationi LoadBalancer로 들어가서 생성된 것을 확인을 해본뒤 생성이 완료되면 도메인을 복사해 postman으로 이동하여 아래와 같은 결과를 얻으면 성공이다.
get으로 조회도 해보자.
정상적으로 잘 받아온다.
끝내기 전
모든 과정이 완료되었다.
이제 모든 리소스를 까먹지 말고 삭제해야한다.
사실 그냥 cloudformation에서 나와있는 모든걸 삭제하고 생성한 리소스들만 따로 또 삭제해주면된다.
알게된 내용들
Codebuild를 오랫만에 만져봐서 순간 헷갈렸다.
docker를 설치하고 systemctl start를 하는데 안되길래 당황했지만
그냥 생략하니까 되버려서 허무하다.
꼭 빨리 삭제해야하는 이유
중간에 deployment 부분에서 <account>값을 주었기에 정보 보안 차원에서 빠르게 삭제하거나 아니면
k8s의 secret기능을 사용해서 다시 만들어보는 것도 좋다. 난 까먹고 못해서 빨리 삭제하는 걸 권장한다.