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 명령은 객체를 직접 편집하고 저장할 수 있는 텍스트 편집기를 열어요.
KUBECONFIG 와 KUBE_EDITOR 환경 변수를 사용해 kubectl이 사용하는 kubeconfig 파일의 위치와 선호하는 텍스트 편집기를 지정할 수 있어요.
예를 들어:
KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>
참고:
경고:
클러스터 구성 변경 적용하기
ClusterConfiguration 업데이트하기
클러스터 생성과 업그레이드 동안 kubeadm은 자신의 ClusterConfiguration을 kube-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은 자신의 KubeletConfiguration을 kube-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-configConfigMap 내용을 로컬 파일/var/lib/kubelet/config.yaml로 다운로드해요/var/lib/kubelet/kubeadm-flags.env파일을 편집해 플래그로 추가 구성을 적용해요systemctl restart kubelet로 kubelet 서비스를 재시작해요
참고:
참고:
kube-proxy 구성 변경 적용하기
KubeProxyConfiguration 업데이트하기
클러스터 생성과 업그레이드 동안 kubeadm은 자신의 KubeProxyConfiguration을 kube-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 재시작이 필요해요.