TheKoguryo's 기술 블로그

 Version 2023.11.20

1.10.2 cloud-init으로 kubelet 옵션 변경하기

Worker Node 생성시 커스텀 cloud-init 스크립트를 실행할 수 있습니다. OKE에서 수행해야 하는 디폴트 스크립트에 추가하여, Worker Node 생성시 수행하고 싶은 스크립트을 입력하면 됩니다.

Worker Node에서 실행중인 kubelet 상의 옵션 값을 변경하고자 하는 경우, 이 cloud-init을 사용하여 변경할 수 있습니다.

kubelet-extra-args으로 kubelet 옵션 변경하기

  1. 먼저, kubelet에서 변경가능한 옵션을 확인합니다.

    • 이중 예시로 다음 옵션을 변경해 보겠습니다.
    -v, –v Level
    Number for the log level verbosity
  2. 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"
    

kubelet-config-file로 kubelet 옵션 변경하기

단일 항목(예시, serialize-image-pulls) 변경하기
  1. 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.)
  2. 실제 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 ...
    
  3. config 파일을 확인해 보면, 이미 serializeImagePulls을 디폴트인 true가 아닌, false로 변경하여 사용하고 있는 것을 볼 수 있습니다.

    {
      "apiVersion": "kubelet.config.k8s.io/v1beta1",
    ...
      "serializeImagePulls": false,
    ...
    }
    
  4. 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) 변경하기
  1. CPU Manager를 사용하기 위해 cpuManagerPolicy를 static으로 변경하는 경우 kubeReserved 또는 systemReserved도 반드시 설정해야 합니다.

    • 예시,
    FieldDescription
    cpuManagerPolicy stringcpuManagerPolicy is the name of the policy to use. Requires the CPUManager feature gate to be enabled. Default: “none”
    kubeReserved map[string]stringkubeReserved 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]stringsystemReserved 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
  2. config 파일을 확인해 보면, 이미 cpuManagerPolicy은 따로 정의되지 않았습니다.

  3. 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 설정값 확인하기

  1. kubectl로 현재 Worker Nodes를 조회합니다.

    $ kubectl get nodes
    NAME          STATUS   ROLES   AGE   VERSION
    10.0.10.232   Ready    node    22h   v1.26.2
    
  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 옵션 변경하기

  1. 클러스터 생성시 advance options 에서 cloud-init을 입력하거나, 이미 생성된 Node Pool의 Edit 화면에서 Initialization Script에 앞서 작성한 스크립트를 복사합니다.

    image-20230719122529758

  2. 추가된 내용으로 클러스터를 생성하거나, 기존 Node Pool인 경우 Worker Node를 재생성합니다.

  3. 새로 생성된 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,
          ...
        },
        ...
      }
    }
    
  4. 이렇게 cloud-init을 통해 생성되는 Worker Node의 kubelet 옵션값을 변경할 수 있습니다.



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 18 Jul 2023