% k get secret drone-bot-secret -n default
NAME TYPE DATA AGE
drone-bot-secret kubernetes.io/service-account-token 3 15s
% k get secret drone-bot-secret -n default -o yaml
apiVersion: v1
data:
ca.crt: LS0tLS1CRUdJTi...
namespace: ...
token: ZX...
...
왜 자동으로 Token이 생성되지 않는지 한참 헤메였는데... 알게 모르게 k8s 버전이 1.25로 바뀌었는데 그걸 모르고 클러스터 만들고 삽질을 했었네요... 여러분은 삽질하지 마시라고 공유해 드립니다!
참 오래걸렸습니다. 처음 CKA 자격증을 취득해 보자고 생각했던 것이 작년 이맘때이니 정확히 1년되는 시점에 자격증을 취득했습니다.
이걸 정확히 기억하는 이유가, 시험 응시를 계획하던 시점에 리눅스 파운데이션에서 CKA 자격시험 50% 할인 쿠폰을 뿌리고 있었기 때문입니다 ㅎㅎ 50%는 잘 나오지 않는다고 알고 있어서 유효기간 1년임을 확인하고 바로 등록했던 것이죠. 25% 짜리 나왔다고 좋아서 글올렸던 흔적도 남아 있군요!
여튼, 등록한 시험 유효기간 1년이 9월 8일에 종료되니 어서 시험을 신청하라는 메일을 받고 부랴부랴 재정비에 나섰습니다.
CKA 시험 No show 패널티에서 살아 돌아오다!
CKA 시험은 자격 시험 접수권(?)을 구매하면 1회의 시험을 볼 수 있습니다. 재미있는 것은 1회 시험에서 불합격하면 한번 더 시험을 보는 기회를 줍니다. 단, 1회 시험을 접수해 놓고 No show로 탈락한 경우 re-take 기회가 주어지지 않습니다.
사실 저도 그랬습니다. 시험을 등록해 두고 날짜를 까먹고 있다가 하루 지난후에 시험을 못친 것을 확인했습니다. 이 비싼 시험을 놓치다니... 하고 한탄만 하기에는 비용이 너무 비쌌습니다. 지금은 환율이 1400원/달러가 넘어가고 있으니 더 비싸졌죠?
어떻게 구제 받을 수 없을지 폭풍 검색을 해봤지만 답은 없었습니다. 하지만 포기할 제가 아니었죠. Linux Foundation 트레이닝 센터에 로그인 한 후 Support 티켓을 열고 시차 계산을 잘못해서 놓쳤다... re-take 할 수 있게 어떻게 안되겠냐 사정을 했습니다.
몇 번의 이메일을 주고 받고 최종적으로 받은 답은 바로 재시험 기회 부활! 두드리면 얻을 것이다라는 격언을 몸소 느낄 수 있는 시간이었습니다! 혹시 저처럼 시험 스케쥴링 해두고 No show로 탈락하신 분들은 re-take 기회 부활에 대해 문의를 꼭 해보시기 바랍니다! 375달러 1400원 환율은 정말 큰 돈입니다 ㅠㅠ
어떻게 공부해야하나?
요즘 많은 자격시험이 그러하듯, CKA도 실무형 시험입니다. 시험 자체가 단답식이 아니라 가상 k8s 환경에서 문제를 찾고 해결하는 것이 대부분입니다. 그러다보니 실무에서 k8s를 빡세게 쓰지 않는 분들이 다소 불리합니다.
그런 상황 때문인지 많은 CKA 자격증 강의 및 강사들은 udemy 등을 통해 강의를 수강하는 사람들을 대상으로 자신이 운영하는 트레이닝 서비스에서 k8s 랩을 해볼 수 있도록 해주고 있습니다.
시험 범위가 꽤나 넓기 때문에 udemy 등에서 강의를 한번 들어보는 것을 추천드리고 시험이 임박해오면 각 강의에서 제공하는 Mock Exam과 랩 과제 중심으로 반복 연습하면서 부족한 지식들을 채우고 까먹은 것을 다시 공부하는게 효과적입니다. 추천 드리는 udemy 강의는 다음과 같습니다.
시험 문제는 뭐가 나오나요?
시험은 크게 세가지 배점으로 나뉘어 집니다. 13점짜리 가장 배점 높은 문제와 중간 난이도의 7점 짜리 문제들. 그리고 다소 쉬운 4점짜리 문제들로 구성되어 있습니다.
4점짜리 문제들은 설정되어 있는 쿠버네티스 클러스터의 정보를 확인하는 것이 주류입니다. 확인된 정보를 특정 경로에 파일로 떨어뜨려 제출하거나 클러스터 구현에서 빠진 간단한 설정을 업데이트 하는 것이 주류입니다. 즉, 기본적인 k8s 지식을 바탕으로 kubectl 명령으로 비교적 쉽게 풀어낼 수 있습니다.
7점짜리 문제들은 조금 난이도가 있습니다. 구현 되어 있는 클러스터의 중간 난이도 문제점들을 확인하고 문제점을 해결하는 과제들이 주어지게 됩니다. 4점짜리에 비해 다소 어렵지만 차근히 풀면 못풀 문제도 아니긴 합니다. k8s의 다양한 리소스 개념을 잘 인식하고 있어야 당황하지 않고 풀 수 있습니다.
제 경우 13점짜리 문제는 문제가 발생한 클러스터를 복구하는 문제였습니다. 쿠버네티스 뿐만 아니라 간단한 리눅스 시스템에 대한 이해가 필요했고 k8s와 리눅스 전반에 걸쳐 문제점을 찾아나가는 접근을 해야 했습니다. 정확히 1분 남기고 이 문제를 풀었던 것이 합격의 최종 관문이었습니다 ^^;;
시험 환경은 어떤가요?
리모트로 시험을 보면서 온라인으로 진행되는 만큼 당황할만한 요소가 꽤 있습니다. 시험 시작 시간 30분 전에 미리 접속해서 필요한 클라이언트 다운로드 등을 진행하는게 좋습니다. 막상 다운로드가 느리거나 잘 안되면 마음이 또 조급해 지기도 합니다 ㅜㅜ
시험은 리눅스 파운데이션의 트레이닝 포털을 통해 진입합니다. Scheduled/In Progress에 시험 안내가 나오고 있지요? 사전에 `click HERE` 등의 링크를 눌러서 환경 점검을 하시고 마음의 준비가 끝나면 `Launch Exam`을 눌러 시험에 환경으로 진입합니다.
2022년 6월부터 시험 환경이 변경되었습니다. 기존에는 (저는 쳐보지 못했습니다만) 자신의 로컬 브라우저를 이용했고 시험 환경에도 터미널로 접근했던 것 같기도 한데... 자세히는 모르겠구요 ㅎㅎ 변경된 시험환경은 브라우저 내에 가상 리눅스 GUI 환경이 제공되고 가상 리눅스 GUI 환경에서 브라우저, 터미널 등을 사용한다고 보시면 됩니다.
네, 더럽게 느립니다 ㅜㅜ 그리고 습관적으로 cmd-tab 을 누르는데 자꾸 로컬 환경에서 동작하는 바람에 여러가지로 당황할 수 밖에 없었습니다. 보안 브라우저를 설치하고 시험 시작을 누르면 보안 브라우저가 실행중인 앱을 모두 종료 시킵니다. 그런데 제 경우 제대로 죽지 않은 프로그램이 있어서 cmd-tab 누를때마다 자꾸 그 화면이... 심지어 한글로 된 내용이 떠있는 상태라 부정 행위로 떨어지나... 걱정했었습니다. 고로.. 시험 시작전에 로컬 앱은 일단 다 죽여주시기 바랍니다!
PSI 시큐어 브라우저의 화면구성은 크게 2단으로 되어 있습니다. 화면 좌측으로 문제가 나오는 영역이 있고, 우측이 가상 리눅스 GUI 환경입니다. 시험이 시작되면 GUI 환경에서 터미널을 직접 실행해야 합니다.
시험 꿀팁
1. 친절하게도 문제 영역에는 문제와 관련된 k8s 공식 문서 링크를 제공해 줍니다. CKA 예전 시험에는 이렇게 제공되지 않았던 것 같은데 (물론 안쳐봐서 정확한 건 아닙니다 ㅎㅎ) k8s 공식 문서를 탐색하는 스킬을 굳이 연습하지 않으셔도 큰 지장 없다고 생각하시면 됩니다. 그저 문제 위에 나열된 2~3가지 링크를 빠르게 활용하는 것이 문제를 푸는 지름길입니다!
2. 가상 환경 속의 터미널에 뭔가 붙여 넣기 해야 할일이 무척 많은데 키보드 숏컷이 약간 차이가 있으니 주의해야 합니다. 가상 환경이 시작되면서 해당 부분에 대한 안내가 나오긴 합니다만 습관이 무섭다고... 단축키를 이용하면서 계속 실수를 연발했습니다. 문제 후반부부터는 그냥 마우스로 클릭~ 클릭~ 하면서 복사했네요
3. 배점이 낮은 문제를 먼저 푸는게 좋습니다. 저는 가장 처음에 13점짜리 문제가 나와서... 한참 헤메다 보니 시간이 와르르... 중간에 멘탈을 붙잡아서 다행이었습니다만 정말 당황했었습니다. 시험 문제는 앞뒤로 왔다갔다 할 수 있고 까리한건 플래그 걸어두고 다시 확인할 수 있습니다!
4. 시험 시작전에 시험 보는 환경에 대해서 꼼꼼하게 검사를 합니다. 저는 1인 미팅실을 빌려서 들어가서 이용했는데요, 노트북을 들고 내장 카메라로 구석구석을 보여달라고 합니다. 채팅으로 영문으로 지시사항을 내려주기 때문에 잘 보고 하라는 것을 잘 하면 됩니다.
불필요한 물건은 주변에서 다 없애세요
마스크 벗어놓은 것도 치우라고 하더군요 -_-+
노트북 아래, 마우스 아래, 책상 아래... 방 한바퀴 돌아보기... 등을 시켰습니다
시험 보자마자 팁을 정리하려고 했는데 많이 늦어졌네요. 시험 문제도 많이 기억이 났었는데... 늙어서 그런지 몇 일 사이에 기억에 남는게 하나도 없습니다 ㅜㅜ
여튼, 흥미롭게 볼 수 있는 시험이었고 공부도 정말 많이 할 수 있는 시간이었습니다. 이제 어디가서 k8s 관련해서 명함 살짝~ 내밀 수 있는 수준이 된 것 같아 회의 시간에도 당당하게 어깨를 펼 수 있게 된 것이 가장 큰 수확입니다 ㅎㅎ
CKA를 준비하는 모든 분들의 앞날에 합격의 영광이 가득하길 기원합니다! udemy 가 제공하는 CKA 강의중 한글 자막이 있는 것은 아직 못본 것 같은데요 한글 자막이 필요하다면 전체 CKA 주제 강의 목록 살펴보시면서 찾아보시는 것도 좋겠습니다.
쿠버네티스 클러스터의 네트워크 구성에 문제가 생기면 다음과 같은 에러를 만날 수 있습니다.
root@controlplane:/# k get all -n triton
NAME READY STATUS RESTARTS AGE
pod/mysql 0/1 ContainerCreating 0 67s
pod/webapp-mysql-54db464f4f-5jtq2 0/1 ContainerCreating 0 67s
...
...
root@controlplane:/# k describe pod/webapp-mysql-54db464f4f-5jtq2
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 14m default-scheduler Successfully assigned triton/webapp-mysql-54db464f4f-648sr to controlplane
Warning FailedCreatePodSandBox 14m kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "7fba1fad2f3e8297e080cfd1ab1d75615f1d036acf0eb6182514dcebbf2cf089" network for pod "webapp-mysql-54db464f4f-648sr": networkPlugin cni failed to set up pod "webapp-mysql-54db464f4f-648sr_triton" network: unable to allocate IP address: Post "http://127.0.0.1:6784/ip/7fba1fad2f3e8297e080cfd1ab1d75615f1d036acf0eb6182514dcebbf2cf089": dial tcp 127.0.0.1:6784: connect: connection refused, failed to clean up sandbox container "7fba1fad2f3e8297e080cfd1ab1d75615f1d036acf0eb6182514dcebbf2cf089" network for pod "webapp-mysql-54db464f4f-648sr": networkPlugin cni failed to teardown pod "webapp-mysql-54db464f4f-648sr_triton" network: Delete "http://127.0.0.1:6784/ip/7fba1fad2f3e8297e080cfd1ab1d75615f1d036acf0eb6182514dcebbf2cf089": dial tcp 127.0.0.1:6784: connect: connection refused]
Normal SandboxChanged 4m (x47 over 14m) kubelet Pod sandbox changed, it will be killed and re-created.
에러 메세지를 보면 CNI 문제인 것처럼 보입니다. 이때 클러스터가 사용중인 CNI 를 확인할 필요가 있겠죠?
그러면 사용중인 CNI 플러그인의 설정은 어디 있을까요? 바로 /etc/cni/net.d/ 경로에 있습니다. weave 설정 파일만 존재하고 /opt/cni/bin 경로의 내용을 미루어 봤을 때 이 클러스터는 CNI로 weave를 쓰도록 구성되어 있다는 추론이 가능합니다.
root@controlplane:/# k get all -n kube-system
NAME READY STATUS RESTARTS AGE
pod/coredns-74ff55c5b-s8jgh 1/1 Running 0 40m
pod/coredns-74ff55c5b-vnsv7 1/1 Running 0 40m
pod/etcd-controlplane 1/1 Running 0 40m
pod/kube-apiserver-controlplane 1/1 Running 0 40m
pod/kube-controller-manager-controlplane 1/1 Running 0 40m
pod/kube-proxy-6jssm 1/1 Running 0 40m
pod/kube-scheduler-controlplane 1/1 Running 0 40m
pod/weave-net-9kbqw 2/2 Running 0 43s
아까 보이지 않던 pod/weave-net-xxxxx가 보입니다. 이제 서비스 클러스터의 pod 상태를 보겠습니다.
root@controlplane:/# k get all -n triton
NAME READY STATUS RESTARTS AGE
pod/mysql 1/1 Running 0 12m
pod/webapp-mysql-54db464f4f-5jtq2 1/1 Running 0 12m
pod의 상태가 Running으로 바뀌었습니다. describe로 상태를 보면 특별히 CNI 이슈가 해소된 것에 대한 메세지는 남지 않는 것 같습니다. 다만 pod가 잘 동작하는 것으로 이슈가 해소된 것을 알 수 있겠네요!
k8s 관리자라면 꼭 공부해야 하는 CKA는 아래 강의를 추천드립니다. 강사가 제공하는 별도 Lab 환경이 정말 진국인 강의입니다!