kubeadm 클러스터 재구성하기

kubeadm 클러스터 재구성하기 (Reconfiguring a kubeadm cluster)

kubeadm은 관리되는 노드에 배포된 컴포넌트를 재구성하는 자동화된 방법을 지원하지 않아요. 이를 자동화하는 한 가지 방법은 커스텀 operator를 사용하는 것이에요.

컴포넌트 구성을 수정하려면 관련 클러스터 객체와 디스크의 파일을 수동으로 편집해야 해요.

이 가이드는 kubeadm 클러스터 재구성을 달성하기 위해 수행해야 하는 올바른 단계 순서를 보여줘요.

출처: 문서

본문

시작하기 전에 (Before you begin)

  • kubeadm으로 배포된 클러스터가 필요해요
  • 관리자 자격 증명(/etc/kubernetes/admin.conf)과 kubectl이 설치된 호스트에서 클러스터의 실행 중인 kube-apiserver까지의 네트워크 연결이 있어야 해요
  • 모든 호스트에 텍스트 편집기가 설치되어 있어야 해요

클러스터 재구성하기

kubeadm은 클러스터 전체 컴포넌트 구성 옵션 집합을 ConfigMap과 다른 객체에 기록해요. 이 객체들은 수동으로 편집해야 해요. kubectl edit 명령을 사용할 수 있어요.

kubectl edit 명령은 객체를 직접 편집하고 저장할 수 있는 텍스트 편집기를 열어요.

KUBECONFIGKUBE_EDITOR 환경 변수를 사용해 kubectl이 사용하는 kubeconfig 파일의 위치와 선호하는 텍스트 편집기를 지정할 수 있어요.

예를 들어:

KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>

참고:

경고:

클러스터 구성 변경 적용하기

ClusterConfiguration 업데이트하기

클러스터 생성과 업그레이드 동안 kubeadm은 자신의 ClusterConfigurationkube-system 네임스페이스의 kubeadm-config 라는 ConfigMap에 기록해요.

ClusterConfiguration 의 특정 옵션을 변경하려면 이 명령으로 ConfigMap을 편집할 수 있어요:

kubectl edit cm -n kube-system kubeadm-config

구성은 data.ClusterConfiguration 키 아래에 있어요.

참고:

제어 플레인 노드에 ClusterConfiguration 변경 반영하기

kubeadm은 제어 플레인 컴포넌트를 /etc/kubernetes/manifests 디렉토리에 있는 정적 파드 매니페스트로 관리해요. apiServer, controllerManager, scheduler 또는 etcd 키 아래의 ClusterConfiguration 에 대한 변경은 제어 플레인 노드의 매니페스트 디렉토리에 있는 관련 파일에 반영되어야 해요.

그런 변경에는 다음이 포함될 수 있어요:

  • extraArgs — 컴포넌트 컨테이너에 전달되는 플래그 목록 업데이트 필요
  • extraVolumes — 컴포넌트 컨테이너의 볼륨 마운트 업데이트 필요
  • *SANs — 업데이트된 Subject Alternative Names로 새 인증서 작성 필요

이 변경을 진행하기 전에 /etc/kubernetes/ 디렉토리를 백업했는지 확인해요.

새 인증서를 작성하려면 다음을 사용할 수 있어요:

kubeadm init phase certs <component-name> --config <config-file>

/etc/kubernetes/manifests 에 새 매니페스트 파일을 작성하려면 다음을 사용할 수 있어요:

# For Kubernetes control plane components
kubeadm init phase control-plane <component-name> --config <config-file>
# For local etcd
kubeadm init phase etcd local --config <config-file>

<config-file> 내용은 업데이트된 ClusterConfiguration 과 일치해야 해요. <component-name> 값은 쿠버네티스 제어 플레인 컴포넌트(apiserver, controller-manager 또는 scheduler)의 이름이어야 해요.

참고:

kubelet 구성 변경 적용하기

KubeletConfiguration 업데이트하기

클러스터 생성과 업그레이드 동안 kubeadm은 자신의 KubeletConfigurationkube-system 네임스페이스의 kubelet-config 라는 ConfigMap에 기록해요.

이 명령으로 ConfigMap을 편집할 수 있어요:

kubectl edit cm -n kube-system kubelet-config

구성은 data.kubelet 키 아래에 있어요.

kubelet 변경 반영하기

