┌─────────────────────────────────────────────────────┐│ Buffer Operator │├─────────────────┬──────────────┬────────────────────┤│ ResourceMonitor │ Calculator │ PlaceholderManager ││ (internal/ │ (internal/ │ (internal/ ││ monitor) │ calculator) │ manager) │├─────────────────┼──────────────┼────────────────────┤│ Monitor Node/Pod │ Calculate required │ Build/Scale ││ Resources, node pools │ buffer-pod │ buffer-pod / ││ │ / NodeAnchor │ NodeAnchor ││ │ Quantity │ Pod (OwnerRef + ││ │ │ Anti-Affinity) │└─────────────────┴──────────────┴────────────────────┘↓ ↓ ↓┌─────────────────────────────────────────────────────┐│ Kubernetes Cluster ││ ┌──────────┐ ┌──────────┐ ┌──────────┐ ││ │NodeAnchor│ │BufferPod │ │ Business │ ││ │(zero res)│ │(low prio)│ │ Pod (high)│ ──preempt││ └──────────┘ └──────────┘ └──────────┘ │└─────────────────────────────────────────────────────┘
Concept | Description |
BufferConfig | Custom resource (CRD) that defines the behavior configuration of the cluster resource buffer pool. |
Buffer Pod | A placeholder Pod that actually occupies resources, used to reserve CPU and memory resources. |
NodeAnchor Pod | A zero-resource placeholder Pod, one per node, used to support node-level watermark management. |
Placeholder Pod | A collective term for placeholder Pods, including Buffer Pods and NodeAnchor Pods. |
PriorityClass | PriorityClass, used to distinguish placeholder Pods (low priority) from business Pods (high priority). |
Related Products | Relationship Description |
TKE cluster | Buffer Operator runs in a TKE cluster and manages the cluster resource level. |
Cluster Autoscaler | Works with Cluster Autoscaler to implement automatic scaling. |
PriorityClass | Relies on PriorityClass to implement the Pod priority preemption mechanism. |
apiVersion: buffer.tke.cloud.tencent.com/v1alpha1kind: BufferConfigmetadata:name: default-buffernamespace: defaultspec:bufferPods:number: 2strategy: fixednodeBuffer:strategy: node-onlycount:type: absolutevalue: 0placeholderPod:priorityClassName: buffer-priority-lowresources:requests:cpu: "100m"memory: "128Mi"bufferPod:priorityClassName: buffer-priority-lowresources:requests:cpu: "100m"memory: "128Mi"control:reconcileInterval: 30scaleUpCooldown: 300scaleDownCooldown: 600enableNodeAnchor: true
apiVersion: scheduling.k8s.io/v1kind: PriorityClassmetadata:name: buffer-priority-lowvalue: -10globalDefault: falsedescription: "Low priority, used for placeholder Pods and can be preempted by business Pods"
apiVersion: scheduling.k8s.io/v1kind: PriorityClassmetadata:name: business-priority-highvalue: 1000globalDefault: falsedescription: "High priority, used for business Pods and can preempt placeholder Pods"
buffer.tke.cloud.tencent.com/v1alpha1, and the CRD name is BufferConfig.apiVersion: buffer.tke.cloud.tencent.com/v1alpha1kind: BufferConfigmetadata:name: buffer-config-namenamespace: namespace-namespec:# Buffer Pod ConfigurationbufferPods:number: 2strategy: fixed# Node-Level Buffer Configuration (Optional)nodeBuffer:strategy: node-onlycount:type: absolutevalue: 0# Placeholder Pod Template ConfigurationplaceholderPod:image: registry.k8s.io/pause:3.9resources:requests:cpu: "100m"memory: "128Mi"nodeAnchor:priorityClassName: buffer-priority-lowbufferPod:resources:requests:cpu: "100m"memory: "128Mi"# Control Parameters (Optional)control:reconcileInterval: 30scaleUpCooldown: 300scaleDownCooldown: 600enableNodeAnchor: true
Parameter | Type | Required | Default Value | Value Range | Description |
number | Integer | Yes | - | ≥0 | Number of Buffer Pods to maintain |
strategy | String | No | fixed | fixed,auto | Buffer policy |
fixed: Fixed quantity mode, maintains a specified number of Buffer Pods.auto: Automatic mode, automatically calculates the number of Buffer Pods based on cluster resource usage.spec:bufferPods:number: 2strategy: fixed
Parameter | Type | Required | Default Value | Value Range | Description |
strategy | String | No | both | both,resource-only,node-only | Buffer policy |
count | NodeCountBufferSpec | Yes | - | - | Node buffer quantity configuration |
nodePools | []NodePoolBufferSpec | No | - | - | Configure buffer by node pool |
both: Enables both resource buffering and node buffering.resource-only: Enables only resource buffering.node-only: Enables only node buffering.Parameter | Type | Required | Value Range | Description |
type | String | Yes | percentage,absolute | Configuration Type |
value | Integer | Yes | Percentage: 0-100; Absolute value: Number of nodes | Value |
spec:nodeBuffer:strategy: node-onlycount:type: absolutevalue: 0
Parameter | Type | Required | Default Value | Description |
image | String | No | registry.k8s.io/pause:3.9 | Container image |
resources | ResourceRequirements | Yes | - | Resource requests of each placeholder Pod |
priorityClassName | String | No | - | PriorityClass name |
nodeSelector | map[string]string | No | - | Node selector |
tolerations | []Toleration | No | - | Tolerations |
nodeAnchor | NodeAnchorPodSpec | No | - | NodeAnchor Pod configuration |
bufferPod | BufferPodSpec | No | - | Buffer Pod configuration |
cluster-autoscaler.kubernetes.io/safe-to-evict=true annotation to NodeAnchor Pods, ensuring that Cluster Autoscaler can scale in nodes normally.Parameter | Type | Required | Description |
priorityClassName | String | No | PriorityClass name |
nodeSelector | map[string]string | No | Node selector |
tolerations | []Toleration | No | Tolerations |
Parameter | Type | Required | Description |
resources | ResourceRequirements | Yes | Resource requests of each Buffer Pod |
priorityClassName | String | No | PriorityClass name |
nodeSelector | map[string]string | No | Node selector |
tolerations | []Toleration | No | Tolerations |
bufferPod field is not empty, internal/manager.buildBufferPod completely overrides the nodeSelector / tolerations of the top-level placeholderPod. Therefore, if you need to specify scheduling constraints, you must configure them again in bufferPod.spec:placeholderPod:image: registry.k8s.io/pause:3.9resources:requests:cpu: "100m"memory: "128Mi"priorityClassName: buffer-priority-lownodeSelector:node-pool: "default"tolerations:- key: "node.kubernetes.io/not-ready"operator: "Exists"effect: "NoExecute"tolerationSeconds: 300nodeAnchor:priorityClassName: buffer-priority-lowbufferPod:resources:requests:cpu: "1000m"memory: "2Gi"limits:cpu: "1000m"memory: "2Gi"priorityClassName: buffer-priority-lownodeSelector:node-pool: "default"
Parameter | Type | Required | Default Value | Value Range | Description |
reconcileInterval | Integer | No | 30 | ≥10 | Reconciliation interval (in seconds) |
scaleUpCooldown | Integer | No | 300 | ≥0 | Scale-out cooldown period (in seconds) |
scaleDownCooldown | Integer | No | 600 | ≥0 | Scale-in cooldown period (in seconds) |
enableNodeAnchor | *bool | No | true | true,false | Whether to enable NodeAnchor |
enableNodeAnchor uses a pointer type (*bool) so that users can explicitly set it to false. If a regular bool + omitempty is used, the false value is discarded during JSON encoding, causing the apiserver to reapply the kubebuilder default value (true).spec:control:reconcileInterval: 30scaleUpCooldown: 300scaleDownCooldown: 600enableNodeAnchor: true
Parameter | Type | Required | Description |
name | String | Yes | Node pool name (matching node labels) |
nodeSelector | map[string]string | Yes | Label selector used to identify node pools |
count | NodeCountBufferSpec | Yes | Buffer configuration of the node pool |
spec:bufferPods:number: 0nodeBuffer:strategy: bothnodePools:- name: "cpu-pool"nodeSelector:node-pool: "cpu-pool"count:type: absolutevalue: 2- name: "memory-pool"nodeSelector:node-pool: "memory-pool"count:type: percentagevalue: 20
spec:bufferPods:number: 4strategy: fixedplaceholderPod:bufferPod:resources:requests:cpu: "1000m"memory: "2Gi"
spec:bufferPods:number: 0nodeBuffer:strategy: bothnodePools:- name: "cpu-pool"nodeSelector:node-pool: "cpu-pool"count:type: absolutevalue: 2- name: "memory-pool"nodeSelector:node-pool: "memory-pool"count:type: percentagevalue: 20
spec:bufferPods:number: 0nodeBuffer:strategy: node-onlycontrol:enableNodeAnchor: true
:8080/metrics endpoint and supports the following monitoring metrics:Metric Name | Type | Description |
buffer_operator_reconcile_duration_seconds | Histogram | Distribution of reconciliation duration |
buffer_operator_reconcile_total | Counter | Total number of reconciliations |
buffer_operator_reconcile_errors_total | Counter | Number of reconciliation errors |
Metric Name | Type | Description |
buffer_operator_placeholder_pods_current | Gauge | Current number of placeholder Pods |
buffer_operator_placeholder_pods_desired | Gauge | Desired number of placeholder Pods |
buffer_operator_cluster_cpu_total_cores | Gauge | Total number of CPU cores in the cluster |
buffer_operator_cluster_memory_total_bytes | Gauge | Total number of memory bytes in the cluster |
buffer_operator_cluster_cpu_available_cores | Gauge | Available CPU cores |
buffer_operator_cluster_memory_available_bytes | Gauge | Available memory in bytes |
groups:- name: buffer-operatorrules:# High Reconciliation Failure Rate- alert: BufferOperatorHighReconcileErrorRateexpr: rate(buffer_operator_reconcile_errors_total[5m]) > 0.1for: 5mlabels:severity: warningannotations:summary: "High Buffer Operator reconciliation failure rate"# Placeholder Pod Count Deviation- alert: BufferOperatorPlaceholderMismatchexpr: abs(buffer_operator_placeholder_pods_current - buffer_operator_placeholder_pods_desired) > 5for: 10mlabels:severity: warningannotations:summary: "Large deviation between the actual and expected number of placeholder Pods"
Tag | Value | Purpose |
buffer.tke.cloud.tencent.com/placeholder | "true" | Identify Placeholder pods |
buffer.tke.cloud.tencent.com/placeholder-type | buffer-pod / node-anchor | Distinguish categories |
buffer.tke.cloud.tencent.com/config | BufferConfig name | Query the owning CR |
Limit | Description |
reconcileInterval | Minimum value: 10 seconds. |
scaleUpCooldown | No lower limit. Recommended value: 300 seconds (5 minutes). |
scaleDownCooldown | No lower limit. Recommended value: 600 seconds (10 minutes). |
When nodeBuffer.count.type is percentage | The value range is 0-100. |
Limit | Description |
Kubernetes Version | 1.24 or later |
Cluster Autoscaler | Must be deployed and running properly. |
RBAC | Grant read permissions on nodes and pods, and create/delete permissions on pods. |
business-priority-high with a value of 1000), while placeholder Pods use a low-priority PriorityClass (for example, buffer-priority-low with a value of -10). When cluster resources are insufficient, business Pods automatically preempt the resources of placeholder Pods.enableNodeAnchor is set to false, the Operator will not create NodeAnchor Pods, nodes will lose placeholder protection, and Cluster Autoscaler may scale in nodes when resources are insufficient.kubectl get bufferconfig <name> -n <namespace> -o yaml
status field, including:conditions: BufferConfig status conditionsstatistics: Resource statisticslastScaleTime: The time of the last scaling operationlastScaleDirection: The direction of the last scaling operation피드백