프로젝트 소개 📍
자동으로 README를 생성해주고, 코드를 문서화해주며, 이를 바탕으로 한 지능형 챗봇을 제공하는 웹 기반 서비스이다.
- README 생성
- 프로젝트 개요, 기능, 설치 및 사용 방법 등을 포함한 README 파일을 자동으로 생성
- Docs 생성 (Java와 Spring 프로젝트)
- 코드를 분석해 API 문서, 클래스 다이어그램, 시퀀스 다이어그램 등 다양한 형태의 문서를 자동으로 생성
- Controller별 요약 문서를 제공
- 지능형 챗봇
- 지능형 챗봇이 개발자와 대화하며 코드 관련 질문에 답변하고, 코드 개선을 위한 제안을 제공
작업 📍
테스트 환경 구축
개발 프로세스의 속도를 높이고자 개발 환경과 배포 환경을 분리하였다.
카카오테크 부트캠프에서 제공한 크램폴린을 활용하여 테스트 서버를 구성하였고,
개발자들이 언제든지 테스트를 수행할 수 있는 환경을 조성했다.
학습용으로 제공돼서 그런지, 크램폴린이 이슈가 많았다 ..
CICD 자동화 불가, 팀원에게 root 권한 주는것 불가, secret 생성 불가, kargo는 팀당 1개, 복잡한 proxy 설정..ㅠㅠ
그래서 테스트 환경으로만 간단히 구성하고, Prod 환경으로 바로 넘어갔다!
Prod 환경 구축
Terraform과 eksctl을 활용하여 AWS EKS 환경을 구축
Ingress, ALB 구성
ALB로 분산 & 다른 호스트 + Nginx Pod 띄우기
- Developer → developer.dododocs.com → ALB → Nginx Pod → ArgoCD/Grafana/Prometheus/vault
- User → dododocs.com → ALB → Frontend 서버
- why?
- 관리 편의성 및 보안을 강화
- ArgoCD도 대시보드 들어갈거면 외부 ALB 설정해야됨 → 기존 ALB 연결.
- service 설정시 Nginx가 ec2 인스턴스면 대시보드에서밖에 설정하지 못함(+ 바뀔 위험). 그럴바엔 Nginx도 pod로 띄우자.
- 다른 Namespace의 LB 사용하는 방법
[AWS/EKS] 다른 Namespace의 LB 사용하는 방법
# FE/dododocs-ingress.yaml...kind: Ingressmetadata: name: dododocs-ingress namespace: frontend annotations: alb.ingress.kubernetes.io/group.name: shared-alb...문제 상황 📌Frontend를 접근하는 ALB가 있는 상황Developer 입장에서도 argocd,
dev-shim99.tistory.com
[트러블 슈팅] ArgoCD path 설정
https://dev-shim99.tistory.com/57
[ArgoCD][트러블 슈팅] ArgoCD path 설정
📌 문제 상황nginx에서 argocd-service로 /argocd 경로로 reverse proxy.로그인 화면까지는 잘 보임로그인 이후 url의 path가 /argocd/argocd/applications로 변경됨 → 화면이 안뜸 !!!/argocd/applications 으로 path를 변경
dev-shim99.tistory.com
대시보드 Path 설정
- ArgoCD
# argo-cd/my-values.yaml
## Globally shared configuration
global:
# -- Default domain used by all components
## Used for ingresses, certificates, SSO, notifications, etc.
domain: developer.dododocs.com/argocd
config:
params:
# -- Value for base href in index.html. Used if Argo CD is running behind reverse proxy under subpath different from /
server.basehref: /argocd/
# -- Used if Argo CD is running behind reverse proxy under subpath different from /
server.rootpath: '/argocd'
- Prometheus
# kube-prometheus-stack/my-values.yaml
## Deploy a Prometheus instance
##
prometheus:
prometheusSpec:
## External URL at which Prometheus will be reachable.
##
externalUrl: "https://developer.dododocs.com/prometheus"
## Prefix used to register routes, overriding externalUrl route.
## Useful for proxies that rewrite URLs.
##
routePrefix: /prometheus
- Grafana
# kube-prometheus-stack/my-values.yaml
## Using default values from https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml
##
grafana:
enabled: true
ingress:
## If true, Grafana Ingress will be created
##
enabled: false
grafana.ini:
server:
root_url: "https://developer.dododocs.com/grafana/"
serve_from_sub_path: true
EKS VPC, Subnet 요구사항
- Subnet
- Kubernetes 1.18 이하 → Amazon EKS에서 지정된 모든 서브넷에 다음 태그를 추가키 값
kubernetes.io/cluster/my-cluster shared - 최신 버전(2.2.0 이상)의 AWS Load Balancer Controller를 사용 중이라면, kubernetes.io/cluster/<cluster-name> 태그는 필수 X
- Kubernetes 1.18 이하 → Amazon EKS에서 지정된 모든 서브넷에 다음 태그를 추가키 값
- Subnet - LoadBalancer
- 자동 서브넷 선택 → Controller가 서브넷을 자동으로 감지하게 하려면 태그가 필요
- 프라이빗 서브넷키 값
kubernetes.io/role/internal-elb 1 - 퍼블릭 서브넷키 값
kubernetes.io/role/elb 1
...
metadata:
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing # 퍼블릭 로드 밸런서를 생성
# alb.ingress.kubernetes.io/scheme: internet-facing # 내부 로드 밸런서를 생성
...
eksctl
구성하며 배운 내용들 기반으로 기술 세미나를 진행하였다.
아래 github 참고!
https://github.com/ShimHyesu/KTB_TechSession
GitHub - ShimHyesu/KTB_TechSession: 2024.11.19_카카오테크 부트캠프 기술 세미나_클라우드 - EKS 설정법
2024.11.19_카카오테크 부트캠프 기술 세미나_클라우드 - EKS 설정법. Contribute to ShimHyesu/KTB_TechSession development by creating an account on GitHub.
github.com
CI/CD
CI
GitHub Actions로 CI진행해서 DockerHub로 이미지를 Push하는 형태로 진행했다.
이때, Tag는 커밋해시로 지정했다.
추후, Prod 환경에서 이미지 태그는 release tag와 이미지 태그 맞춰서 진행할 예정 !
CD
helm으로 설치한 ArgoCD로 진행!
ArgoCD는 Git 저장소의 Manifest 파일을 수정해야 배포가 이루어지는 구조
⇒ ArgoCD Image Updater + Kustomize 사용
https://dev-shim99.tistory.com/58
[ArgoCD] ArgoCD Image Updater 적용기
문제 상황 📌CI 과정에서 Git commit Hash로 Docker image tag를 설정해서 DockerHub에 Push 하였다.근데, ArgoCD는 Git만 바라보므로, Image 태그가 변경되었다는 Manifest를 변경해주어야 ArgoCD가 배포를 다시 해준
dev-shim99.tistory.com
Dockerhub에 업데이트되면 자동으로 배포되므로, CI 정상 빌드 결과와 악의적인 변조를 구분할 수 X
이를 위해서는 이미지 서명, 어드미션 컨트롤러 기반 검증, 권한 관리, 이미지 스캐닝, 정책 엔진 적용 등의 추가적인 보안 대책이 필요
Cosign + Kyverno
Cosign 이미지 서명 도구를 사용해, CI 파이프라인에서 빌드 후 이미지를 푸시할 때 해당 이미지를 서명(Sign)
이후 Kubernetes Admission Controller(Kyverno)를 통해 서명되지 않은 이미지는 클러스터에 반영되지 않도록 정책을 설정
⇒ 보안 강화!!
보안
Kubernetes Secrets
Kubernetes Secret → Base64로 인코딩되어 etcd 데이터베이스에 저장
- 한계점
- Base64 인코딩: 단순히 데이터를 직렬화하여 저장하는 방식
- etcd 저장시 암호화되지 않은 상태로 저장되기 때문에, etcd에 접근 권한이 있는 사용자는 Secret 데이터를 열람
- 클러스터 내부에서 권한을 가진 사용자가 kubectl get secret 명령을 통해 쉽게 Secret 데이터를 조회
12/01 AWS 털림 이슈
2024년 12월 1일 오후 8시경 털렸다..
AWS 메일로 확인했고,
온갖 region에 g5.xlarge 인스턴스 10개씩 만드려고 했던것 확인했다.
바로 확인하지 않았으면, 시간당 최소 100달러가 나갔을것으로 생각한다.. 진짜 천만다행 🥲
이후, 보안을 강화하기 위해
- Vault 도입
- IAM Role 기반 권한 위임
- 최소 권한 원칙 적용
등의 방법을 적용했다.
Vault
Vault를 도입하여 중앙 집중식 키 관리를 구현하고,
Vault에서 키를 받아오는 과정을 최소화하고자 vault agent injector 를 도입, 사이드카 방식으로 시크릿을 주입하였다.
모니터링
helm으로 kube-prometheus-stack을 설치했다!
prometheus와 grafana로 모니터링을 구성하였다~
또한, 기존에 CloudWatch로 ALB의 모니터링도 진행했지만, 모니터링 데이터가 분산되어 있었다.
따라서, 알림 감지 및 대응 시간이 오래 걸렸다.
⇒ CloudWatch 데이터를 Grafana로 가져와 모니터링 데이터 통합
- 단일 대시보드에서 모든 데이터를 시각화. ( 데이터 접근 시간이 5분에서 1분으로 단축 )
- Grafana의 알림 시스템 통합으로 알림 감지 및 대응 시간 개선. ( 경고 확인 시간이 기존 10분에서 즉시 알림 처리로 개선 )
- 알림 규칙의 통합 관리로 중복 경고 제거와 정확도 향상을 달성.
AWS Lambda 적용
기존에는 AI 서버가 문서 생성과 챗봇 기능을 모두 처리했다.
모니터링 결과,
- 상태 체크를 위한 S3, 백엔드, AI 서버 간 빈번한 HTTP 통신이 비효율적으로 리소스를 소모
- 서버 부하 증가 시 응답 시간을 일정하게 유지하기 어려운 문제를 발견
⇒ AI Document 생성의 경우, Lambda 함수를 활용하고, S3 트리거를 사용하자!
AI Chat의 경우, 서버는 띄워 놓고 BE에서 Webflux 처리 (스트리밍 구현)
결과
AI 서버의 CPU 사용량은 28.1%, 메모리 사용량은 46.2% 감소했으며,
서버 부하와 HTTP 요청을 크게 줄이고 응답 시간을 개선할 수 있었다!
또한, Lambda 함수 이미지의 CI/CD를 자동화하기 위해 AWS CodePipeline를 활용했다.
배포가 너무 느리긴 했지만 .. 그래도 개발 생산성을 향상시킬 수 있었다 !
비용 산정
회고 📍
오렌지폭주족🍊이라는 팀명으로 정말 폭주족처럼 달렸던 3개월..
후회하지 않을만큼 열심히 한 것 같다.
사실 모바일 앱을 개발하거나 클라우드 프로젝트를 진행했을때, 같이 협업할 팀원이 없었는데
이번에 처음으로 클라우드 팀원과 함께 진행하니 감회가 새로웠다.
고집대로가 아닌, 프로젝트를 위해서 그리고 일정을 위해서 서로 양보하기도 하고 치열하게 다투기도 한 것 같다.
감정이 때로는 격해질때도 있었지만, 어떤 부분에서 어떻게 해야하는지, 상대방의 의견을 어떻게 수용해야하는지
분업이 아닌 협업을 정말 제대로 느껴본 것 같다.
든든한 팀원들 덕분에 어느 부분 맡아서 해달라고 맘 놓고 말 할 수 있었고, 해보고 싶은 것을 편하게 말 할 수 있었다. (Lambda함수..ㅎ)
그덕에 프로젝트의 완성도가 이렇게 높을 수 있었던것 같다ㅎㅎ
팀원 모두가 이 프로젝트에 욕심냈던, 정말 맘에 드는 프로젝트였다. 짱짱
그 노력을 알아봐준건지, 카카오테크 부트캠프 파이널 프로젝트에서 우수상을 받았다!
혼자 AI를 맡았지만, 정말 ... 완성도 높게 해주고 항상 요구사항 들어줬던 Kevin
같은 클라우드 팀원으로서, 프로젝트에 대해 긍정적으로 다투고 업무를 맡기는게 항상 든든했던 K.ko
레전드 UI/UX .. 진짜 너무 이쁘고 세련되게 만들고, 항상 팀 분위기 띄워줬던 Joshua
에세이스트로 놀리곤 했지만, 능력이 출중해서 뚝딱뚝딱 금방 만들어내고, 면접보고 난 이후에도 와줬던 Haon
언제 이렇게 든든하고 완벽한 팀원 만날 수 있을지 !
의지를 두려워했던 나는, 이번 기회로 누군가에게 충분히 의지할 수 있게 되었다
오렌지 폭주족 화이팅 !
그리고 Dododocs는 ?
너무나도 잘 만들어져서 1달 혹은 그 이상 운영을 좀 해보자고 결론 지었다.
우리 Dododocs 정상영업합니다...
링크📍
Dododocs
자동으로 README를 생성해주고, 코드를 문서화해주며, 이를 바탕으로 한 지능형 챗봇을 제공하는 웹 기반 서비스 "Dododocs" - Dododocs
github.com
https://www.youtube.com/watch?v=kNIDehuqLqo