Kubernetes cluster에 Feature gates 활성화 방법

최근에 nvidia a100 gpu를 mig로 나눠서 사용 하는 노드에서 cadvisor가 gpu metric을 수집을 잘 못해서 kubulet에서 계속 오류가 떨어져서 트러블슈팅을 진행했었다.

dcgm-exporter로 prometheus로 metric을 수집하고 있어서 굳이 cadvisor에서 nvidia accelerator meric을 수집할 이유가 없어져서 이것저것 자료를 찾아보니 1.19 버전부터는 DisableAcceleratorUsageMetrics feature gates로 해당 수집 옵션을 비활성화 시킬 수 있는 것으로 보여서 적용했다.

적용하는 중에 생각보다 kubernetes cluster 운영 중에 feature gates를 수정할 일이 많아서 매번 까먹고(왜 맨날 할때 마다 새롭지??) 찾기 귀찮아서 정리를 한번 해본다.

Feature Gates란

Feature gates는 kubernetes에서 제공되는 기능 설정에 대한 키-값 세트이다. -feature-gates 커맨드 라인 플랙이나 kubulet, api server 설정 파일을 통해 Alpha, Beta Feature에 대해서 기능을 활성/비활성 시킬 수 있다.

아래의 문서에서 버전 별로 설정할 수 있는 feature에 대해서 확인 할 수 있다.

https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/

1. Kubelet에서 Feature gate 활성화

첫번째로는 모든 클러스터에서 kubelet service의 feature gate를 활성화를 진행한다.

systemd로 kubelet이 설정 되어 있다면 환경변수 파일을 확인한다.

hkwon@a100-cheetah-1:/etc/systemd/system/kubelet.service.d# cat 10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[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" generates 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 --node-ip=183.111.96.75

EnvironmentFile은 user overrides 하는 설정은 /etc/default/kubelet 파일을 사용하라고 되어 있으니 해당 파일을 편집하여 $KUBELET_EXTRA_ARGS 변수를 설정한다.

내가 활성화할 feature gatesDisableAcceleratorUsageMetrics 이므로 해당 feature를 true로 설정한다.

$ sudo vi /etc/default/kubelet
KUBELET_EXTRA_ARGS=--feature-gates=DisableAcceleratorUsageMetrics=true

새로 설정한 내용을 적용하려면 kubelet 서비스를 재시작해야 한다. 노드가 ready status로 다시 가기 위해 5분 정도는 구동중인 pod에는 영향을 미치지 않으니 설정에 별(?) 이상이 없다면 노드들의 kubelet 을 재시작한다.

물론 중요한 시스템인 경우 node drain 후에 재시작을 권고한다.

$ sudo systemctl restart kubelet

설정이 성공적으로 적용 되었는지 확인 할 수 있다.

$ ps aux | grep kubelet | grep feature-gates

$ journalctl --no-pager -u kubelet -x -e -f

2. Kube api server에서 Feature gate 활성화

이제 kubenetes 컴포넌트(kube-apiserver, kube-controller-manager and kube-scheduler)들에서 feature gates를 활성화 한다.

kube component들에 feature gate 추가

기본component들의 manifets는 아래에 위치하고 해당 설정을 추가하여 저장한다.

$ sudo vi cd /etc/kubernetes/manifests/kube-apiserver.yaml

...
spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=183.111.68.73
    ...
    - --feature-gates=VolumeSnapshotDataSource=true, DisableAcceleratorUsageMetrics=true
$ sudo vi cd /etc/kubernetes/manifests/kube-controller-manager.yaml.yaml

...
spec:
  containers:
  - command:
    - kube-controller-manager
    ...
    - --feature-gates=VolumeSnapshotDataSource=true, DisableAcceleratorUsageMetrics=true
$ sudo vi cd /etc/kubernetes/manifests/kube-scheduler.yaml

...
spec:
  containers:
  - command:
    - kube-scheduler
    ...
    - --feature-gates=RemoveSelfLink=false, VolumeSnapshotDataSource=true, DisableAcceleratorUsageMetrics=true

해당 파일들이 수정되면 자동으로 component pod들은 재시작된다. 아래와 같이 제대로 적용 되었는지 확인한다.

$ ps aux | grep apiserver | grep feature-gates
root      765532 13.4  4.0 1375592 641716 ?      Ssl  06:37   0:41 kube-apiserver --advertise-address=183.111.68.73 ... 
--feature-gates=VolumeSnapshotDataSource=true, DisableAcceleratorUsageMetrics=true

잘 적용 되었는지 다시 gpu node의 kubelet 로그를 확인해 본다.

정리

feature-gates를 적용하는 분들의 시간을 줄일 수 있기를~!

더 좋은 방법이 있다면 댓글 고고~!