
Ubuntu 20.04에 kubeadm init
및 를 사용하여 3개의 마스터와 3개의 노드가 있는 kubernetes(v1.20.0) 클러스터를 설치했습니다 . kubeadm join
이제 구성을 업데이트해야 하며
--cloud-provider=external
사용할 모든 노드에 kubelet 시작 플래그를 추가하세요 .vsphere-csi-드라이버--service-cidr
네트워크 요구 사항으로 인해 변경
그러나 이러한 변경을 수행하는 적절한 방법이 무엇인지 완전히 확신할 수 없습니다.
쿠벨렛
다음 항목에 대한 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
참조가 있지만 /etc/default/kubelet
최후의 수단으로 간주되어 .NodeRegistration.KubeletExtraArgs
대신 업데이트하는 것이 좋습니다.
...
# 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
...
이는 어디에 있으며 .NodeRegistration.KubeletExtraArgs
클러스터의 모든 노드에 대해 어떻게 변경합니까?
제어 평면
내가 이해한 바에 따르면 apiserver와 컨트롤러 관리자는 각 마스터에서 정적 포드로 실행되고 /etc/kubernetes/manifests/kube-<type>.yaml
. 내 첫 번째 생각은 이 파일에 필요한 변경을 하는 것이었지만, kubernetes 문서에 따르면kubeadm 클러스터 업그레이드, kubeadm은 다음을 수행합니다.
* Fetches the kubeadm ClusterConfiguration from the cluster.
* Optionally backups the kube-apiserver certificate.
* Upgrades the static Pod manifests for the control plane components.
매니페스트를 수동으로 변경했기 때문에 ClusterConfiguration( kubectl -n kube-system get cm kubeadm-config -o yaml
)에서 업데이트되지 않습니다. 이러한 방식으로 업그레이드해도 변경 사항이 유지됩니까? ClusterConfiguration을 수동으로 편집할 수도 있지만 kubeadm edit cm ...
이는 오류가 발생하기 쉽고 매번 변경하는 것을 잊어버리기 쉽습니다.
문서에 따르면 방법이 있습니다제어 영역 구성 맞춤설정하지만 이는 클러스터를 처음 설치할 때만 해당되는 것 같습니다. 예를 들어 kubeadm config print init-defaults
이름에서 알 수 있듯이 현재 클러스터에서 실행 중인 값이 아닌 기본값만 제공합니다. 클러스터가 이미 초기화되었기 때문에 ClusterConfiguration을 추출 kubectl -n kube-system get cm kubeadm-config -o yaml
하고 실행하려는 시도가 kubeadm init --config <config>
모든 종류의 실패합니다.
Kubeadm을 실행할 수 있음초기화 단계 제어 평면upload-config
정적 포드 매니페스트를 업데이트하지만 ClusterConfiguration은 그대로 유지하므로 단계도 실행해야 합니다 .
위의 내용을 바탕으로 작업 흐름은 다음과 같습니다.
- ClusterConfiguration을 추출하여
kubeadm -n kube-system get cm kubeadm-config
yaml 파일에 저장합니다. - 필요한 변경사항을 적용하여 yaml 파일을 수정하세요.
- 다음을 사용하여 변경 사항을 적용합니다.
kubeadm init phase control-plane all --config <yaml>
- 수정된 구성 업로드
kubeadm init phase upload-config all --config <yaml>
- 수정된 yaml 파일을 모든 마스터에 배포
- 각 마스터에 대해 다음과 같이 신청하십시오.
kubeadm init phase control-plane all --config <yaml>
여기서 우려되는 점은 정적 Pod 매니페스트와 ClusterConfiguration 간의 명백한 연결 끊김입니다. 변경이 특별히 자주 이루어지지 않기 때문에 한 곳을 변경하려면 다른 곳도 수동으로 변경해야 한다는 사실을 잊어버리기 쉽습니다.
kubernetes 구성 요소와 kubeadm 간의 일관성을 보장하는 kubelet 및 제어 평면 설정을 업데이트할 방법이 없나요? 저는 아직 Kubernetes를 처음 접했고많이이에 대한 문서가 너무 많아서 여기서 분명한 것을 놓친 경우 죄송합니다.
답변1
나는 귀하의 두 가지 질문에 모두 답변하려고 노력할 것입니다.
1. 모든 노드에 --cloud-provider=external kubelet 시작 플래그를 추가합니다.
이 .NodeRegistration.KubeletExtraArgs는 어디에 있으며 클러스터의 모든 노드에 대해 어떻게 변경합니까?
KubeletExtraArgs
kubelet에서 지원하는 인수 및 매개변수입니다. 문서화되어 있습니다.여기. kubelet
이를 수정하려면 적절한 플래그와 함께 명령을 사용해야 합니다 . 또한 사용하려는 플래그가 k8s v1.23에서 제거될 예정입니다.
--cloud-provider string
클라우드 서비스 제공업체입니다. 클라우드 공급자 없이 실행하려면 빈 문자열로 설정하세요. 설정된 경우 클라우드 공급자는 노드의 이름을 결정합니다(호스트 이름이 사용되는지 여부와 사용 방법을 확인하려면 클라우드 공급자 설명서를 참조하십시오). (더 이상 사용되지 않음: Kubelet에서 클라우드 공급자 코드를 제거하기 위해 1.23에서 제거될 예정입니다.)
편집하다:
다음 사항에 관한 귀하의 질문을 더 잘 해결하려면:.NodeRegistration.KubeletExtraArgs
이것들은 또한kubeadm 초기화 구성 파일:
kubeadm init
명령줄 플래그 대신 구성 파일을 사용 하여 구성하는 것이 가능하며 일부 고급 기능은 구성 파일 옵션으로만 사용할 수 있습니다. 이 파일은--config
플래그를 사용하여 전달되며 구조를 포함해야 하며ClusterConfiguration
선택적으로 다른 플래그와의---\n
혼합 으로 분리된 더 많은 구조가--config
경우에 따라 허용되지 않을 수 있습니다.
에 관한 자세한 내용도 확인할 수 있습니다.노드등록옵션구성 필드 및 사용법에 대한 추가 정보도 제공됩니다.
또한 다음 사항에 유의하세요.
KubeletExtraArgs
kubelet에 추가 인수를 전달합니다. 여기의 인수는 환경 파일을 통해 kubelet 명령줄로 전달됩니다.kubeadm은 런타임에 kubelet을 소스에 씁니다. 이는 kubelet-config-1.X의 일반적인 기본 수준 구성을 재정의합니다.
ConfigMap
구문 분석 시 플래그의 우선순위가 더 높습니다. 이러한 값은 로컬이며 kubeadm이 실행 중인 노드에 특정합니다.
편집2:
kubeadm init
플래그나 구성 파일과 함께 사용할 때마다 클러스터를 생성할 때 한 번만 사용되어야 합니다. 다른 값으로 다시 실행하여 구성을 변경할 수 없습니다.여기kubeadm 및 사용법에 관한 정보를 찾을 수 있습니다. 클러스터가 설정되면 kubeadm을 삭제하고 정적 Pod 매니페스트를 직접 변경해야 합니다.
2. 네트워크 요구 사항에 따라 --service-cidr을 변경합니다.
이것은 더 복잡합니다. 다음과 같이 비슷하게 시도해 볼 수 있습니다.여기또는여기그러나 이러한 접근 방식은 실수하기 쉬우므로 권장되지 않습니다.
더 실현 가능하고 안전한 방법은 간단히 kubeadm reset
및 를 사용하여 클러스터를 다시 만드는 것입니다 kubeadm init --service-cidr
. CIDR을 자동으로 변경하는 옵션은 Kubernetes 관점에서는 예상되지도 않았습니다. 그래서 한마디로,kubeadm 재설정여기로 가는 길이에요.
답변2
에 대하여
KubletExtraArgs가 kubelet 명령줄 인수를 참조한다는 점은 이해하지만, 이 속성이 어디에 있는지, 어떻게 수정할 수 있는지 이해가 안 됩니다.
다음과 같은 여러 소스이 하나추가하는 것을 가리킨다
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
예를 들어
Environment="KUBELET_EXTRA_ARGS=--pod-manifest-path=/etc/kubelet.d/"
예를 들어 cli를 사용하는 대신 정적 포드에 대한 사용자 지정 디렉터리 환경을 설정하려면
kubelet --pod-manifest-path=/etc/kubelet.d
문서에서 제안한대로.
구글에 검색해 보면 $KUBELET_EXTRA_ARGS
앞서 언급한 파일에 대한 많은 예제를 찾을 수 있습니다 10-kubeadm.conf
.