2023.6.15
제3회 당근마켓 SRE 밋업의 표를 구한 소마고 백엔드 개발자인 나는 바로 서울 교보타워로 현장체험학습신청서를 쓰고 달려갔다.
솔직히 어려운내용이 많았다. 이해가 되지 않는 내용도 있었다. 그러나 데브옵스 엔지니어가 아닌 백엔드 개발자인 나의 관점에서도 여러가지를 느낄 수 있었던 좋은 경험이였다.
아래는 내가 밋업 내용을 정리한 것이다. 야매로 적은거라 별로 부정확한 내용이 있을 수도 있다. 참고 바란다..
그리고 맨 아래에는 백엔드 개발자 관점으로 본 나의 후기도 남겨보았다.
Kontrol(개발자 플랫폼) 운영하게된 이유
서비스 개발 && SRE
서비스 개발 → 요청 | 인프라 ←SRE
엔지니어 티켓요청 → SRE 작업(자동화, 스크립트) → 인프라
서비스 개발팀이 추구하는 방향
SRE팀이 추구하는 방향
+200 엔지니어
4개의 리전
8개의 클러스터
+200 네임 스페이스 (네임스페이스 하나당 하나의 프로젝트라고 보면됨)
Developer Self-Service (엔지니어가 인프라를 직접)
SRE 팀에서 제공하는 프로젝트 컨트롤 플레인
배포: 2021년 11월
사용: 도커파일 기본으로 만들고 프로젝트를 처음엔 수동으로 등록 → 안내가이드가 나온다 쿠버네티스를 추상화해서 서비스 라우팅을 정의한 배포 메인 테스트 → 액션도 제공하고 있어서 배포를 할 수 있긴함 → 배포를 누르면 (저장소의 기본 브랜치의 최신 커밋을 가져와서 배포를 시작 파이프라인을 가지고 있음)
도커 이미지를 만들어서 도커 푸쉬를 하는 과정을 kontrol안에서 기능이 있음
yml → 쿠버네티스 yml로 변환해서 사용
배포된 서버 Url을 누르면 바로 당근 서버 클러스터에 서버가 띄워진다.
(argo cd에서는 프로젝트가 흩뿌려져있어서 뭐가 무슨 프로젝트인지 구별하기 힘들었던 단점을 케어함 , 깃허브 아이디별로 띄우는 것이 아닌 직원 별로 띄워지게함, 언제 누가 배포를 했는지 히스토리를 시각화함 ).
배포 메인 테스트 실시간 시각화 (쿠버네티스)
kontrol → go cd → 쿠버네티스 클러스터
환경변수
kontrol을 만들면서 시크릿은 aws secret manager로 통합.
전 argo cd에서는 다 따로 yml로 관리하고 있었음. (쿠버네티스 리소스 관점)
config를 종류별로 yml 만들어서 환경변수를 세팅함
CronJob → 스케줄, 디버그할때 수동 트리거를 주고싶음.. 수동식으로 실행할 수 있게함 (로그 기록 제공)
kontrol에 db를 붙여 확장함, 글로벌 배포 Kontrol 구현 gocd → argo workflows로 교체
플랫폼으로 얻은 이득
Kontrol을 만들면서 겪었던 경험과 인사이트
container 애플리케이션
Dockerfile과 jib빌드지원
Low threshold
Self Service
Kontrol 45 → 129
argocd 122 → 134
일 평균 76건
SRE: 안정성을 위한 구성 제약
개발자: 생산성 개선
개발자 관점 ≠ SRE 관점
개발자
SRE
Kontrol 컨셉과 개발팀 고유 문화간 충돌
Kontrol 컨셉
개발팀 상황
충돌시에 사용률 저조
아무도 원치 않는 시스템 → 잠재적인 위험
이것이 전파되면 전시에서 사용X
이해관계를 맞출수있는 인센티브가 필요
주요 운영 지표 활용
배포 요청 실패 원인
배포 외 사용자 작업 타입 비율
기간별 배포수
배포별 배포 소요 시간
배포 실패율
→ 일찍 쌓을수록 좋다. → 최대한 일찍 쌓아라
다음에 일어날 일을 이해하기 위해서 가능한 한 많은 컨텍스트가 필요
적절한 컨텍스트가 제공된다면
config와 Secret 변경 이력 확인에대한 어려움
플랫폼을 이동하면서 확인해야함
장애상황때 제대로 컨텍스트가 공유되지 않는 문제 → 커뮤니케이션이 어려움
배포
인스턴스 재시작
레플리카 스케일 인/아웃
각 상황에 필요한 컨텍스트를 적절한 공간에서 제공
트래픽이 얼마나 틀어오고
어떤 이벤트가 있는지 표시
포장도로와 비포장도로 개념으로 운용
핵심 지표들을 최대한 빠르게 준비
의미있는 컨텍스트를 적절한 곳에서 제공
2022년 6월
Argo CD vs Kontrol
ArgoCD
Kontrol
kontrol은 글로벌 서비스가 배포가 안되었어서 ㅜㅜ 사용하기 꺼려짐
→ 딜리버리 파트 2022년 2분기 부터 OKR START!
Kontrol을 2023년 1분기 까지 글로벌 배포 지원 작업을 진행하게 된다!
리전 목록 설정을 어디에?
A안. 프로젝트 저장소의 values.yaml 파일 예시
regions:
- kr
- ca
문제: 위에서 ca를 삭제하고 배포를하면 ca 서비스의 리전의 프로젝트를 내려야하는가?
배포 파이프라인
Prepare
Kontrol에서는 프로젝트를 생성하면 단계별로 프로젝트 파이프라인 3개를 생성함
→ Stateless 파이프라인으로 이동
환경변수 관리
대규모 작업을 할때 버그가 별로 발견되지 않았고 큰 변경을 할 때 자신감 있게 가능
자바스크립트와 타입스크립트 커뮤니티에서 주목받고 있는 차세대 ORM(Object Relational Mapping) 프레임워크입니다.
코드리뷰어 입장에서 높은 퀄리티의 리뷰를 할 수 있게 해줌 ( stack change 방식의 개발 가능 )
GoCD 좋은 도구이지만 Kontrol과 맞지 않음
리소스 오너가 없다면? 클라우드 리소스 관련 오너가 없다면 여러 이슈에 관한 질문을 할 수 없음
태그를 붙여준다? 태깅작업
문제
오너십이 필요했던 Kontrol..
kontrol이 하나 있고 그 위에 여러가지 서비스들이 존재함 (채팅, 배송 등등등 서비스들) → 프로젝트 네임만으로 오너쉽을 구분하기는 어려웠다.
데브옵스에 맞는 플랫폼이 필요해…
신뢰성 있는 오너십 정보를 한 곳에서 통합 관리하자!
프로젝트 오너십을 제공하고, 오너십 기반으로 여러 메타데이터를 관리하는 서비스를 만들면 직/간접적으로 인사이트를 제공할 수 있는 데브옵스 기반을 만들 수 있을 것 → katalog 서비스 개발 karrot + service catalog
katalog
각 kontrol에서 배포되는
katalog에서 관리하는 클라우드 리소스 ownership
katalog를 도입 이후
사내 HR api에서 Team의 code값으로 리소스 ownership 관리 → 팀 ,조직이름과 같은 정보들이 변경이되어도 고유 값을 가지고 있기 때문에 문제가 없음
go를 채택,
aws는 태그 에디터 api를 사용해 관리
AWS Resource Groups Tag Editor API를 활용해서 각 리소스에 카탈로그 아이디를 활용해 리소스 조회 또는 오너십 태그를 변경할 수 있음
GCP는 각 서비스 별 api, label로 조회하는 리소스 오너십 관리
GCP Cloud Asset API 특정 api, label을 기준으로 필터링
단점 → AWS는 라벨 업데이트 기능도 있는데 GCP는 라벨 업데이트가 없었다 ㅠ
대신 각 서비스별 api는 cloud asset api에 비해 한 번에 불러올 수 있는 리소스 개수가 더 많았다.
미래
카탈로그의 확장: 카탈로그가 관리하고있는 메타데이터, 언어, 서비스 티어링, 프로젝트 SLO등
카탈로그를 이용하는 서비스의 확장: katalog api를 사용하게되는 확장 프로그램들 → 오너십 기반 알림, 비용 대시보드, 클라우드 리소스 셀프 운영 서비스, 오너십 기반 ... 서비스들이 확장될 것이다.
손 (창업 시점) → 코드 (개발팀이 늘어남) → 손 (인프라팀 구성) → 코드 (인프라팀이 늘어남)
당근마켓은 생각보다 빨리 테라폼을 적용함
손 -? Terraform (창업시점)
테라폼 운영이 부담되기 시작
1000개의 테라폼 state..
3년전에 만들고 한 번도 수정하지 않은 프로젝트 리소스를 추가하려면..?
테라폼 버전, 프로바이더 버전, state 맞추다보면 하루가 금방
특정 리소스에만 apply → 이럴꺼면 테라폼 왜써 ㅠㅠ
해결책
→ 개발팀마다 클라우드 계정을 주고 인프라 관리를 일임 :
vs
→ 개발팀의 모든 권한을 빼앗아서 인프라팀만 관리한다. :
잔짜해결책
나왔다 krp
사용자에게 가치 전달 극대화 목표
목표
UI 뒷편에는 당근마켓 규칙 적용
Redis 기능추가
추가 대응중인 리소스
2021년 8월 26일(약 1년반 전)
http 75k rps, gRPC 60k rps
→ http 145k rps, gRPC 344k rps (2023. 6.10)
MAU 1200만명에서 1800만명으로!
조직 구조와 scalability
고층 건물을 짓기 전에 지반이 탄탄한게 우선!
인프라실 안에서 얼라인이 안되어있다면 개발자들 역시 혼란스러울 수 있음.
기술 부채와 파편화, 비용에 대해 항상 경계
메타데이터를 정의하고 효율화하는 부분에서 정책은 굉장히 중요하다.
공통 모니터링 영역에 대해 잘 케어함으로써 개발자가 놓칠 수 있는 부분을 서포트
USE method
RED method
Four golden Signals
당근마켓 모니터링 인프라
main은 prometheus와 cortex, loki등으로 구성된 내부 모니터링 인프라
sub로 데이터독 도움을 받는중(그림은 watchdog, apm, cloud integration 잘 활용중)
모니터링 방법론을 우리 상황에 맞게 구현
공통영역인 쿠버네티스 event/status를 잘 보여주려고 한 k8s group
서비스 overall 대시보드를 운영 (지역 기준 전역적인 쿼리)
전역 모니터링과 깨진창 관리
모니터링을 토대로 이상감지 후 얼럿 기반으로 디버깅 스코프를 줄인 뒤
Root Cause는 Loki에 쌓인 로그나 별도 데이터 파이프라인, APM등을 활용해 찾을 때가 많음
변화하는 상황에 따른 대시보드 축적
장애일지와 대시보드 보강
1분기 OKR 비용 절감
Container CPU limit 해제에 따른 노드 모니터링 보강
Spot Instance 프로덕션 도입에 따른 Pod eviction 리스트 및 대시보드 보강
Locality Load Balancing 적용에 따른 region skew monitor 추가
인프라 닥터 대시보드 구축중
인프라 이슈인지 아닌지 큰 줄기의 판단으로 엔지니어의 불필요한 디버깅 시간을 단축시킬 수 있다
Infra Planning
역량 축적
어떤 pod들이 cross-zone traffic을 많이 발생시킬까?
cross-zone (redis, eks….etc)
→ VPC Flog Logs와 Pod Metadata를 결합해서 Cross-zone traffic을 봤어요.
Istio Locality LB
Istio Locality LB를 어떻게 구현할 수 있을까?
EKS Worker Node 정보엔 Topology 정보가 있다.
Istio Locality LB를 위해 Istio OutlierDetection이 필요하다
Virtual Service에 붙어있는 Destination Rule에 outtlier Detection이 꼭 필요하다
Topology Aware Hints
Istio를 안쓰는 Pod들은 어떻게 하나요?
service.kubernetes.to/topology-aware-hints: auto
cost
과연 비용이 얼마나 줄었을까요?
당근은 7만불 넘게 줄였다 ㄱㅇㄷ
가용성과 부하 분산에 대한 고민
AZ가 무너지거나 균등 배포가 깨지면 어쩌지?
How it works?
Istio란
서비스 메시를 구현하는 오픈 소스 프레임워크, 마이크로서비스간의 통신을 제어하고 관리할 수 있는 기능을 제공한다. 이중에는 서비스 간의 로드밸런싱 기능도 퍼함되어 있으며 이는 Istio의 Envoy 프록시를 통해 구현된다.
Alerting (legacy)
alert rule에는 3가지 상태가 존재
Rule
Conditions
No data and error handling
Notifications
notification channels
→ 최종 메시지 형태
알림 개별 제어 기능 - 팀 멘션
세부 제어 예시1 (
ingress 5xx 에러에 대해서 503 코드에 대해서는 팀 멘션 하지 않기
but 503 이지만, responseFlag가 UC 이거나 메트릭 값이 1000이상일 경우에는 멘션
5xx 에러 값이 1200이 넘으면 SRE팀 전체를 바로 멘션하기
)
알림 개별 제어 기능2 - snooze
slack, web에서 알림 끄기 → grafana에서 alerting 상태여도 슬랙 알림이 x
I used this service to transfer money to moldova and I am very satisfied with its work. First of all, Profee impresses with its simplicity and ease of use. The registration on the site was quick and hassle-free, and the process of sending money was extremely simple. All I had to do was specify the amount I needed, choose a payment method, and specify the recipient. All the necessary steps were clearly explained, which made the process safe and straightforward.
좋은 글 감사합니다