kubeadm 노드에 변경을 반영하려면 다음을 해야 해요:

  • kubeadm 노드에 로그인해요
  • kubeadm upgrade node phase kubelet-config 를 실행해 최신 kubelet-config ConfigMap 내용을 로컬 파일 /var/lib/kubelet/config.yaml 로 다운로드해요
  • /var/lib/kubelet/kubeadm-flags.env 파일을 편집해 플래그로 추가 구성을 적용해요
  • systemctl restart kubelet 로 kubelet 서비스를 재시작해요

참고:

참고:

kube-proxy 구성 변경 적용하기

KubeProxyConfiguration 업데이트하기

클러스터 생성과 업그레이드 동안 kubeadm은 자신의 KubeProxyConfigurationkube-system 네임스페이스의 kube-proxy 라는 ConfigMap에 기록해요.

이 ConfigMap은 kube-system 네임스페이스의 kube-proxy DaemonSet이 사용해요.

KubeProxyConfiguration 의 특정 옵션을 변경하려면 이 명령으로 ConfigMap을 편집할 수 있어요:

kubectl edit cm -n kube-system kube-proxy

구성은 data.config.conf 키 아래에 있어요.

kube-proxy 변경 반영하기

kube-proxy ConfigMap이 업데이트되면 모든 kube-proxy Pod를 재시작할 수 있어요:

다음으로 Pod를 삭제해요:

kubectl delete po -n kube-system -l k8s-app=kube-proxy

업데이트된 ConfigMap을 사용하는 새 Pod가 생성돼요.

참고:

CoreDNS 구성 변경 적용하기

CoreDNS Deployment와 Service 업데이트하기

kubeadm은 CoreDNS를 coredns 라는 Deployment와 kube-dns Service로 배포하며, 둘 다 kube-system 네임스페이스에 있어요.

CoreDNS 설정 중 무엇이든 업데이트하려면 Deployment와 Service 객체를 편집할 수 있어요:

kubectl edit deployment -n kube-system coredns
kubectl edit service -n kube-system kube-dns

CoreDNS 변경 반영하기

CoreDNS 변경이 적용되면 CoreDNS deployment를 재시작할 수 있어요:

kubectl rollout restart deployment -n kube-system coredns

참고:

재구성 유지하기 (Persisting the reconfiguration)

관리되는 노드에서 kubeadm upgrade 를 실행하는 동안 kubeadm은 클러스터 생성 후 적용된 구성(재구성)을 덮어쓸 수 있어요.

Node 객체 재구성 유지하기

kubeadm은 특정 쿠버네티스 노드에 대해 Label, Taint, CRI 소켓 및 기타 정보를 Node 객체에 기록해요. 이 Node 객체의 내용 중 무엇이든 변경하려면 다음을 사용할 수 있어요:

kubectl edit no <node-name>

kubeadm upgrade 동안 그런 Node의 내용이 덮어써질 수 있어요. 업그레이드 후 Node 객체에 대한 수정을 유지하려면 kubectl patch를 준비해 Node 객체에 적용할 수 있어요:

kubectl patch no <node-name> --patch-file <patch-file>

제어 플레인 컴포넌트 재구성 유지하기

제어 플레인 구성의 주요 소스는 클러스터에 저장된 ClusterConfiguration 객체예요. 정적 파드 매니페스트 구성을 확장하려면 패치를 사용할 수 있어요.

이 패치 파일들은 kubeadm upgrade ... --patches <directory> 에서 사용될 수 있도록 제어 플레인 노드에 파일로 남아 있어야 해요.

ClusterConfiguration 과 디스크의 정적 파드 매니페스트에 재구성이 이루어지면, 노드별 패치 집합도 그에 맞게 업데이트되어야 해요.

kubelet 재구성 유지하기

/var/lib/kubelet/config.yaml 에 저장된 KubeletConfiguration 의 변경은 kubeadm upgrade 시 클러스터 전체 kubelet-config ConfigMap 내용을 다운로드해 덮어써질 거예요. kubelet 노드별 구성을 유지하려면 업그레이드 후 /var/lib/kubelet/config.yaml 파일을 수동으로 업데이트하거나 /var/lib/kubelet/kubeadm-flags.env 파일에 플래그를 포함시킬 수 있어요. kubelet 플래그는 관련 KubeletConfiguration 옵션을 재정의하지만, 일부 플래그는 더 이상 사용되지 않는다는 점(deprecated)을 기억하세요.

/var/lib/kubelet/config.yaml 또는 /var/lib/kubelet/kubeadm-flags.env 를 변경한 후에는 kubelet 재시작이 필요해요.

더 알아보기 (Learn more)