본 포스팅은 Kubernetes Official Documents를 기반으로 한다.
# 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에 의해 가비지 컬렉션된다.
# 실습
우선, 로컬 환경에서 구축한 쿠버네티스 클러스터에서 리스를 객체를 확인해본다. 본인이 사용한 쿠버네티스 클러스터 환경은 아래 포스팅에서 확인할 수 있다.
'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초와 동일하다!
'Infra > Kubernetes' 카테고리의 다른 글
쿠버네티스 클러스터 구축하기 - 2 / Kubeadm, Containerd, Calico 세팅 (295) | 2023.12.09 |
---|---|
쿠버네티스 클러스터 구축하기 - 1 / 가상머신 세팅 - Vagrant & VMware Workstation 사용 (157) | 2023.12.03 |
노드 - Node (2) | 2023.11.22 |
Owners and Dependents & Recommended Labels - Pod & ReplicaSet & Deployment 관계 확인 (2) | 2023.11.04 |
Field Selector & Finalizers (2) | 2023.10.28 |