본문 바로가기

프로그래밍/kubernetes

Kubernetes Mock Exam 정리(Mock Exam 1)

Certified Kubernetes Administrator (CKA) with Practice Tests 강의에는 실제 CKA 시험을 대비한 가상시험 개념으로 Mock Examl 이라는 것이 있는데 Exam 1개당 7~8개 문제를 주어지며 기존에 강좌를 보면서 풀었던 Test 와는 달리 문제와 문제 사이 이동이 가능하고(기존 강의 끝난뒤 나오는 Test는 문제를 Skip 해버리면 나중에 다시 돌아와서 풀 수 없다) 시험을 끝낸다는 버튼을 누르면 자기 서명을 한뒤(이걸 왜 하는지 모르겠음) 채점을 해준다. 이 글을 쓰는 시점에서는 Mock Examl 3개 중 2개까지 진행해봤는데 첫번째 Exam에서는 하나는 아예 풀지를 못했고, 2번째 Exam 에서는 하나는 아예 풀지를 못했고 남은 하나는 내가 문제를 잘못 이해해서 틀렸다. 그래서 이 Mock Exam 중에 내가 틀린 문제에 대해서 좀 정리하도록 하겠다. 내가 문제를 봤을때 바로는 알지를 못했지만(container의 securitycontext 설정 부분인데 이것은 linux 의 권한을 좀 깊게 알아야 푸는 문제라..리눅스에 아직 약함..ㅠㅠ) kubernetes document 에서 검색하니 떡하니 요구하는 권한을 사용한 예시가 나와서 그걸 이용해 문제를 풀수 있었다. 문제의 의미가 무엇인지를 알면 바로 착착 진행할수는 없다해도 시간만 넉넉하다면 약간의 검색 및 조합으로 풀 수 있다. 여기 글에서는 그런걸로도 내가 풀지 못했던 문제들 위주로만 작성할 예정이다.


여기서는 총 12문제가 주어졌는데 1개를 몰라서 풀지를 못했다. 문제의 내용은 다음과 같다(문제를 번역해서 쓸까 하다가 오역도 생길수 있어서 영문 그대로 옮기겠다)

 

Use JSON PATH query to retrieve the osImages of all the nodes and store it in a file /opt/outputs/nodes_os_x43kj56.txt

The osImages are under the nodeInfo section under status of each node.

 

모든 Node의 osImage 항목을 JSON PATH를 이용해 검색하여 그 결과를 /opt/outputs/nodes_od_x43kj56.txt 파일에 저장한다. osImages 항목은 각 Node의 nodeInfo 항목 아래에 있다로 나는 문제를 봤다. 다만 osImages가 각 Node의 nodeInfo 항목 아래에 있다라는 이런 식의 힌트를 실제 시험에서는 줄것 같지는 않다. 그래서 이런 항목 찾는것도 본인이 따로 스킬을 갖고 있어야 한다는 느낌을 받았다.

 

문제를 풀어보도록 하자. 각 Node의 정보를 조회하는 것이니까 일단 생각나는 것은 kubectl get nodes 이거였다. 다만 단순히 이것만 하면 정말 단순한 정보만 보여주고 우리가 봐야 할 정보인 osImages 항목은 나오지를 않고 있기 때문에 이것이 나와야 한다. 이것이 나오게 할려면 어떻게 해야 하나..

 

kubectl cheat sheet 문서를 보면 kubectl을 사용하는 다양한 예제들이 있다(이 문서는 북마크 해두길 권한다. 시험 후기를 보면 저걸 못보게 했다는 얘기도 있는데 그것은 좀 잘못된거 같다. kubernetes.io/docs 문서는 open book에 속하는 url이기 때문에 못보게 할 이유가 없는데 아마 감독관이 잘못알고 있는듯 하다) 여기서 보면 JSON PATH를 사용하는 예가 있다.

# Get ExternalIPs of all nodes
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

