kubeadm API로 컴포넌트 사용자 정의하기

kubeadm API로 컴포넌트 사용자 정의하기

이 페이지는 kubeadm이 배포하는 컴포넌트를 사용자 정의하는 방법을 다룬다. 컨트롤 플레인 컴포넌트에 대해서는 ClusterConfiguration 구조에서 플래그를 사용하거나 노드당 패치를 사용할 수 있다. kubelet과 kube-proxy의 경우, 각각 KubeletConfiguration과 KubeProxyConfiguration을 사용할 수 있다.

이러한 모든 옵션은 kubeadm 구성 API를 통해 사용할 수 있다. 구성의 각 필드에 대한 자세한 내용은 API 참조 페이지에서 찾아볼 수 있다.

참고:

이미 생성된 클러스터를 다시 구성하려면 kubeadm 클러스터 다시 구성하기를 참고한다.

ClusterConfiguration의 플래그로 컨트롤 플레인 사용자 정의하기

kubeadm의 ClusterConfiguration 오브젝트는 API 서버, 컨트롤러 매니저, 스케줄러, Etcd와 같은 컨트롤 플레인 컴포넌트에 전달되는 기본 플래그를 사용자가 재정의할 수 있는 방법을 제공한다. 이 컴포넌트는 다음 구조체를 사용하여 정의된다.

  • apiServer
  • controllerManager
  • scheduler
  • etcd

이 구조체들은 공통 필드인 extraArgs를 포함하며, 이 필드는 name / value 쌍으로 구성된다. 컨트롤 플레인 컴포넌트의 플래그를 재정의하려면 다음을 수행한다.

  1. 사용자 구성에 적절한 extraArgs를 추가한다.
  2. extraArgs 필드에 플래그를 추가한다.
  3. --config <YOUR CONFIG YAML>을 지정하여 kubeadm init을 실행한다.

참고:

kubeadm config print init-defaults를 실행하고 원하는 파일에 출력을 저장하여 기본값들로 구성된 ClusterConfiguration 오브젝트를 생성할 수 있다.

참고:

ClusterConfiguration 오브젝트는 현재 kubeadm 클러스터에서 전역으로 사용된다. 즉, 사용자가 추가하는 모든 플래그는 서로 다른 노드에 있는 동일한 컴포넌트의 모든 인스턴스에 적용된다. 서로 다른 노드에서 컴포넌트별로 개별 구성을 적용하려면 패치를 사용할 수 있다.

참고:

중복된 플래그(키)를 사용하거나 동일한 플래그 --foo를 여러 번 전달하는 것은 현재 지원되지 않는다. 이를 우회하려면 패치를 사용해야 한다.

API 서버 플래그

자세한 내용은 kube-apiserver 레퍼런스 문서를 확인한다.

사용 예시:

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
apiServer:
  extraArgs:
  - name: "enable-admission-plugins"
    value: "AlwaysPullImages,DefaultStorageClass"
  - name: "audit-log-path"
    value: "/home/johndoe/audit.log"

컨트롤러 매니저 플래그

자세한 내용은 kube-controller-manager 레퍼런스 문서를 확인한다.

사용 예시:

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
controllerManager:
  extraArgs:
  - name: "cluster-signing-key-file"
    value: "/home/johndoe/keys/ca.key"
  - name: "deployment-controller-sync-period"
    value: "50"

스케줄러 플래그

자세한 내용은 kube-scheduler 레퍼런스 문서를 확인한다.

사용 예시:

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
scheduler:
  extraArgs:
  - name: "config"
    value: "/etc/kubernetes/scheduler-config.yaml"
  extraVolumes:
    - name: schedulerconfig
      hostPath: /home/johndoe/schedconfig.yaml
      mountPath: /etc/kubernetes/scheduler-config.yaml
      readOnly: true
      pathType: "File"

Etcd 플래그

자세한 내용은 etcd 서버 문서를 확인한다.

사용 예시:

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
etcd:
  local:
    extraArgs:
    - name: "election-timeout"
      value: 1000

패치를 통해 사용자 정의하기

기능 상태: Beta since Kubernetes v1.22

Kubeadm을 사용하면 개별 노드의 InitConfiguration, JoinConfiguration, UpgradeConfiguration에 패치 파일이 포함된 디렉터리를 전달할 수 있다. 이 패치는 컴포넌트 구성이 디스크에 기록되기 전 최종 사용자 정의 단계로 사용될 수 있다.

