리스 - Lease

본 포스팅은 Kubernetes Official Documents를 기반으로 한다.

 

리스(Lease)

분산 시스템에는 종종 공유 리소스를 잠그고 노드 간의 활동을 조정하는 메커니즘을 제공하는 "리스(Lease)"가 필요하다. 쿠버네티스에서 "리스" 개념은 coordination.k8s.io API 그룹에 있는 Lease 오브젝

kubernetes.io


# Lease

분산 시스템에는 종종 공유 리소스를 잠그고 노드 간의 활동을 조정하는 매커니즘을 제공하는 "리스"가 필요하다. 쿠버네티스에서 "리스" 개념은 coordination.k8s.io API 그룹에 있는 Lease 오브젝트로 표현되며, 노드 하트비트 및 컴포넌트 수준의 리더 선출과 같은 시스템 핵심 기능에서 사용된다.


노드 하트비트

쿠버네티스는 리스 API를 사용하여 kubelet 노드의 하트비트를 쿠버네티스 API Server에 전달한다. 

모든 노드에는 같은 이름을 가진 Lease 오브젝트가 kube-node-lease namespace에 존재한다.

 

모든 kubelet 하트비트는 해당 Lease 오브젝트에 대한 업데이트를 요청하며, 이 요청은 Lease 오브젝트의 spec.renewTime 필드를 업데이트한다.


리더 선출

리스는 쿠버네티스에서도 특정 시간 동안 컴포넌트의 인스턴스 하나만 실행되도록 보장하는데에도 사용된다.

 

 한 인스턴스만 활성 상태로 실행되고 다른 인스턴스는 대기 상태여야 하는 kube-controller-manager 및 kube-scheduler와 같은 컨트롤 플레인 컴포넌트의 고가용성 설정에 사용된다.


API 서버 신원

쿠버네티스 v1.26부터, 각 kube-apiserver는 리스 API를 사용하여 시스템의 나머지 부분에 자신의 신원을 게시한다.

 

클라이언트가 쿠버네티스 컨트롤 플레인을 운영 중인 kube-apiserver 인스턴스 수를 파악할 수 있는 매커니즘을 제공한다.

kube-apiserver 리스의 존재는 향후 각 kube-apiserver 간의 조정이 필요할 때 기능을 제공해줄 수 있다.

 

각 kube-apiserver가 소유한 리스는 kube-system 네임스페이스에서 kube-apiserver-<sha256-hash>라는 이름의 리스 오브젝트를 확인하여 볼 수 있다.

 

또는, k8s.io/component=kube-apiserver 레이블 셀렉터를 사용하여 볼 수도 있다.

$ kubectl -n kube-system get lease -l k8s.io/component=kube-apiserver
NAME                                        HOLDER                                                                           AGE
kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a   kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_9cbf54e5-1136-44bd-8f9a-1dcd15c346b4   5m33s
kube-apiserver-dz2dqprdpsgnm756t5rnov7yka   kube-apiserver-dz2dqprdpsgnm756t5rnov7yka_84f2a85d-37c1-4b14-b6b9-603e62e4896f   4m23s
kube-apiserver-fyloo45sdenffw2ugwaz3likua   kube-apiserver-fyloo45sdenffw2ugwaz3likua_c5ffa286-8a9a-45d4-91e7-61118ed58d2e   4m43s

 

리스 이름에 사용된 SAH256 해시는 kube-apiserver가 보는 OS 호스트 이름을 기반으로 한다. 각 kube-apiserver는 클러스터 내에서 고유한 호스트 이름을 사용하도록 구성해야 한다.

 

동일한 호스트명을 사용하는 새로운 kube-apiserver 인스턴스는 새 리스 오브젝트를 인스턴스화하는 대신 소유자 ID를 사용하여 기존 리스를 차지할 수 있다.

 

kube-apiserver가 사용하는 호스트 네임은 kubernetes.io/hostname 레이블의 값을 통해 확인할 수 있다.

kubectl -n kube-system get lease kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a -o yaml
apiVersion: coordination.k8s.io/v1
kind: Lease
metadata:
  creationTimestamp: "2022-11-30T15:37:15Z"
  labels:
    k8s.io/component: kube-apiserver
    kubernetes.io/hostname: kind-control-plane
  name: kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a
  namespace: kube-system
  resourceVersion: "18171"
  uid: d6c68901-4ec5-4385-b1ef-2d783738da6c
spec:
  holderIdentity: kube-apiserver-c4vwjftbvpc5os2vvzle4qg27a_9cbf54e5-1136-44bd-8f9a-1dcd15c346b4
  leaseDurationSeconds: 3600
  renewTime: "2022-11-30T18:04:27.912073Z"

 

더 이상 존재하지 않는 kube-apiserver에 속한 만료된 리스는 1시간 후에 새로운 kube-apiserver에 의해 가비지 컬렉션된다.


# 실습

우선, 로컬 환경에서 구축한 쿠버네티스 클러스터에서 리스를 객체를 확인해본다. 본인이 사용한 쿠버네티스 클러스터 환경은 아래 포스팅에서 확인할 수 있다.

 

쿠버네티스 클러스터 구축하기 - Kubeadm, Containerd, Calico

쿠버네티스 클러스터 구축을 위한 가상머신 세팅 - Vagrant & VMware Workstation 사용언젠간 해봐야지 하고 미뤄뒀던 로컬 쿠버네티스 클러스터 구축을 시도한 과정을 공유하고자 한다. 이번 포스팅에

alive-wong.tistory.com

'kubectl get lease -n kube-system' 을 입력하여 kube-system 네임스페이스에 존재하는 리스 객체들의 목록을 확인할 수 있다.

 

Master Node는 하나이기 때문에 한 개의 apiserver 리스 객체가 존재해야한다.

문서에 소개된 명령어로 레이블 셀렉터를 지정해서 해당 리스 객체를 확인해보면, 아래와 같이 찾을 수 없다고 한다.

 

kubelet describe 명령어를 통해 해당 리스 객체의 상세 정보를 확인해보면 이와 같다.

 

apiserver 리스 객체의 Labels 부분을 확인해보면, k8s가 아닌 kubernets.io/hostname=master과 apiserver.kubernetes.io/identity=kube-apiserver으로 레이블 값을 갖고 있다.

kubectl get lease -n kube-system -l apiserver.kubernetes.io/identity=kube-apiserver

 

해당 레이블로 특정 리스객체를 가져올 수 있다.

 

해당 객체의 구성 정보를 YAML 형식으로 확인해보면 위와 같다.

 

노드의 하트비트를 위한 리스 또한 확인해볼 수 있다.

 

spec.renewTime을 갱신함으로써 kubelet이 노드 하트비트를 체크한다고 볼수 있다.
-w 옵션을 주어서 확인해보면 10초 간격으로 renewTime이 갱신된다.

이는 kubelet이 기본적으로 노드의 생존 상태를 확인하는 주기인 10초와 동일하다!

728x90
반응형