본문 바로가기
쿠버네티스

[Kubernetes] kubernetes 의 리소스에 보이는 resourceVersion 은 어떤 용도일까?

by hayz 2023. 2. 14.

쿠버네티스의 리소스를 생성하고 리소스를 확인하게 되면 metadata 항목에 내가 입력하지 않은 "resourceVersion" 이 포함되어 있는 것을 확인 할 수 있습니다. 

 

예시.

apiVersion: v1
kind: Pod
metadata:
  annotations:
    timestamp: "2023-02-08T09:18:44.990943240Z"
  creationTimestamp: "2023-02-09T06:29:32Z"
  name: my-pod
  namespace: default
  resourceVersion: "222187897"

 

resourceVersion 의 용도?

쿠버네티스에서는 선언형 동작으로, 원하는 동작을 기술한 manifast 를 클러스터에 등록하면 해당 manifast 를 보고 형상을 맞춰주게 됩니다. 예를 들어서 nginx pod 2개를 뜨우라는 yaml 파일(manifast 역할) 을 등록하면  사용자는 완료될때까지 동기적으로 기다리는 것이 아닌, 우선 yaml 파일을 등록시켜놓고 주기적으로 관찰하며 원하는 모습인 nginx pod 2개가 뜰때까지 기다리게 됩니다. 

 

그리고, 이렇게 등록된 manifast 는 클러스터가 관리하는 etcd 라는 DB 에 저장되는데요, 사용자는 이 점을 이용하여 이미 등록한 manifast 에도 수정을 할 수 도 있습니다. 이러한 update 기능을 제공할때에는 주의해야할 점이 있는데요 바로 "동기화" 문제입니다. 

 

만약 동일한 manifast 를 가져온 두 사용자 A, B 가 동일한 부분을 수정하고 나서 동시에 update를 한다면 두 부분이 충돌이 나게 됩니다. 이 경우는 만약 github를 사용해던 분들이시라면 confilt 을 경험하시면서 알것이라고 생각합니다. 

이러한 케이스를 위해 우리는 update 를 할때 트랜잭션에 lock 을 걸어두는 등 충돌을 회피하곤 하는데요,  쿠버네티스에서는 바로 이 충돌 회피 방법으로 "resource version" 을 사용합니다. 이 resource version 은 manifast 가 update 될 때마다 값이 증가하며, 값이 클 수록 최신의 상태를 유지한다고 할 수 있습니다. 

 

즉, 사용자는 가장 최신 상태의 manifast 가 아닌 이상 update 명령을 실행하려 하면 오류가 나는 것이죠. 

쿠버네티스에서의 resource version 에 대해 더 자세한 사항은 아래 페이지에서 확인하실 수 있습니다. 

https://kubernetes.io/docs/reference/using-api/api-concepts/#resource-versions

 

Kubernetes API Concepts

The Kubernetes API is a resource-based (RESTful) programmatic interface provided via HTTP. It supports retrieving, creating, updating, and deleting primary resources via the standard HTTP verbs (POST, PUT, PATCH, DELETE, GET). For some resources, the API i

kubernetes.io

 

 

'쿠버네티스' 카테고리의 다른 글

[kubernetes] nginx ingress controller 란 무엇일까? - (1)  (0) 2022.11.08
쿠버네티스가 뭔가?  (0) 2022.02.05

댓글