본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 21: PODs with YAML

by 공부하는 무니 2023. 1. 3.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests  강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


YAML in Kubernetes

이번 강의에서는 YAML기반의 configuration file을 사용하여 파드를 만드는 방법에 대해 알아보겠습니다. 지난 강의에서 우리는 yaml 파일에 대해 대략적으로 배웠습니다. 이제 구체적으로 쿠버네티스에서 yaml 파일을 개발하는 방법을 배우겠습니다. 쿠버네티스는 파드, 레플리카, 배포, 서비스 등과 같은 객체를 생성하기 위해 YAML파일을 입력으로 사용합니다. 이 모든 것들은 비슷한 구조를 가집니다. Kubernetes definition file은 최상위 레벨에 항상 아래 4가지가 포함됩니다.

  • apiVersion
  • kind
  • metedata
  • spec

이 4가지는 최상위 레벨(또는 루트 레벨) 속성들이며 필수로 입력해야 하는 속성입니다. 따라서 configuration file에 반드시 필요한 것들입니다. 각각을 자세히 살펴보겠습니다.

ApiVersion

첫번째는 ApiVersion입니다. ApiVersion은 오브젝트를 생성하는 데 사용하는 Kubernetes API 버전을 말합니다. 우리가 어떤 것을 만드려고 하느냐에 따라 올바른 ApiVersion을 사용해야 합니다. ApiVersion에 가능한 값들은 아래와 같습니다.

지금은 Pod 작업을 하고 있기 때문에 ApiVersion을 v1으로 설정합니다.

다른 버전들도 코스의 뒷부분에서 다룰 예정입니다.

kind

다음은 kind입니다. kind는 우리가 만드려고 하는 오브젝트의 타입을 말합니다. kind에 가능한 값들은 아래와 같습니다.

지금은 Pod를 만드려고 하는 것이므로, Pod라고 넣어주면 됩니다.

metadata

다음은 metadata입니다. metadata는 name, labels 등과 같이 오브젝트에 대한 데이터들입니다. 아래에서 볼 수 있듯이 ApiVersion과 kind에는 string값을 넣어줬는데, metadata에는 dictionary 값이 들어갑니다.

또한 metadata 아래에 있는 값들은 오른쪽으로 들여쓰기가 되어 있어서, name과 label이 metadata의 하위항목이라는 것을 알게 합니다. name과 label 앞에 공백을 몇 칸 두는지는 중요하지 않지만(그러나 공백2칸을 권장합니다), 둘은 sibling 항목이기 때문에 동일하게 공백을 주어야 합니다. 아래와 같이 공백을 다르게 주면, labels를 name의 child항목으로 인식하므로 틀린 예입니다.

또한 두 속성 앞에는 상위 항목인 metadata보다 더 많은 공백이 있어야 합니다. 이 경우도 틀린 예입니다.

metadata아래에 있는 name에는 Pod의 이름을 지정할 string값이 들어갑니다. labels에는 dictionary값이 들어갑니다. 즉, labels는 metadata dictionary에 있는 dictionary라고 말할 수 있습니다. labels에는 원하는대로 key와 value쌍을 넣을 수 있습니다. 지금은 app: myapp 값을 추가했습니다. 이렇게 적절한 label을 추가할 수 있습니다. label은 나중에 오브젝트를 식별하기 위해 주는 값입니다.

예를 들어 프론트엔드 애플리케이션에서 실행되는 수백 개의 파드가 있고, 백엔드 애플리케이션이나 데이터베이스에서 실행되는 또다른 수백 개의 파드가 있다고 합시다. 이러한 파드들이 모두 배포된 뒤에 프론트엔드, 백엔드끼리 그룹화하는 것은 어려울 것입니다. 따라서 파드에 '프론트엔드', '백엔드', '데이터베이스' 이렇게 label을 달아 놓으면 나중에 이 label을 보고 파드를 필터링할 수 있습니다.

metadata아래에는 name, labels 등 Kubernetes에 미리 지정된 속성들만 추가할 수 있습니다. 우리 마음대로 metadata아래에 속성들을 추가할 수 없습니다. 헷갈리지 않도록 짚고 넘어가면, metadata아래에 labels 아래에는 우리 마음대로 키-값 쌍을 추가할 수 있습니다. 각 속성에 들어갈 수 있는 값들을 잘 이해하는 것이 중요합니다.

spec

현재 우리는 생성할 오브젝트의 타입을 Pod로 정했고, 이름을 'myapp-pod'로 정했습니다. 그런데 아직 컨테이너와 파드에 필요한 이미지를 지정하지 않았습니다. configuration file의 마지막 속성은 spec입니다. 우리가 만들 오브젝트에 따라, 쿠버네티스에 제공할 오브젝트 관련 추가 정보를 작성하는 곳입니다. 이 추가정보들은 오브젝트마다 다릅니다. 따라서 잘 이해하고, 공식 문서를 참조하여 각각에 적합한 포맷을 얻어야 합니다. 지금은 컨테이너 1개를 가진 파드 하나만 생성하기 때문에, 비교적 작성하기 쉽습니다.

spec또한 dictionary입니다. spec아래에 containers라는 속성을 추가합니다. 전에 말씀드린 것과 같이 파드는 여러 컨테이너를 가질 수 있기 때문에 containers 속성은 리스트입니다. 지금의 경우에는 컨테이너 하나만 필요하기 때문에 하나의 containers만 추가해주면 됩니다.

containers 리스트의 아이템에는 name과 image가 key값인 dictionary가 들어갑니다. name 앞에 대시(-)가 붙었는데, 대시는 이것이 리스트의 첫번째 아이템이라는 것을 뜻합니다. container의 name은 'nginx-container'이며, image는 'nginx'입니다. 이 이미지는 도커 레포지토리에 있는 도커 이미지입니다.

파일이 이렇게 완성되었습니다.

kubectl create -f pod-definition.yml

커맨드를 실행하면 Kubernetes는 파드를 생성합니다.

요약하겠습니다. ApiVersion, kind, metadata, spec 4개의 최상위 속성을 기억하세요. 그 다음, 만드려는 오브젝트에 종속되는 값들을 추가합니다.

반응형

댓글