kubeadm으로 클러스터의 각 kubelet 구성하기

kubeadm으로 클러스터의 각 kubelet 구성하기 (Configuring each kubelet in your cluster using kubeadm)

kubeadm CLI 도구의 수명주기는 쿠버네티스 클러스터의 각 노드에서 실행되는 데몬인 kubelet과 분리되어 있어요. kubeadm CLI 도구는 쿠버네티스가 초기화되거나 업그레이드될 때 사용자가 실행하고, kubelet은 항상 백그라운드에서 실행돼요.

kubelet은 데몬이므로 일종의 init 시스템이나 서비스 매니저로 유지보수되어야 해요. kubelet이 DEB나 RPM으로 설치될 때는 systemd가 kubelet을 관리하도록 구성돼요. 다른 서비스 매니저를 사용할 수도 있지만 수동으로 구성해야 해요.

일부 kubelet 구성 세부 사항은 클러스터에 관여하는 모든 kubelet에서 같아야 하는 반면, 다른 구성 측면은 특정 머신의 특성(예: OS, 스토리지, 네트워킹)을 수용하기 위해 kubelet별로 설정해야 해요. kubelet의 구성을 수동으로 관리할 수 있지만, kubeadm은 이제 kubelet 구성을 중앙에서 관리하기 위한 KubeletConfiguration API 유형을 제공해요.

출처: 문서

본문

kubelet 구성 패턴

다음 섹션은 각 Node의 kubelet 구성을 수동으로 관리하는 대신 kubeadm을 사용해 단순화되는 kubelet 구성 패턴을 설명해요.

클러스터 수준 구성을 각 kubelet에 전파하기

kubeadm initkubeadm join 명령이 사용할 기본값을 kubelet에 제공할 수 있어요. 흥미로운 예로는 다른 컨테이너 런타임을 사용하거나 서비스가 사용하는 기본 서브넷을 설정하는 것이 있어요.

서비스가 서비스용 기본 서브넷으로 10.96.0.0/12 를 사용하길 원한다면 kubeadm에 --service-cidr 매개변수를 전달할 수 있어요:

kubeadm init --service-cidr 10.96.0.0/12

서비스용 가상 IP는 이제 이 서브넷에서 할당돼요. 또한 kubelet이 사용하는 DNS 주소를 --cluster-dns 플래그로 설정해야 해요. 이 설정은 클러스터의 모든 매니저와 Node의 모든 kubelet에서 같아야 해요. kubelet은 kubelet의 대부분 매개변수를 구성하고 이 구성을 클러스터의 각 실행 중인 kubelet에 푸시할 수 있는 버전 관리된 구조화된 API 객체를 제공해요. 이 객체를 KubeletConfiguration이라고 해요.

KubeletConfiguration 은 사용자가 camelCase 키에 값 목록으로 표현된 클러스터 DNS IP 주소 같은 플래그를 지정할 수 있게 해줘요. 다음 예시로 설명돼요:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDNS:
- 10.96.0.10

KubeletConfiguration 에 대한 자세한 내용은 이 섹션을 참고해요.

인스턴스별 구성 세부 사항 제공하기

일부 호스트는 하드웨어, 운영 체제, 네트워킹 또는 다른 호스트별 매개변수의 차이로 인해 특정 kubelet 구성을 요구해요. 다음 목록은 몇 가지 예시를 제공해요.

이런 인스턴스별 구성을 적용하는 권장 방법은 KubeletConfiguration 패치를 사용하는 것이에요.

kubeadm으로 kubelet 구성하기

커스텀 KubeletConfiguration API 객체를 kubeadm ... --config some-config-file.yaml 같은 구성 파일과 함께 전달하면 kubeadm이 시작할 kubelet을 구성할 수 있어요.

kubeadm config print init-defaults --component-configs KubeletConfiguration 을 호출하면 이 구조의 모든 기본값을 볼 수 있어요.

기본 KubeletConfiguration 위에 인스턴스별 패치를 적용할 수도 있어요. 자세한 내용은 kubelet 사용자 지정을 참고해요.

kubeadm init 사용 시 워크플로

kubeadm init 을 호출하면 kubelet 구성이 /var/lib/kubelet/config.yaml 디스크로 마셜링되고, 클러스터의 kube-system 네임스페이스의 kubelet-config ConfigMap에도 업로드돼요.

추가로 kubeadm 도구는 노드의 CRI 소켓을 감지해 그 세부 사항(소켓 경로 포함)을 로컬 구성 /var/lib/kubelet/instance-config.yaml 에 기록해요.

클러스터의 모든 kubelet에 대한 기본 클러스터 전체 구성으로 /etc/kubernetes/kubelet.conf 에 kubelet 구성 파일도 기록돼요. 이 구성 파일은 kubelet이 API 서버와 통신할 수 있게 하는 클라이언트 인증서를 가리켜요. 이는 클러스터 수준 구성을 각 kubelet에 전파해야 하는 필요를 해결해요.

인스턴스별 구성 세부 사항 제공이라는 두 번째 패턴을 해결하기 위해 kubeadm은 kubelet이 시작될 때 전달할 플래그 목록을 담은 환경 파일을 /var/lib/kubelet/kubeadm-flags.env 에 기록해요. 플래그는 파일에 다음과 같이 표시돼요:

