セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

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
}

source code

k8sのdocsでもあまりヒットしなかったので、僕の調べた結果の予想をちょろっと書いておきます。

結果的には構造体に定義されたCPUMemoryEphemeralStorage以外のリソースを指すんじゃないかと思います。どういうことかというと、例えばメモリの場合こんな感じで書きます。(メモリリソース割り当てページより)

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.requestsresources.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という名前も一応腑に落ちた気がします。

合っているか分からないので、マサカリ歓迎します。