AMD 노드에서 ARM 기반 아마존 그래비톤 노드로 변경 작업을 진행하였다.
인프라 담당자로 어려운 부분은 개발자들의 협조를 구하는 거다. DevOps로 변경되며 이름에 들어갈 만큼 숙명이 되었지만 여전히 어렵다. 이번처럼 비용 절감도 마찬가지다. 바쁜 개발자들 잡아다가 자기 돈도 아닌데 비용 줄이자고 작업하자고 하기 민망하다.
하지만 이런 귀찮음을 물리치는게 또 회사에서 돈받고 일하는 사람의 의무다.
일단 지금 사용하는 맥북도 인텔보다 M1칩이 훨씬 좋지 않냐라는 야부리부터 시작해서, 20% 비용이 절감된다는 명확한 근거를 가지고 미팅을 했다. 하이퍼 커넥트의 사례를 공유하는 것도 많은 도움이 되었다.
리더들 협조도 매우 중요하다.
개발자는 이미지 빌드 시 ARM 기반으로 변경하는 것으로 깃헙 액션 파일을 수정하였다. 내가 하지는 않았지만 간단하다고 한다.
docker build --platform linux/arm64(amd64에서 변경) -t myapp:arm64 .
멀티플랫폼 빌드는 하지 않았다. ARM 노드로 이전하면 ARM 노드에서만 실행할 예정이라 빌드 시간만 오래 걸리니 '굳이 왜'라고 생각했다.
오픈 소스 가져다 사용하는 이미지는 요즘에는 웬만한 이미지가 모두 ARM, AMD 멀티 플랫폼을 지원하여 이슈가 없었다. 하나 이미지가 있었는데, 다행히 개발자가 소스 코드 보고 직접 수정해서 ARM 노드에 이슈없이 배포할 수 있었다.
DevOps 담당자로 카펜터 노드그룹에 ARM 용 전용 노드그룹을 생성하고 taint 설정을 하였다. 그리고 해당 노드에 파드가 배포되도록 헬름 Values 파일에 tolerations, node-selector 설정을 하였다.
카펜터 NodePool 설정
taints:
- key: high-priority-arm
effect: NoSchedule
value: "true"
헬름 Values 파일
nodeSelector:
priority: high-arm
tolerations:
- effect: NoSchedule
operator: Equal
key: high-priority-arm
value: "true"
이러면 파드 배포 시 기존 AMD 노드가 아닌 ARM 노드를 지정하여 배포한다. 전체 파드를 하나씩 변경하는 작업을 하면 AMD 노드에 파드가 남아 있지 않아 자연스럽게 카펜터가 AMD 노드를 삭제하였다.
많은 작업이 그렇지만 작업 자체는 별 이슈가 없는데, 숨겨져 있는 폭탄이 있었다. 관리하지 않은 파드들이었다. 잘 모르는 파드가 있었고 해당 파드는 이전부터 있던 거라 ARM 이미지를 지원하지 않았다. 결국 임시로 AMD 노드로 1대 남겨놓고 해당 노드에 배포하였다.
예상대로 약 15% ~ 20% 비용 절감이 있었다. 덤으로 모르는 파드들도 파악하고 빠져있던 Taint, Tolerations 설정도 정리할 수 있었다.
평소에 모든 파드를 잘 관리하고 개발자와 원할하게 커뮤니케이션을 한다는 당연하지만 매우 어려운 과제를 잘하는 조직이라면 ARM 노드 이전은 그리 어렵지 않은 작업이다. 모든 일의 기본이 중요하듯 DevOps 업무도 그랬다. 귀찮아하지 말고 평소에 조금씩 세세한 것까지 인프라 현황을 파악하고 개발자와 잘 소통하는게 중요하다는 걸 다시 한 번 배웠다. (배웠다고 달라지는 건 또 다른 이야기이지만)