--config <YOUR CONFIG YAML>을 사용하여 이 파일을 kubeadm init에 전달할 수 있다.

apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
patches:
  directory: /home/user/somedir

참고:

kubeadm init의 경우, ---로 구분된 ClusterConfiguration과 InitConfiguration을 모두 포함하는 파일을 전달할 수 있다.

--config <YOUR CONFIG YAML>을 사용하여 이 파일을 kubeadm join에 전달할 수 있다.

apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
patches:
  directory: /home/user/somedir

kubeadm upgrade apply와 kubeadm upgrade node를 사용하여 kubeadm 노드를 업그레이드하는 경우, 업그레이드 이후에도 사용자 정의가 유지되도록 동일한 패치를 다시 제공해야 한다.

apiVersion: kubeadm.k8s.io/v1beta4
kind: UpgradeConfiguration
apply:
  patches:
    directory: /home/user/somedir
apiVersion: kubeadm.k8s.io/v1beta4
kind: UpgradeConfiguration
node:
  patches:
    directory: /home/user/somedir

디렉터리는 target[suffix][+patchtype].extension 형식의 이름을 가진 파일을 포함해야 한다. 예를 들면, kube-apiserver0+merge.yaml 또는 단순히 etcd.json과 같은 형식이다.

  • target은 kube-apiserver, kube-controller-manager, kube-scheduler, etcd, kubeletconfiguration, corednsdeployment 중 하나일 수 있다.
  • suffix는 영숫자순으로 어떤 패치가 먼저 적용될지 결정하는 데 사용할 수 있는 선택적 문자열이다.
  • patchtype은 strategic, merge 또는 json 중 하나일 수 있으며 kubectl에서 지원하는 패치 형식을 준수해야 한다. patchtype의 기본값은 strategic이다.
  • extension은 json 또는 yaml 중 하나여야 한다.

kubelet 사용자 정의하기

kubelet을 사용자 정의하려면, KubeletConfiguration을 동일한 구성 파일 내에서 ---로 구분된 ClusterConfiguration이나 InitConfiguration 다음에 추가하면 된다. 그런 다음 kubeadm init에 해당 파일을 전달하면, kubeadm은 동일한 기본 KubeletConfiguration을 클러스터의 모든 노드에 적용한다.

기본 KubeletConfiguration에 더하여 인스턴스별 구성을 적용하기 위해서는 kubeletconfiguration 패치 대상을 사용할 수 있다.

다른 방법으로는, kubelet 플래그를 재정의로 사용하여, InitConfiguration 및 JoinConfiguration 모두에서 지원되는 nodeRegistration.kubeletExtraArgs에 전달할 수 있다. 일부 kubelet 플래그는 사용 중단(deprecated) 상태이므로, 사용하기 전에 kubelet 레퍼런스 문서에서 상태를 확인한다.

이 외 더 자세한 사항은 kubeadm을 사용하여 클러스터의 각 kubelet 구성하기에서 살펴본다.

kube-proxy 사용자 정의하기

kube-proxy를 사용자 정의하려면, KubeProxyConfiguration을 ---로 구분된 ClusterConfiguration이나 InitConfiguration 다음에 두고 kubeadm init에 전달할 수 있다.

자세한 사항은 API 참조 페이지에서 살펴볼 수 있다.

참고:

kubeadm은 kube-proxy를 데몬셋으로 배포하며, 이는 KubeProxyConfiguration이 클러스터의 모든 kube-proxy 인스턴스에 적용될 것임을 의미한다.

CoreDNS 사용자 정의하기

kubeadm을 사용하면 corednsdeployment 패치 대상에 패치를 적용하여 CoreDNS 디플로이먼트를 사용자 정의할 수 있다.

kube-system/coredns 컨피그맵과 같은 CoreDNS 관련 다른 API 오브젝트에 대한 패치는 현재 지원되지 않는다. 이러한 오브젝트는 어느 것이든 kubectl을 사용하여 수동으로 패치한 후, CoreDNS 파드를 다시 생성해야 한다.

또는 ClusterConfiguration에 다음 옵션을 포함하여 kubeadm의 CoreDNS 디플로이먼트를 비활성화할 수 있다.

dns:
  disabled: true

또한 다음 명령을 실행하면

kubeadm init phase addon coredns --print-manifest --config my-config.yaml`

kubeadm이 사용자 환경에서 CoreDNS용으로 생성할 매니페스트 파일을 얻을 수 있다.