eksctl で overrideBootstrapCommand を使ったカスタマイズをしてみた

 # はじめに

EKS を構成するときに、kubelet の Configuration や、カーネルパラメータの変更をしたい時があります。独自に AMI を作成しても良いのですが、都度 AMI を作成するのは何かと手間なので、eksctl では `overrideBootstrapCommand` を指定することでカスタマイズを行える仕組みがあります。kubelet に関する config を変更できたり、任意のコマンドを実行させることができます。`sysctl` でカーネルパラメータを変更したり、独自の変更が容易になっています。

また、kubelet に関する Config を変更するために、EKS で利用する AMI に 簡単なカスタマイズを行える仕組みとして ``/etc/eks/bootstrap.sh`` があります。`/etc/eks/bootstrap.sh` の引数に `--kubelet-extra-args` と指定することで、kubelet に関する設定のカスタマイズが可能です。

kubelet に関するコンフィグレーションに関する情報は以下の URL をご確認ください。

- https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration
- https://github.com/awslabs/amazon-eks-ami#customizing-kubelet-config
- https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/

 

例えば、次の指定を行ったとします。

```sh
/etc/eks/bootstrap.sh my-cluster --kubelet-extra-args '--registry-qps=20 --registry-burst=40'
```



`registry-qps` は、1秒あたりの Registry Pull の上限を指定しています。デフォルトは 5 になっていますが、20 と指定することで、秒間あたり 20 回の Pull が可能になります。このように、kubelet の動作をカスタマイズする仕組みがあります。



# eksctl で overrideBootstrapCommand の指定

eksctl で、EKS を作成する際の挙動を設定可能です。例えば、次のような YAML ファイルを準備します。

```yaml
apiVersion: eksctl.io/v1alpha5
iam:
  withOIDC: true
kind: ClusterConfig
kubernetesNetworkConfig:
  ipFamily: IPv4
managedNodeGroups:
  - amiFamily: AmazonLinux2
    ami: ami-08ba895a802ee90a8
    desiredCapacity: 2
    name: ng-containerd
    ssh:
      allow: true
      publicKeyPath: /home/ec2-user/.ssh/id_rsa.pub
    overrideBootstrapCommand: |
      #!/bin/bash
      sudo sysctl -w kernel.sched_rt_runtime_us=-1 >> /etc/sysctl.conf
      /etc/eks/bootstrap.sh eks-bootstrap01 --container-runtime containerd --kubelet-extra-args "--cpu-manager-policy=static"
metadata:
  name: eks-bootstrap01
  region: ap-northeast-1
  version: "1.23"
vpc:
  autoAllocateIPv6: false
  cidr: 10.0.0.0/16
  clusterEndpoints:
    privateAccess: false
    publicAccess: true
  id: vpc-0b8b2123a16d03528
  manageSharedNodeSecurityGroupRules: true
  nat:
    gateway: Disable
  subnets:
    private:
      ap-northeast-1a:
        az: ap-northeast-1a
        cidr: 10.0.100.0/24
        id: subnet-0c414bf2d11f17bba
      ap-northeast-1c:
        az: ap-northeast-1c
        cidr: 10.0.101.0/24
        id: subnet-09023225144fa1c62
      ap-northeast-1d:
        az: ap-northeast-1d
        cidr: 10.0.102.0/24
        id: subnet-0cf48d891b1bea31c
    public:
      ap-northeast-1a:
        az: ap-northeast-1a
        cidr: 10.0.0.0/24
        id: subnet-0d9a1ae8571fa7c30
      ap-northeast-1c:
        az: ap-northeast-1c
        cidr: 10.0.1.0/24
        id: subnet-0355f72e6534092bf
      ap-northeast-1d:
        az: ap-northeast-1d
        cidr: 10.0.2.0/24
        id: subnet-0c4b7c352a610baf4
```



細かい部分は説明を省略しますが、一番重要な部分は `overrideBootstrapCommand` です。Bash 形式で、EKS の Node に実行したい設定をカスタマイズしています。

- `sudo sysctl -w kernel.sched_rt_runtime_us=-1 >> /etc/sysctl.conf` : カーネルパラメータの変更
- `/etc/eks/bootstrap.sh eks-bootstrap01 --container-runtime containerd --kubelet-extra-args "--cpu-manager-policy=static"` : CPU Manager を static に指定。排他的な CPU の利用を許可する設定。

```yaml
    overrideBootstrapCommand: |
      #!/bin/bash
      sudo sysctl -w kernel.sched_rt_runtime_us=-1 >> /etc/sysctl.conf
      /etc/eks/bootstrap.sh eks-bootstrap01 --container-runtime containerd --kubelet-extra-args "--cpu-manager-policy=static"
```



このように、Bash 形式で、好きなコマンドを任意に変更可能です。適宜、ユースケースに合わせてカスタムされるのが良いと思います。



なお、上記のファイルを準備したあとに、`eksctl create cluster` で実際に EKS クラスターを作成できます。

```bash
eksctl create cluster \
-f eksctl-configure.yaml
```




# 参考 URL

https://github.com/awslabs/amazon-eks-ami#customizing-kubelet-config