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 gates
는 DisableAcceleratorUsageMetrics
이므로 해당 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
를 적용하는 분들의 시간을 줄일 수 있기를~!
더 좋은 방법이 있다면 댓글 고고~!