Kubernetes Practice 01
Kubernetes 실습을 EC2 master/worker 노드로 시작하는 이유
Kubernetes를 배운다면서 먼저 EC2, 보안 그룹, 키 페어를 만드는 과정이 길게 나오면, 이 준비가 클러스터 학습과 어떤 관계인지 잘 보이지 않는다.
근거 · Kubernetes 교안 p3-p23
1장: EC2 인스턴스는 왜 Kubernetes ‘노드’가 되어야 할까?
솔라는 모니터에 떠 있는 AWS 콘솔 화면을 멍하니 바라보고 있었다. 화면에는 running 상태를 알리는 초록 불이 들어온 EC2 인스턴스 세 개가 나란히 떠 있었다. 방금 전 쿠버네티스 실습 가이드를 따라 겨우 생성을 마친 참이었다. 하지만 어쩐지 개운하지 않았다. 분명 쿠버네티스를 배우기 시작했는데, 정작 한 것이라고는 여느 때와 다름없이 가상 서버 세 대를 만든 것뿐이었기 때문이다.
“언니, 나 지금 뭘 하고 있는 건지 모르겠어.”
노트북 화면에서 눈을 떼지 않은 채 솔라가 말했다. 거실 소파에서 책을 읽던 루나가 고개를 들었다.
“쿠버네티스 실습한다면서. 왜 EC2 인스턴스만 세 개째 만들고 있는 거야? 이건 그냥 서버 세 대잖아. 여기서 쿠버네티스는 어디 있는 건데?”
솔라의 목소리에는 답답함이 묻어났다. t2.medium, Ubuntu 22.04, 30GB SSD. 익숙한 사양의 서버 세 대가 쿠버네티스와 무슨 상관인지 도무지 연결되지 않았다. 그냥 명령어를 따라 치고 있을 뿐, 내가 무엇을 위한 준비를 하는지 전혀 감이 오지 않았다.
루나는 소파에서 일어나 솔라의 옆으로 다가왔다. 모니터 속 인스턴스 목록을 잠시 들여다보더니, 엉뚱한 질문을 던졌다.
“솔라, 우리가 레고로 성을 만든다고 생각해 봐. 지금 네가 손에 쥐고 있는 건 뭘까?”
“레고? 음… 설명서랑, 바닥에 깔 넓은 판 아닐까? 성을 지을 자리.”
“바로 그거야. 지금 네가 만든 EC2 인스턴스 세 개는 쿠버네티스라는 성을 지을 ‘땅’이야. 바닥 판이지. 아직 성은 보이지 않아. 땅만 있으니까.”
“땅이라고?”
솔라는 고개를 갸웃하며 다시 모니터를 봤다. 서버 세 대. 땅. 루나의 비유는 무언가 가리키는 바가 있는 것 같았지만, 여전히 안개 속에 있는 기분이었다.
“이 인스턴스들 스스로가 자기가 쿠버네티스의 일부라고 알고 있을까?”
루나의 질문에 솔라는 즉시 대답했다.
“아니? 그냥 방금 막 설치된 우분투 서버일 뿐인데. 얘네가 뭘 알겠어.”
“맞아. 지금은 그냥 컴퓨팅 파워와 저장 공간을 가진, 텅 빈 기계 세 대일 뿐이야.”
루나는 솔라의 책상 위 포스트잇 한 장을 가져와 펜으로 네모 세 개를 그렸다. 그리고 각 네모 위에 EC2-1, EC2-2, EC2-3이라고 적었다.
+---------+ +---------+ +---------+
| EC2-1 | | EC2-2 | | EC2-3 |
| (서버) | | (서버) | | (서버) |
+---------+ +---------+ +---------+
“우리는 앞으로 이 텅 빈 서버들 위에 쿠버네티스 관리 프로그램들을 설치할 거야. 그리고 서로 통신하도록 설정해서 하나의 팀으로 묶어줄 거지. ‘너희는 이제부터 쿠버네티스 클러스터의 일원이다’라고 선언해 주는 것처럼 말이야. 그제야 비로소 이 평범한 서버들이 쿠버네티스의 ‘노드(Node)‘라는 특별한 역할을 갖게 되는 거야.”
루나는 (서버)라고 적었던 글자 위에 굵은 펜으로 (노드 후보)라고 덧씌웠다.
+--------------+ +--------------+ +--------------+
| EC2-1 | | EC2-2 | | EC2-3 |
| (노드 후보) | | (노드 후보) | | (노드 후보) |
+--------------+ +--------------+ +--------------+
그 순간, 솔라의 머릿속에 흩어져 있던 조각들이 맞춰지는 느낌이 들었다.
“아! 그러니까 이 EC2 인스턴스들은 쿠버네티스라는 소프트웨어가 올라갈 ‘컴퓨터’ 그 자체구나! 쿠버네티스가 허공에서 뿅 하고 나타나는 게 아니라, 결국엔 이런 실제 서버들의 자원을 사용해서 돌아가는 거였어.”
“정확해. 쿠버네티스는 컨테이너들을 어디에, 어떻게, 몇 개나 실행할지 지시하고 관리하는 오케스트라 지휘자 같은 소프트웨어 시스템이야. 하지만 연주를 할 악단, 즉 실제 계산을 수행하고 프로그램을 실행할 ‘물리적인 기반’이 필요하지. 그게 바로 이 EC2 인스턴스들이고, 쿠버네티스 용어로는 ‘노드’라고 부르는 거고.”
솔라는 ‘단순한 서버 세 대’라고 생각했던 인스턴스 목록을 새로운 눈으로 바라봤다. 이제는 텅 빈 서버가 아니라, 곧 거대한 시스템의 일부가 될 가능성을 품은 대지처럼 보였다. 쿠버네티스 객체를 만드는 것이 아니라, 쿠버네티스를 올릴 ‘노드 후보’들을 준비하는 과정. 완전히 관점이 달라졌다. EC2를 만드는 행위가 더 이상 쿠버네티스와 상관없는 겉도는 작업으로 느껴지지 않았다. 이것이야말로 가장 근본적인 첫걸음이었다.
한 가지 의문이 풀리자 새로운 질문이 고개를 들었다.
“알겠어. 이제 이 세 대가 우리 클러스터의 영토가 될 거라는 건 이해했어. 그런데 왜 굳이 세 대야? 그리고 실습 가이드에서는 꼭 하나는 ‘마스터’, 나머지 두 개는 ‘워커’라고 부르던데. 그냥 똑같은 땅 세 개 아니었어?“
2장: Master/Worker, 왜 역할이 나뉘는 걸까?
솔라의 질문에 루나는 바로 대답하는 대신, 책상 위에 놓여있던 포스트잇을 다시 집어 들었다. 어제 그렸던 세 개의 네모 상자, EC2-1, EC2-2, EC2-3가 (노드 후보)라는 글자와 함께 나란히 그려져 있었다. 루나는 펜을 들어 첫 번째 상자인 EC2-1 위에 작은 왕관 모양을 그렸다. 그리고 나머지 두 상자 위에는 망치를 든 팔 근육 모양의 아이콘을 하나씩 그려 넣었다.
👑
+--------------+ 💪 💪
| EC2-1 | +--------------+ +--------------+
| (노드 후보) | | EC2-2 | | EC2-3 |
+--------------+ | (노드 후보) | | (노드 후보) |
+--------------+ +--------------+
그림을 본 솔라가 피식 웃었다.
“왕관이랑 팔 근육? 하나는 왕이고, 나머지는 일꾼이라는 뜻이야? 실습 가이드에서 말한 ‘마스터’랑 ‘워커’가 그런 거였어?”
“비슷해. 똑같은 땅 세 개 아니냐고 했지? 맞아. 지금 이 순간까지는 똑같아. 세 인스턴스 모두 동일한 사양으로 만들어진, 아무런 역할도 부여받지 않은 똑같은 서버일 뿐이야. 마치 똑같은 재능을 갖고 태어난 세 명의 요리사 같지.”
루나는 말을 이었다. “그런데 솔라, 우리가 아주 바쁜 레스토랑을 운영한다고 상상해 봐. 요리사 세 명 모두 손님 주문도 받고, 요리도 하고, 서빙도 하고, 계산도 한다면 주방이 어떻게 될까?”
“완전 난장판이 되겠지. 누가 어떤 주문을 받았는지, 어떤 요리를 먼저 해야 하는지, 재료는 얼마나 남았는지 아무도 모를 거야. 서로 자기가 하겠다고 다투거나, 서로에게 미루다가 주문이 밀릴 수도 있고.”
솔라는 금세 레스토랑의 혼란스러운 풍경을 떠올렸다.
“바로 그거야. 그래서 우리는 역할을 나누기로 했어. 한 명은 주방 전체를 지휘하는 ‘헤드 셰프’가 되는 거야. 손님에게 주문을 받고, 다른 두 요리사에게 어떤 요리를 만들지 지시하고, 전체 요리 진행 상황을 관리하고, 부족한 재료를 파악하는 역할이지. 이 헤드 셰프는 직접 요리를 하진 않아. 오직 ‘관리’와 ‘결정’에만 집중해.”
루나는 왕관이 그려진 EC2-1 상자를 가리켰다.
“이게 바로 ‘마스터 노드’의 역할이야. 쿠버네티스 세계의 헤드 셰프지. 우리 같은 사용자로부터 ‘이런 앱을 3개 실행해 줘’ 같은 명령을 받고, 어떤 워커 노드가 가장 한가한지 판단해서 일을 분배하고, 클러스터 전체의 상태를 기록하고 감시하는, 모든 두뇌 활동을 담당해. 그래서 마스터 노드에서 실행되는 핵심 부분을 ‘컨트롤 플레인(Control Plane)‘이라고 부르기도 해. 말 그대로 ‘제어하는 영역’이라는 뜻이지.”
솔라는 고개를 끄덕이며 나머지 두 상자를 바라봤다.
“그럼 저 팔 근육들은?”
“그들이 바로 헤드 셰프의 지시를 받아 실제로 열심히 요리를 하는 ‘라인 쿡’들이지. 헤드 셰프가 ‘파스타 두 개!’라고 외치면, 묵묵히 파스타를 만드는 역할이야. 이게 바로 ‘워커 노드’들이 하는 일이야. 마스터 노드로부터 ‘이 컨테이너를 실행해’라는 명령을 받아서, 실제로 애플리케이션(파드, Pod)을 자기 땅 위에서 실행하고 그 결과를 마스터에게 보고하는 거지. 실제 작업이 일어나는 ‘실행 공간’인 셈이야.”
루나는 포스트잇 옆에 새로운 표를 그려 역할 분담을 명확히 정리했다.
| 역할 | 비유 | 핵심 책임 | 쿠버네티스에서의 주된 작업 |
|---|---|---|---|
| 마스터 노드 | 헤드 셰프 | 제어와 결정 | 클러스터 상태 저장, 명령 접수, 파드(Pod) 스케줄링 |
| 워커 노드 | 라인 쿡 | 실행과 작업 | 마스터의 지시에 따라 실제 파드(Pod)를 실행하고 관리 |
“아!”
솔라의 입에서 짧은 탄성이 터져 나왔다. 이제야 master-node-01, worker-node-01, worker-node-02라고 이름 붙였던 이유가 선명하게 이해되기 시작했다. 그것은 단순한 이름표가 아니라, 앞으로 수행할 역할에 대한 예고였던 것이다.
“그렇구나! 그러니까 이 EC2 인스턴스들은 하드웨어적으로는 똑같지만, 우리가 앞으로 설치할 쿠버네티스 소프트웨어에 따라 완전히 다른 역할을 맡게 되는 거였어. 마스터는 두뇌, 워커는 손발이 되는 거네.”
솔라는 자신이 만든 EC2 인스턴스 목록을 다시 보았다. 더 이상 똑같은 서버 세 대로 보이지 않았다. 하나는 곧 지휘 본부가 될 것이고, 다른 둘은 실제 작전이 펼쳐질 격납고처럼 느껴졌다.
“그럼 만약에… 마스터 노드가 갑자기 고장 나면 어떻게 돼? 헤드 셰프가 쓰러진 거니까… 새로운 주문은 못 받겠네. 그리고 지금 어떤 요리가 나가고 있는지도 파악이 안 될 거고.”
“정확해. 워커 노드들이 이미 실행 중이던 앱은 계속 돌아갈 수 있겠지만, 클러스터에 새로운 명령을 내리거나 변경하는 건 불가능해져. 반대로 워커 노드 하나가 고장 나면?”
“음… 헤드 셰프가 다른 워커 노드한테 ‘저 친구가 하던 일 네가 이어서 해!’라고 다시 명령을 내리면 되겠네!”
솔라는 자신의 추리가 마음에 든 듯 미소를 지었다. 단순한 서버 세 대가 아니라, 역할이 분담된 하나의 유기적인 시스템. ‘마스터 1대, 워커 2대’라는 구성의 깊은 의미를 깨닫는 순간이었다. 하지만 곧바로 새로운 궁금증이 생겨났다.
“알겠어. 마스터는 워커에게 명령을 내리고, 워커는 마스터에게 보고를 해야 하네. 서로 계속 대화를 해야 한다는 거잖아. 그런데 이 서버들은 그냥 인터넷에 흩어져 있는 컴퓨터인데… 어떻게 서로를 알아보고 안전하게 대화할 수 있는 거지? 주방에서처럼 그냥 소리 지를 수는 없잖아. 아무나 우리 주방에 들어와서 명령을 엿들으면 안 되니까… 아! 혹시 그래서 키 페어랑 보안 그룹 설정이 필요했던 건가?“
3장: 보안 그룹과 키 페어는 Kubernetes의 ‘관리 통로’다
솔라는 어제 루나와 함께 그렸던 포스트잇을 다시 책상 위에 올려두었다. 왕관이 그려진 마스터 노드와 팔 근육이 그려진 워커 노드 두 개. 이제 이 세 개의 네모가 더 이상 똑같은 서버로 보이지 않았다. 하지만 여전히 해결되지 않은 의문이 머릿속을 맴돌았다. 솔라는 펜을 들어 세 개의 노드 상자 전체를 아우르는 커다란 벽을 그리기 시작했다. 그리고 외부와 통하는 유일한 길목에 자물쇠가 채워진 작은 문을 그려 넣었다.
이 모습을 본 루나가 솔라의 옆으로 다가와 펜 끝을 가만히 들여다봤다.
“이번엔 성벽이랑 성문이네? 우리 주방에 아무나 못 들어오게 하려는 건가?”
루나의 말에 솔라가 고개를 끄덕였다.
“응. 마스터는 워커에게 명령하고, 워커는 마스터에게 보고하고… 서로 중요한 이야기를 나눠야 하잖아. 그런데 얘네는 그냥 인터넷에 흩어져 있는 컴퓨터 세 대일 뿐이고. 아무나 엿듣거나 가짜 명령을 내리면 안 되니까, 뭔가 안전장치가 필요할 것 같았어. 실습 가이드에서 맨 처음에 만들었던 키 페어랑 보안 그룹이 딱 그런 역할 아닐까 하고.”
솔라는 자신이 그린 ‘성벽’ 그림을 가리켰다. “이 성벽이 ‘보안 그룹’이고, 이 자물쇠를 여는 열쇠가 ‘키 페어’인 거지. 내 추리가 어때?”
“아주 좋은 접근이야. 그런데 그 성문은 누구를 위한 문일까? 그리고 열쇠는 누가 들고 있지?”
루나는 질문을 던지며 솔라가 그린 그림 옆에 새로운 그림을 그릴 준비를 했다.
“음… 일단 우리! 우리가 이 서버들에 들어가서 쿠버네티스 프로그램을 설치해야 하니까, 우리를 위한 문이지. 그리고 열쇠는 당연히 내가 가지고 있고. AWS에서 다운로드한 .pem 파일 말이야.”
“맞아. 그게 첫 번째 관문이야. 한번 상상해 보자. 우리가 키 페어 없이 EC2 인스턴스를 만들었다면 어떻게 접속해서 kubeadm 이나 containerd 같은 프로그램을 설치할 수 있을까?”
루나의 질문에 솔라는 잠시 고민했다. “음… 아이디/비밀번호 접속을 허용하지 않았다면… 접속할 방법이 없네. 그럼 아무것도 설치할 수 없잖아.”
“바로 그거야. 키 페어는 우리 관리자가 노드라는 ‘집’에 들어갈 수 있는 유일한 열쇠(Key)야. 이 열쇠가 없으면 우리는 문 앞에서 발만 동동 구를 뿐, 집 안에 들어가서 가구를 배치하거나(소프트웨어 설치) 인테리어를 바꿀(설정 변경) 수가 없어.”
루나는 ‘우리’를 나타내는 사람 모양 아이콘을 그리고, 거기서부터 각 노드 상자로 향하는 점선을 그렸다. 그리고 그 점선 위에 ‘Key Pair’라고 적었다.
“그럼 보안 그룹은?” 솔라가 물었다.
“보안 그룹은 ‘누가’, ‘어떤 문으로’ 들어올 수 있는지 적어놓은 방문 규칙(Rule)이야. 솔라 네가 아까 그린 성벽과 같아. 일종의 가상 방화벽이지.”
루나는 AWS 콘솔의 보안 그룹 설정 화면을 간략하게 표로 그렸다.
| 종류 | 프로토콜 | 포트 범위 | 소스 | 설명 |
|---|---|---|---|---|
| SSH | TCP | 22 | 내 IP 주소 | 내가 내 컴퓨터에서 접속할 때 |
| ??? | ??? | 6443 | ??? | 마스터 API 서버와 통신할 때 |
| ??? | ??? | 10250 | ??? | 마스터가 워커 상태를 확인할 때 |
| … | … | … | … | … 다른 여러 통신을 위해 … |
“우리가 실습에서 설정한 건 보통 첫 번째 줄이야. ‘내 IP 주소’에서 오는 ‘22번 포트(SSH)’ 요청만 허용한다는 규칙이지. 즉, 내가 내 열쇠(Key Pair)를 가지고 우리 집 대문(22번 포트)으로 올 때만 문을 열어주라는 뜻이야. 아무리 열쇠를 가졌어도, 엉뚱한 뒷문으로 오거나 허락되지 않은 손님이 오면 문지기가 막아서는 거지.”
“아… 그럼 키 페어는 신분증, 보안 그룹은 출입 명부 같은 거구나.”
“정확해. 그런데 여기서 진짜 중요한 질문이 나와. 이 출입 명부가 정말 우리만을 위한 걸까? 마스터 노드랑 워커 노드도 서로 대화해야 한다고 했잖아.”
루나는 표의 물음표가 가득한 아랫부분을 펜으로 톡톡 쳤다.
“워커 노드가 클러스터에 참여하려면, 마스터 노드의 API 서버(보통 6443번 포트)에 접속해서 ‘저도 일원이 될래요!’라고 말을 걸어야 해. 마스터는 또 워커 노드들이 잘 있는지 상태를 확인하기 위해 각 워커의 kubelet(보통 10250번 포트)에 말을 걸지. 만약 보안 그룹이라는 성벽이 너무 튼튼해서, 오직 ‘내 IP’만 허용하고 노드들끼리 서로 대화하는 길을 열어주지 않으면 어떻게 될까?”
그 순간 솔라의 머릿속에 모든 조각이 맞춰졌다. 보안 그룹 설정이 단순히 외부 침입을 막는 ‘방어’의 의미만 있는 것이 아니었다.
“헤드 셰프가 라인 쿡에게 소리를 질러도, 주방이 너무 시끄럽거나 벽으로 막혀있어서 아무것도 안 들리는 상황이구나! 워커들은 마스터가 뭘 원하는지 알 수 없고, 마스터는 워커들이 놀고 있는지 바쁜지 전혀 알 수 없게 돼. 결국, 이름만 클러스터지 실제로는 그냥 따로 노는 서버 세 대가 되어버리는 거네.”
“바로 그거야. 그래서 우리는 보안 그룹에 규칙을 추가해야 해. ‘이 클러스터에 속한 노드들끼리는 서로 이 포트, 저 포트로 자유롭게 대화해도 좋다’는 규칙을 말이야. 보안 그룹과 키 페어는 단순한 보안 설정이 아니야. 쿠버네티스 클러스터의 두뇌와 손발이 서로 소통하고, 우리가 이 모든 것을 지휘할 수 있게 해주는 안전하고 명확한 ‘관리 통로(Management Channel)’ 그 자체인 거지.”
솔라는 자신이 처음 그렸던 성벽과 자물쇠 그림을 가만히 내려다보았다. 너무 단순한 생각이었다.
솔라는 포스트잇을 뒤집어 새로운 그림을 그리기 시작했다. 먼저 마스터 노드와 워커 노드 상자 세 개를 그렸다. 그리고 세 상자 전체를 감싸는 굵은 테두리를 그리고 보안 그룹 (클러스터 네트워크 경계) 라고 적었다.
이전과 달리, 이번에는 상자들 ‘안에서’ 마스터와 워커 사이에 양방향 화살표들을 그렸다. 각 화살표 옆에는 API:6443, Kubelet:10250처럼 작은 글씨로 포트 번호를 적어 넣었다. 마지막으로 테두리 바깥에 사람 아이콘을 그리고, 거기서부터 세 개의 노드 모두에게 연결되는 점선을 그린 후 SSH:22 (Key Pair)라고 표시했다.
나 (관리자)
| (SSH:22, w/ Key Pair)
+----------------------------------+
| |
+---------V----------------------------------V------------------------------------+
| 보안 그룹 (클러스터 네트워크 경계) |
| |
| +-------------+ <-- API:6443 / Kubelet:10250 --> +-------------+ |
| | 마스터 노드 | <----------------------------------> | 워커 노드 1 | |
| +-------------+ <-- ... various ports ... ----> +-------------+ |
| ^ ^ |
| | | |
| +----------------------------------------------------+ |
| | |
| | |
| +------------------ ... -------------------------> +-------------+ |
| | 워커 노드 2 | |
| +-------------+ |
+---------------------------------------------------------------------------------+
완성된 그림은 더 이상 단순한 성벽이 아니었다. 외부 관리자와 내부 구성원들의 통신 경로와 규칙이 명시된, 살아있는 시스템의 설계도처럼 보였다.
“이제 알겠어. EC2 인스턴스를 만드는 건 그냥 땅을 사는 게 아니었어. 어떤 땅에 지휘 본부를 세울지, 어떤 땅을 작업 공간으로 쓸지 역할을 정하고, 그들 사이에 어떤 길을, 누구에게만 열어줄지 설계하는 과정이었던 거야. 이 모든 걸 처음부터 함께 생각해야 진짜 클러스터가 시작되는 거였네.”
솔라는 더 이상 AWS 콘솔의 EC2 생성 화면이 쿠버네티스와 동떨어진 과정으로 보이지 않았다. 그것은 지휘자와 연주자, 그리고 그들이 소통할 무대와 통로를 동시에 창조하는, 가장 핵심적인 디자인 과정이었다.