1.10.2 cloud-init으로 kubelet 옵션 변경하기
Worker Node 생성시 커스텀 cloud-init 스크립트를 실행할 수 있습니다. OKE에서 수행해야 하는 디폴트 스크립트에 추가하여, Worker Node 생성시 수행하고 싶은 스크립트을 입력하면 됩니다.
Worker Node에서 실행중인 kubelet 상의 옵션 값을 변경하고자 하는 경우, 이 cloud-init을 사용하여 변경할 수 있습니다.
kubelet-extra-args으로 kubelet 옵션 변경하기
-
먼저, kubelet에서 변경가능한 옵션을 확인합니다.
- 이중 예시로 다음 옵션을 변경해 보겠습니다.
-v, –v Level Number for the log level verbosity -
Example 3에서 설명하고 있는 것처럼 OKE 디폴트 스크립트(/var/run/oke-init.sh) 실행시 추가 파라미터로
kubelet-extra-args
을 통해 추가해 주면 됩니다.- verbosity 로그 레벨을 디버그 레벨로 하기 위해
--kubelet-extra-args "--v=4"
추가한 예시입니다.
#!/bin/bash curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh bash /var/run/oke-init.sh --kubelet-extra-args "--v=4"
- verbosity 로그 레벨을 디버그 레벨로 하기 위해
kubelet-config-file로 kubelet 옵션 변경하기
단일 항목(예시, serialize-image-pulls) 변경하기
-
kubelet 옵션중에 일부는 kubelet-config-file을 사용하도록 변경되었습니다.
- 예시,
–serialize-image-pulls Default: true Pull images one at a time. We recommend not changing the default value on nodes that run docker daemon with version < 1.9 or an aufs
storage backend. Issue #10959 has more details. (DEPRECATED: This parameter should be set via the config file specified by the Kubelet’s--config
flag. See kubelet-config-file for more information.) -
실제 Worker Node 접속하여 kubelet을 확인해 보면 사용중인 config 파일(/etc/kubernetes/kubelet-config.json)을 확인할 수 있습니다.
[opc@oke-c7fk4xxodaa-nk4a2kfionq-sfwfrelxbnq-1 ~]$ systemctl status kubelet -l ● kubelet.service - Kubernetes Kubelet Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/kubelet.service.d └─kubelet-default-args.conf, kubelet-extra-args.conf Active: active (running) since Tue 2023-07-18 07:41:37 UTC; 25min ago Main PID: 13482 (kubelet) Tasks: 11 (limit: 99872) Memory: 50.5M CGroup: /system.slice/kubelet.service └─13482 /usr/bin/kubelet --config /etc/kubernetes/kubelet-config.json --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cloud-provider=external ...
-
config 파일을 확인해 보면, 이미 serializeImagePulls을 디폴트인 true가 아닌, false로 변경하여 사용하고 있는 것을 볼 수 있습니다.
{ "apiVersion": "kubelet.config.k8s.io/v1beta1", ... "serializeImagePulls": false, ... }
-
kubelet config 파일의 내용을 변경하고, kubelet을 재시작하는 스크립트를 cloud-init에 아래와 같이 추가할 수 있습니다.
#!/bin/bash curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh bash /var/run/oke-init.sh --kubelet-extra-args "--v=4" sed -i 's/^ "serializeImagePulls": .*/ "serializeImagePulls": true,/' /etc/kubernetes/kubelet-config.json systemctl daemon-reload systemctl restart kubelet
여러 항목(예시, cpu-manager-policy) 변경하기
-
CPU Manager를 사용하기 위해 cpuManagerPolicy를 static으로 변경하는 경우 kubeReserved 또는 systemReserved도 반드시 설정해야 합니다.
- 예시,
Field Description cpuManagerPolicy
string
cpuManagerPolicy is the name of the policy to use. Requires the CPUManager feature gate to be enabled. Default: “none” kubeReserved
map[string]string
kubeReserved is a set of ResourceName=ResourceQuantity (e.g. cpu=200m,memory=150G) pairs that describe resources reserved for kubernetes system components. Currently cpu, memory and local storage for root file system are supported. See https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ for more details. Default: nil systemReserved
map[string]string
systemReserved is a set of ResourceName=ResourceQuantity (e.g. cpu=200m,memory=150G) pairs that describe resources reserved for non-kubernetes components. Currently only cpu and memory are supported. See http://kubernetes.io/docs/user-guide/compute-resources for more detail. Default: nil -
config 파일을 확인해 보면, 이미 cpuManagerPolicy은 따로 정의되지 않았습니다.
-
kubelet config 파일에 여러 항목을 변경 및 추가하기 위해 다음과 같이 jq -s add를 사용하는 방법이 있습니다. kubelet을 재시작하는 스크립트를 cloud-init에 아래와 같이 추가할 수 있습니다.
#!/bin/bash curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh bash /var/run/oke-init.sh --kubelet-extra-args "--v=4" cat <<EOF > updated-option.json { "serializeImagePulls": false, "cpuManagerPolicy": "static", "kubeReserved": { "cpu": "500m" } } EOF cp /etc/kubernetes/kubelet-config.json kubelet-config.json jq -s add kubelet-config.json updated-option.json > /etc/kubernetes/kubelet-config.json rm -rf /var/lib/kubelet/cpu_manager_state systemctl daemon-reload systemctl restart kubelet
현재 kubelet 설정값 확인하기
-
kubectl로 현재 Worker Nodes를 조회합니다.
$ kubectl get nodes NAME STATUS ROLES AGE VERSION 10.0.10.232 Ready node 22h v1.26.2
-
대상 Node의 Name으로 다음 명령을 실행해 해당 Nodes의 kubelet 현재 옵션값들을 확인할 수 있습니다.
kubectl get --raw "/api/v1/nodes/<nodename>/proxy/configz" | jq
- 실행예시
- cloud-init으로 변경 전 값들을 확인할 수 있습니다.
$ kubectl get nodes NAME STATUS ROLES AGE VERSION 10.0.10.232 Ready node 22h v1.26.2 $ kubectl get --raw "/api/v1/nodes/10.0.10.232/proxy/configz" | jq { "kubeletconfig": { ... "cpuManagerPolicy": "none", ... "serializeImagePulls": false, ... "logging": { ... "verbosity": 2, ... }, ... } }
- 실행예시
cloud-init으로 kubelet 옵션 변경하기
-
클러스터 생성시 advance options 에서 cloud-init을 입력하거나, 이미 생성된 Node Pool의 Edit 화면에서 Initialization Script에 앞서 작성한 스크립트를 복사합니다.
-
추가된 내용으로 클러스터를 생성하거나, 기존 Node Pool인 경우 Worker Node를 재생성합니다.
-
새로 생성된 Worker Node에 대해서 cloud-init이 잘 적용되었는 지, kubelet 현재 옵션값들을 확인해봅니다.
kubectl get --raw "/api/v1/nodes/<nodename>/proxy/configz" | jq
- 실행예시
- cpuManagerPolicy: static**, , kubeReserved, serializeImagePulls: false, verbosity: 4 인 것을 확인할 수 있습니다.
$ kubectl get nodes NAME STATUS ROLES AGE VERSION 10.0.10.232 Ready node 22h v1.26.2 10.0.10.48 Ready node 1m25s v1.26.2 $ kubectl get --raw "/api/v1/nodes/10.0.10.48/proxy/configz" | jq { "kubeletconfig": { ... "cpuManagerPolicy": "static", ... "serializeImagePulls": false, ... "kubeReserved": { "cpu": "500m" }, ... "logging": { ... "verbosity": 4, ... }, ... } }
- 실행예시
-
이렇게 cloud-init을 통해 생성되는 Worker Node의 kubelet 옵션값을 변경할 수 있습니다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.