Kubernetes cluster에 Feature gates 활성화 방법

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를 적용하는 분들의 시간을 줄일 수 있기를~!

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

Read more

나의 프로그래밍 폰트 사용 일대기

나의 프로그래밍 폰트 사용 일대기

시작은 2003년 이제 막 프로그래머로써 첫발을 내딛을 때부터 나는 프로그래밍 폰트에 대해서 관심이 많은 편이었다. 화면 붙잡고 매일 글자들과 씨름하는 직업이다보니 당연하게도 좀더 눈에 잘 보이고, 보기에 좀더 미려하고 조화스러운 폰트를 찾는 것이 어찌보면 약간 본능(?)적으로 관심을 가졌던게 아닌가 싶기도 하고 말이다. 최근까지도 이 주체할 수 없는 본능에 따라

By Kevin H. Kwon
Istio 를 통한 path(url) 기반 Local Rate Limit 적용

Istio 를 통한 path(url) 기반 Local Rate Limit 적용

몇 년 전인지는 기억나진 않지만 Rate Limit 적용은 항상 애플리케이션 쪽에서 처리하는 것이 당연하다는 것이 주된 의견이었다. 그래서 그때 당시 Bucket4J 를 통해서 Spring 쪽에서 처리하고 했던 기억이 있다. 이제는 당연하게도 Istio와 같은 Service Mesh쪽에서 처리하는 것이 응당 맞다고 생각되는 것이 개발 세상이 이제 점점 더 클라우드향으로 이동된다는 느낌이다. 강력한

By Kevin H. Kwon
Istio를 통한 header기반 API 라우팅/호출 시 cors preflight request 이슈 트러블슈팅 기록

Istio를 통한 header기반 API 라우팅/호출 시 cors preflight request 이슈 트러블슈팅 기록

현재 개발하고 있는 일부 컨테이너 기반의 서비스들을 Istio를 통해 서비스들을 구성하고 트래픽을 관리하고 있다. 이때 컨테이너 서비스가 같은 규격이 여러개가 같은 url과 port를 할당 받아서 사용해야는 애로 사항이 있어 Istio에서 header 기반으로 특별한 헤더가 있는 경우에만 라우팅이 될 수 있도록 구성하고 테스트를 진행했었다. Istio Request Routing 예제와 같이 header

By Kevin H. Kwon