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 옵션값을 변경할 수 있습니다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.