---
# System prepended metadata

title: RKE2 調整 coredns pod 數量
tags: [work]

---

# RKE2 調整 coredns pod 數量
* rke2-coredns-autoscaler 是負責計算與調整 coredns pod 數量，因此如果手動調整 coredns deployment 是沒有用的，會被 rke2-coredns-autoscaler 強制改回來。
* 調整 coredns 最少 pod 數量，但須注意 coredns 有定義 pod anti-affinity rules ，意思就是每個節點上只能有一個 coredns pod，如果 pod 數量超過節點數會導致 coredns pending

```
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-coredns
  namespace: kube-system
spec:
  valuesContent: |-
    autoscaler:
      min: 5
```


## autoscaler 調整 coredns pod 數量計算方式
* coresPerReplica: 叢集內有幾個 CPU 核心就需要一個 CoreDNS Pod。
* nodesPerReplica: 每個 CoreDNS Pod 預計服務的節點數量。
```
replicas = max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) )
replicas = min(replicas, max)
replicas = max(replicas, min)
```
* 預設 `coresPerReplica` 為 256 和 `nodesPerReplica` 為 16，代表
  - 每 256 個 CPU 核心需要一個 CoreDNS Pod。
  - 每 16 個節點需要一個 CoreDNS Pod。

* 以下設定調整為每 1 個節點需要 1 個 coredns
```
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-coredns
  namespace: kube-system
spec:
  valuesContent: |-
    autoscaler:
      nodesPerReplica: 1
```
* 我的環境有 5 個節點因此長出了 5 個 coredns pod
```
$ kubectl -n kube-system top po -l k8s-app=kube-dns
NAME                                         CPU(cores)   MEMORY(bytes)
rke2-coredns-rke2-coredns-7b9f897775-4s4ch   3m           25Mi
rke2-coredns-rke2-coredns-7b9f897775-6ksgq   3m           26Mi
rke2-coredns-rke2-coredns-7b9f897775-hjgw4   3m           42Mi
rke2-coredns-rke2-coredns-7b9f897775-j8xd7   3m           20Mi
rke2-coredns-rke2-coredns-7b9f897775-rf5nv   3m           29Mi
```

* 以下設定為叢集內每 6 個 cpu 需要一個 coredns
```
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-coredns
  namespace: kube-system
spec:
  valuesContent: |-
    autoscaler:
      coresPerReplica: 6
```
* 我的叢集總共有 24 個 cpu，因此會長出 4 個 coredns pod
![image](https://hackmd.io/_uploads/S13rxolbJe.png)
```
$ kubectl -n kube-system top po -l k8s-app=kube-dns
NAME                                         CPU(cores)   MEMORY(bytes)
rke2-coredns-rke2-coredns-7b9f897775-6ksgq   3m           26Mi
rke2-coredns-rke2-coredns-7b9f897775-hjgw4   5m           42Mi
rke2-coredns-rke2-coredns-7b9f897775-j8xd7   3m           20Mi
rke2-coredns-rke2-coredns-7b9f897775-rf5nv   3m           32Mi
```

## 參考
https://github.com/kubernetes-sigs/cluster-proportional-autoscaler#linear-mode