kubectl cheat sheet 문서에서 나온 예제는 모든 node의 ExternalIP 항목을 조회하는 것만 다르지 Node 정보에서 어떻게 조회하는지는 지금의 상황과 같은 것이다. 그래서 기본 골격은 이걸로 하되 jsonpath 옵션을 사용한 내용만 바꾸면 되는 것이다. 이제 알아야 할 것은 kubectl get nodes 를 실행한 결과를 json으로 결과를 받고 거기서 osImages를 접근할려면 어디서부터 어떻게 접근하면 되는지 그 부분을 살펴봐야 한다. 먼저 kubectl get nodes -o json > nodes.json 을 실행시켜 node의 정보를 json으로 받아 이를 nodes.json 파일에 저장한뒤 nodes.json 내부를 살펴보자. 내부를 살펴보면 Root 를 기준으로 안에 apiVersions, items, kind, metadata 이렇게 4개가 있다. 위의 예제를 보면 Node의 ExternalIP를 찾기 위해 items 항목에서 시작했기 때문에 items 항목을 접근하는게 맞을것 같다. 이제 items 항목을 보자. 사실 items 항목으로는 엄청나게 많은 정보들이 있는데 그것을 다 한꺼번에 파악하기는 힘들었다. 그래서 nodes.json 파일을 계속 스크롤해서 보니 거진 마지막에 우리가 찾고자 하는 osImage 란 항목이 있었다. 그럼 이제는 거꾸로 올라가야 한다. items항목과 osImage중간에 어떤 항목들이 있는지 파악해야 하니까.. osImages 항목의 부모는 nodeInfo 항목이었다. 이걸 좀더 스크롤을 위로 올려서 보면 status 항목이 nodeInfo의 부모인것을 알 수 있다.(부모를 찾는 방법은 어렵진 않다. vi 에디터가 익숙한 사람이면 바로 찾는 방법이 있을수 있겠으나 나 같은 경우는 그러지를 못해서 kubernetes가 json으로 결과를 출력할때 부모와 자식을 구분하기 위해 자식은 들여쓰기를 하고 있다보니 그 점을 이용했다. 즉 부모를 찾으면 부모 key 앞에 커서를 놓은 상태에서 위로 올리다보면 커서보다 왼쪽에 있는 항목 이름을 보게 된다. 그게 부모인거다. 그렇게 부모를 찾으면 또 커서를 그 부모의 앞에다가 놓고 다시 커서를 위로 올리며 부모를 찾고..이런 작업을 반복하면 계층이 완성된다. 다만 이렇게 진행할때 부모가 단일 값을 받아들이는지, 배열형태로 받아들이는지를 별도로 표시해두는게 좋다([] 를 사용했다. JsonPath 에서 배열 전체를 대상으로 찾을려면 [*]를 써야 하다보니)) 이렇게 정리하면 다음과 같이 정리가 된다.

 

items[*].status.nodeInfo.osImage

 

그럼 이걸 가지고 jsonPath를 이용해서 kubectl에서 다음과 같이 사용하면 된다.

kubectl get nodes -o jsonpath='{.items[*].status.nodeInfo.osImage}' > /opt/outputs/nodes_os_x43kj56.txt

이렇게 하면 osImage 항목 결과를 지정된 파일에 저장하게 된다. jsonpath 문법을 간략하게 설명하면 kubectl에서 jsonpath로 query를 할때 {}를 감싼 형태로 하게 된다. jsonpath에서는 root node는 $로 표기하지만 여기서는 $가 생략이 가능하다. 그래서 .으로 시작해도 그 앞에 $가 있다고 보고 root node에서부터 찾아나가게 된다. items 항목은 배열이기 때문에 []로 표기하는데 배열 전체를 대상으로 해야 하는 작업이기 때문에 *를 붙인다. 그리고 items 배열 안에 저장된 각각의 값에서 status.node.osImage 항목을 찾아서 보여주게 되는 것이다. 나는 jsonpath에 대해서는 이 강의를 통해서 알게 됐다. 이 강의를 만든 주체인 KodeKloud가 이 동영상 강의 강사가 진행하는 jsonpath 강의를 만들었다. 이거는 별도 비용이 들지 않았다(즉 공개로 풀었다는 얘기..) 그래서 이 jsonpath 강의와 관련해서는 youtube 에서도 볼 수 있는데 관심 있는 사람은 아래 링크를 참고해서 보기 바란다(이 jsonpath 에 대해서는 알아두기를 바란다. 나도 공부할때 jsonpath에 대한 비중을 낮게 봤다가 문제가 이렇게 나온다는 것을 보고 jsonpath 강의를 별도로 보면서 공부했다)

 

JSON PATH Youtube 동영상(영어로 강의합니다. 자막 키시면 도움이 아주 안되는 것은 아니지만 발음을 기반으로 자막을 만들다보니 엉뚱한 단어가 나오는 경우도 있습니다)