kubernetes ScalarResources
v.1.23
で確認
ScalarResources
このScalarResources
ってなんなのって思いました。
// pkg/scheduler/framework/types.go#L410-L419より type Resource struct { MilliCPU int64 Memory int64 EphemeralStorage int64 // We store allowedPodNumber (which is Node.Status.Allocatable.Pods().Value()) // explicitly as int, to avoid conversions and improve performance. AllowedPodNumber int // ScalarResources ScalarResources map[v1.ResourceName]int64 }
k8sのdocsでもあまりヒットしなかったので、僕の調べた結果の予想をちょろっと書いておきます。
結果的には構造体に定義されたCPU
、Memory
、EphemeralStorage
以外のリソースを指すんじゃないかと思います。どういうことかというと、例えばメモリの場合こんな感じで書きます。(メモリリソース割り当てページより)
apiVersion: v1 kind: Pod metadata: name: memory-demo namespace: mem-example spec: containers: - name: memory-demo-ctr image: polinux/stress resources: limits: memory: "200Mi" requests: memory: "100Mi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
この、resources.requests
やresources.limits
に映えてるmemory
の値が、Resource
構造体のMemory
に格納されるんじゃないかと思います。例えばEphemeralStorage
ならこんな感じ?
じゃあ、ScalarResources
はというと、例えば拡張リソース
apiVersion: v1 kind: Pod metadata: name: extended-resource-demo spec: containers: - name: extended-resource-demo-ctr image: nginx resources: requests: example.com/dongle: 3 limits: example.com/dongle: 3
リソース名にexample.com/dongle
といった感じで各自のドメイン名が入るので、memory
のように単一で表記できない。Huge pageもおそらく名前が可変(定義する名前が変わる)なので、ScalarResources
に格納しておくといった感じかと思う。
pkg/scheduler/util/utils.goに、IsScalarResourceName
という関数があり、そこでリソース名から判定を行える。この実装を見てみると、上記の拡張リソースとHuge pageは、ScalarResources
に含まれると考えられる。
Scalar
という単語に馴染みがなかったので不安ですが、言葉の定義として文字列
が含まれるようなので、ScalarResources
という名前も一応腑に落ちた気がします。
合っているか分からないので、マサカリ歓迎します。