KUBELET_KUBEADM_ARGS="--flag1=value1 --flag2=value2 ..."

kubelet 시작 시 사용되는 플래그 외에도 파일은 cgroup 드라이버 같은 동적 매개변수도 포함해요.

이 두 파일을 디스크로 마셜링한 후 kubeadm은 systemd를 사용한다면 다음 두 명령을 실행하려 해요:

systemctl daemon-reload && systemctl restart kubelet

리로드와 재시작이 성공하면 정상적인 kubeadm init 워크플로가 계속돼요.

kubeadm join 사용 시 워크플로

kubeadm join 을 실행하면 kubeadm은 Bootstrap Token 자격 증명으로 TLS 부트스트랩을 수행해, kubelet-config ConfigMap을 다운로드하는 데 필요한 자격 증명을 가져와 /var/lib/kubelet/config.yaml 에 기록해요.

추가로 kubeadm 도구는 노드의 CRI 소켓을 감지해 그 세부 사항(소켓 경로 포함)을 로컬 구성 /var/lib/kubelet/instance-config.yaml 에 기록해요. 동적 환경 파일은 kubeadm init 과 똑같은 방식으로 생성돼요.

다음으로 kubeadm 은 새 구성을 kubelet에 로드하기 위해 다음 두 명령을 실행해요:

systemctl daemon-reload && systemctl restart kubelet

kubelet이 새 구성을 로드한 후 kubeadm은 /etc/kubernetes/bootstrap-kubelet.conf KubeConfig 파일을 기록하는데, 여기에는 CA 인증서와 Bootstrap Token이 포함돼 있어요. 이것들은 kubelet이 TLS 부트스트랩을 수행하고 /etc/kubernetes/kubelet.conf 에 저장되는 고유 자격 증명을 얻는 데 사용돼요.

/etc/kubernetes/kubelet.conf 파일이 기록되면 kubelet이 TLS 부트스트랩을 완료한 것이에요. Kubeadm은 TLS 부트스트랩을 완료한 후 /etc/kubernetes/bootstrap-kubelet.conf 파일을 삭제해요.

systemd용 kubelet drop-in 파일

kubeadm 은 systemd가 kubelet을 실행하는 방법에 대한 구성과 함께 제공돼요. kubeadm CLI 명령은 이 drop-in 파일을 절대 건드리지 않는다는 점을 기억하세요.

kubeadm 패키지가 설치한 이 구성 파일은 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 에 기록되며 systemd가 사용해요. 이것은 기본 kubelet.service를 보강해요.

더 재정의하려면 /etc/systemd/system/kubelet.service.d/ 디렉토리(/usr/lib/systemd/system/kubelet.service.d/가 아닌)를 만들고 그곳에 파일로 자신의 사용자 지정을 넣을 수 있어요. 예를 들어 kubeadm 이 구성한 유닛 설정을 재정의하기 위해 새 로컬 파일 /etc/systemd/system/kubelet.service.d/local-overrides.conf 를 추가할 수 있어요.

/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 에서 찾을 수 있는 것은 다음과 같아요:

참고:

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generate at runtime, populating
# the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably,
# the user should use the .NodeRegistration.KubeletExtraArgs object in the configuration files instead.
# KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

이 파일은 kubeadm이 kubelet을 위해 관리하는 모든 파일의 기본 위치를 지정해요.

  • TLS 부트스트랩에 사용할 KubeConfig 파일은 /etc/kubernetes/bootstrap-kubelet.conf 이지만 /etc/kubernetes/kubelet.conf 가 존재하지 않을 때만 사용돼요.
  • 고유 kubelet 정체성이 있는 KubeConfig 파일은 /etc/kubernetes/kubelet.conf 예요.
  • kubelet의 ComponentConfig를 담은 파일은 /var/lib/kubelet/config.yaml 예요.
  • KUBELET_KUBEADM_ARGS 를 담은 동적 환경 파일은 /var/lib/kubelet/kubeadm-flags.env 에서 소싱돼요.
  • KUBELET_EXTRA_ARGS 로 사용자 지정 플래그 재정의를 담을 수 있는 파일은 (DEB의 경우) /etc/default/kubelet, 또는 (RPM의 경우) /etc/sysconfig/kubelet 에서 소싱돼요. KUBELET_EXTRA_ARGS 는 플래그 체인에서 마지막이며 충돌하는 설정의 경우 최우선순위를 가져요.

쿠버네티스 바이너리와 패키지 내용

쿠버네티스 릴리스와 함께 제공되는 DEB와 RPM 패키지는 다음과 같아요:

패키지 이름 설명
kubeadm /usr/bin/kubeadm CLI 도구와 kubelet용 kubelet drop-in 파일을 설치해요.
kubelet /usr/bin/kubelet 바이너리를 설치해요.
kubectl /usr/bin/kubectl 바이너리를 설치해요.
cri-tools cri-tools git 저장소/usr/bin/crictl 바이너리를 설치해요.
kubernetes-cni plugins git 저장소/opt/cni/bin 바이너리를 설치해요.

더 알아보기 (Learn more)