### Install and Apply Kwok Provider Source: https://github.com/kubernetes-sigs/karpenter/blob/main/kwok/README.md Commands to install the Kwok provider and apply its resources to the cluster. Rerun 'make apply' if code changes. ```bash make install-kwok make apply # Run this command again to redeploy if the code has changed ``` -------------------------------- ### Initialize E2E Integration Tests Source: https://github.com/kubernetes-sigs/karpenter/blob/main/dra-kwok-driver/README.md Setup commands for the DRA integration test environment. ```bash make setup-kind-dra # Creates cluster, installs KWOK, deploys Karpenter make e2etest-dra # Runs full test suite (does all steps below automatically) ``` -------------------------------- ### Install Karpenter core dependency Source: https://github.com/kubernetes-sigs/karpenter/blob/main/test/README.md Add the Karpenter core repository to the Go module. ```bash go get sigs.k8s.io/karpenter ``` -------------------------------- ### Spare Capacity Delete Consolidation Example Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/balanced-consolidation.md Example of a spare capacity delete consolidation that is approved because it saves the full node cost. ```text savings_fraction = 4.84 / 58.08 = 8.3% disruption_fraction = 4 / 80 = 5.0% score = 0.083 / 0.05 = 1.67 > 0.5 --> approved ``` -------------------------------- ### NodeOverlay CRD Examples Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/node-overlay.md These examples demonstrate the structure of the NodeOverlay CRD for defining price modifications and extended resource capacity. Use these to specify targeted overrides that can be applied to NodePools. ```yaml kind: NodeOverlay metadata: name: price-modification spec: requirements: - key: node.kubernetes.io/instance-type operator: In values: ["m5.large"] priceAdjustment: "+0.10" --- kind: NodeOverlay metadata: name: extended-resource spec: requirements: - key: node.kubernetes.io/instance-type operator: In values: ["c5.large"] capacity: smarter-devices/fuse: 1 ``` -------------------------------- ### NodeOverlay Conflict Example Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/node-overlay.md Example of two NodeOverlay resources with conflicting configurations and identical weights. ```yaml kind: NodeOverlay metadata: name: memory-1 spec: weight: 90 requirements: - key: karpenter.k8s.aws/instance-memory operator: Gt values: ["m5.large", "m5.2xlarge"] capacity: memory: 50Mi status: condition: - lastTransitionTime: "..." message: "conflict with overlay capacity-1" reason: "conflict" status: "False" type: Ready --- kind: NodeOverlay metadata: name: capacity-1 spec: weight: 90 requirements: - key: node.kubernetes.io/instance-type operator: In values: ["c5.large", "c5.2xlarge", "m5.2xlarge"] capacity: memory: 100Mi status: condition: - lastTransitionTime: "..." message: "" reason: ... status: "True" type: Ready ``` -------------------------------- ### Well-Packed Node Consolidation Example Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/balanced-consolidation.md Example of a well-packed node consolidation that is rejected because there are no savings. ```text One m7i.xlarge runs 10 pods requesting 3.5 vCPU and 14 GiB. The smallest fitting replacement is another m7i.xlarge. Savings is $0. No threshold approves this move. ``` -------------------------------- ### Node Status Example: Ready Condition False Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/node-repair.md An example Kubernetes Node object showing both 'NetworkUnavailable' and 'Ready' conditions with a status of 'False', indicating potential node unreadiness. ```yaml --- apiVersion: v1 kind: Node metadata: ... status: condition: - lastHeartbeatTime: "2024-11-01T16:29:49Z" lastTransitionTime: "2024-11-01T15:02:48Z" message: kubelet is posting ready status reason: KubeletReady status: "False" type: NetworkUnavailable - lastHeartbeatTime: "2024-11-01T16:29:49Z" lastTransitionTime: "2024-11-01T15:02:48Z" message: kubelet is posting ready status reason: KubeletReady status: "False" type: Ready ... - The Node here will be eligible for node repair after at `2024-11-01T15:32:48Z` ``` -------------------------------- ### Define Flexibility Requirements Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/nodepool-requirement-flexibility.md Example configuration demonstrating conflicting flexibility requirements for instance generation and category. ```yaml requirements: - key: karpenter.kwok.sh/instance-generation operator: Exists flexibility: 1 - key: karpenter.kwok.sh/instance-category operator: Exists flexibility: 2 ``` -------------------------------- ### Oversized Node Consolidation Example Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/balanced-consolidation.md Example demonstrating an oversized node consolidation that is approved due to significant savings. ```text savings_fraction = 7.26 / 58.08 = 12.5% disruption_fraction = 3 / 80 = 3.75% score = 0.125 / 0.0375 = 3.33 > 0.5 --> approved ``` -------------------------------- ### Define NodeOverlay resources Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/node-overlay.md Example showing multiple NodeOverlay configurations with varying weights and requirements for capacity and pricing adjustments. ```yaml kind: NodeOverlay metadata: name: default spec: priceAdjustment: "-10%" capacity: memory: 10Mi --- kind: NodeOverlay metadata: name: memory spec: weight: 1 # required to resolve conflicts with default requirements: - key: karpenter.k8s.aws/instance-memory operator: Gt values: [2048] capacity: memory: 50Mi --- kind: NodeOverlay metadata: name: extended-resource spec: # weight is not required since default does not conflict with extended-resource requirements: - key: node.kubernetes.io/instance-type operator: In values: ["m5.large", "m5.2xlarge", "m5.4xlarge", "m5.8xlarge", "m5.12xlarge"] capacity: smarter-devices/fuse: 1 ``` -------------------------------- ### Configure GitHub Actions workflow Source: https://github.com/kubernetes-sigs/karpenter/blob/main/test/README.md Example workflow configuration for running integration tests on push or pull requests. ```yaml # .github/workflows/tests.yaml name: Integration Tests on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Go uses: actions/setup-go@v4 with: go-version: '1.20' - name: Set up cloud provider credentials run: | # Set up your cloud provider credentials here - name: Run tests run: make upstream-e2etests ``` -------------------------------- ### Marginal Move Consolidation Example Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/balanced-consolidation.md Example of a marginal consolidation move that is rejected due to low savings relative to disruption. ```text savings_fraction = 2.42 / 58.08 = 4.2% disruption_fraction = 8 / 80 = 10.0% score = 0.042 / 0.10 = 0.42 < 0.5 --> rejected ``` -------------------------------- ### NodePool Disruption Spec Example Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/disruption-controls.md Example of the Disruption block within a v1beta1 NodePool spec, demonstrating consolidation policy, consolidation after duration, expiration, and budget configurations. ```yaml apiVersion: karpenter.sh/v1beta1 kind: NodePool metadata: name: default spec: # This is not a complete NodePool Spec. disruption: consolidationPolicy: WhenUnderutilized || WhenEmpty consolidateAfter: 10m || Never # metav1.Duration expireAfter: 10m || Never # Equivalent to v1alpha5 TTLSecondsUntilExpired budgets: # On Weekdays during business hours, don't do any deprovisioning. - schedule: "0 9 * * mon-fri" duration: 8h nodes: 0 # Every other time, only allow 10 nodes to be deprovisioned simultaneously - nodes: 10 ``` -------------------------------- ### Configure NodePool Disruption and Budget Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/disruption-controls.md Example of a NodePool specification with default consolidation policy and a 10% node budget. ```yaml apiVersion: karpenter.sh/v1beta1 kind: NodePool metadata: name: default spec: disruption: consolidationPolicy: WhenUnderutilized consolidateAfter: 15s expireAfter: 30d budgets: - nodes: 10% ``` -------------------------------- ### NodePool with minValues for Instance Family and Type Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/nodepool-requirement-flexibility.md This example demonstrates how to configure a NodePool with `minValues` for instance family and instance type requirements. It ensures that at least 2 instance families and 10 instance types are available when scheduling pods. ```yaml apiVersion: karpenter.sh/v1beta1 kind: NodePool spec: template: spec: requirements: - key: karpenter.kwok.sh/instance-family operator: In values: ["c", "m", "r"] minValues: 2 - key: node.kubernetes.io/instance-type operator: Exists minValues: 10 ``` -------------------------------- ### Configure Multi-Reason Disruption Budgets Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/disruption-controls-by-reason.md Example of a NodePool specification using multiple reasons within a single budget entry. ```yaml apiVersion: karpenter.sh/v1beta1 kind: NodePool metadata: name: default spec: # This is not a complete NodePool Spec. disruption: budgets: - schedule: "* * * * *" reasons: [Drifted, Underutilized] nodes: 10 # For all other reasons, only allow 5 nodes to be disrupted at a time - nodes: 5 schedule: "* * * * *" ``` -------------------------------- ### Define Per Reason Controls in NodePool Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/disruption-controls-by-reason.md Example configuration for a NodePool using per-reason disruption controls, including budgets for consolidation and drift. ```yaml apiVersion: karpenter.sh/v1beta1 kind: NodePool metadata: name: example-nodepool spec: disruption: defaults: budgets: - nodes: 10% schedule: "0 0 1 * *" duration: 1h consolidation: consolidationPolicy: WhenUnderutilized disruptAfter: "30m" drift: budgets: - nodes: "20%" schedule: "0 0 1 * *" duration: "1h" - nodes: "10%" schedule: "0 0 * * 0" duration: "2h" - nodes: "50%" schedule: "@monthly" ``` -------------------------------- ### Configure Single-Reason Disruption Budgets Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/disruption-controls-by-reason.md Example of a NodePool specification where each budget entry is limited to a single reason. ```yaml apiVersion: karpenter.sh/v1beta1 kind: NodePool metadata: name: default spec: # This is not a complete NodePool Spec. disruption: budgets: - schedule: "* * * * *" reason: drifted nodes: 10 # For all other reasons , only allow 5 nodes to be disrupted at a time - nodes: 5 schedule: "* * * * *" ``` -------------------------------- ### Configure Multi-Driver DRA Setup Source: https://github.com/kubernetes-sigs/karpenter/blob/main/dra-kwok-driver/README.md Simulates multiple DRA drivers (GPU and FPGA) on the same nodes using separate DRAConfig resources. ```yaml # GPU driver simulation apiVersion: test.karpenter.sh/v1alpha1 kind: DRAConfig metadata: name: gpu-config # User-chosen name namespace: karpenter spec: driver: gpu.nvidia.com # Simulated driver name pools: - name: h100-pool nodeSelectorTerms: - matchExpressions: - key: node.kubernetes.io/instance-type operator: In values: ["g5.xlarge"] resourceSlices: - devices: - name: h100-0 attributes: type: {stringValue: "nvidia-h100"} memory: {stringValue: "80Gi"} --- # FPGA driver simulation apiVersion: test.karpenter.sh/v1alpha1 kind: DRAConfig metadata: name: fpga-config namespace: karpenter spec: driver: fpga.intel.com # Different driver pools: - name: arria-pool nodeSelectorTerms: - matchExpressions: - key: node.kubernetes.io/instance-type operator: In values: ["g5.xlarge"] # Same instance type as above resourceSlices: - devices: - name: arria-0 attributes: type: {stringValue: "intel-arria10"} ``` -------------------------------- ### Example Node Overlay with DRA Configuration Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/karpenter-dra-kwok-driver.md This YAML defines a NodeOverlay configuration for testing Karpenter's integrated DRA scheduling. It specifies requirements for instance type and custom extended resources for DRA devices, with future support for embedding ResourceSlice objects. ```yaml apiVersion: test.karpenter.sh/v1alpha1 kind: NodeOverlay metadata: name: gpu-dra-config spec: weight: 10 # Higher weight for conflict resolution requirements: - key: node.kubernetes.io/instance-type operator: In values: ["g5.48xlarge"] capacity: test.karpenter.sh/device: "8" # Custom extended resource for DRA devices # TODO: Extend NodeOverlay API to embed ResourceSlice templates resourceSlices: # FUTURE: Embedded ResourceSlice objects (not yet implemented) - apiVersion: resource.k8s.io/v1 kind: ResourceSlice spec: # nodeName will be filled in by driver when node is created driver: "test.karpenter.sh" devices: - name: "nvidia-h100-0" driver: "test.karpenter.sh" attributes: memory: "80Gi" compute-capability: "9.0" vendor: "nvidia" - name: "nvidia-h100-1" driver: "test.karpenter.sh" attributes: memory: "80Gi" compute-capability: "9.0" vendor: "nvidia" ``` -------------------------------- ### Manage DRA Integration Test Lifecycle Source: https://github.com/kubernetes-sigs/karpenter/blob/main/dra-kwok-driver/README.md Individual commands used during the E2E integration test process for setup, execution, and cleanup. ```bash kubectl apply -f dra-kwok-driver/pkg/apis/crds/test.karpenter.sh_draconfigs.yaml ``` ```bash kubectl delete draconfigs --all -n karpenter kubectl delete resourceslices --all pkill -f dra-kwok-driver # Kills running driver binary ``` ```bash cd dra-kwok-driver && go build -o dra-kwok-driver main.go ``` ```bash ./dra-kwok-driver > /tmp/dra-driver.log 2>&1 & ``` ```bash TEST_SUITE=dra make e2etests ``` ```bash kubectl delete draconfigs --all kubectl delete resourceslices --all kill ``` -------------------------------- ### NodePool with Balanced Consolidation Policy Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/balanced-consolidation.md Example of a NodePool configuration specifying balanced consolidation. This policy enables consolidation that considers within-family replacements. ```yaml apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: default spec: disruption: consolidationPolicy: Balanced consolidateAfter: 30s budgets: - nodes: 10% ``` -------------------------------- ### NodePool with 72-hour Eventual Disruption Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/do-not-disrupt-grace-period.md This example shows a NodePool configuration with a `terminationGracePeriod` of 72 hours. When combined with pod-level `do-not-disrupt` annotations, it ensures that nodes are eventually disrupted even if pods have protection, with pod protection expiring first or node protection expiring. ```yaml spec: disruption: consolidationPolicy: WhenEmpty template: spec: terminationGracePeriod: 72h ``` -------------------------------- ### Initialize test directories Source: https://github.com/kubernetes-sigs/karpenter/blob/main/test/README.md Create the necessary directory structure for provider-specific test configurations. ```bash mkdir -p test/suites mkdir -p test/pkg/environment/yourprovider ``` -------------------------------- ### Node Status Example: Network Unavailable Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/node-repair.md An example Kubernetes Node object demonstrating the 'NetworkUnavailable' condition with a status of 'False', indicating a network issue. ```yaml apiVersion: v1 kind: Node metadata: ... status: condition: - lastHeartbeatTime: "2024-11-01T16:29:49Z" lastTransitionTime: "2024-11-01T15:02:48Z" message: no connection reason: Network is not available status: "False" type: NetworkUnavailable ... - The Node here will be eligible for node repair after at `2024-11-01T15:12:48Z` ``` -------------------------------- ### NodeRegistrationHealthy Status Condition Example Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/noderegistrationhealthy-status-condition.md Representation of the NodeRegistrationHealthy condition within the NodePool status object. ```yaml // 'NodeRegistrationHealthy' condition indicates if a misconfiguration exists that prevents the normal, successful use of a Karpenter resource Status: Conditions: Last Transition Time: 2025-01-13T18:57:20Z Message: Observed Generation: 1 Reason: NodeRegistrationHealthy Status: True Type: NodeRegistrationHealthy ``` -------------------------------- ### Karpenteradm Diagnose Command with Overlays Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/node-overlay.md This command demonstrates how to use `karpenteradm diagnose` to preview the impact of Node Overlay configurations on instance pricing and capacity. It helps visualize changes before deployment. ```bash > karpenteradm diagnose --type instance-type --overlay price-modification extended-resource --nodepool default NODEPOOL OVERLAY INSTANCE_TYPE CAPACITY TYPE PRICE CAPCITY default "price-modification" m5.large spot 0.47 default "extended-resource" c5.large spot 0 smarter-devices/fuse: 1 ... ``` -------------------------------- ### NodeClaim API Definition Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/v1-api.md Example of a NodeClaim resource definition including spec requirements and status conditions. ```yaml apiVersion: karpenter.sh/v1 kind: NodeClaim metadata: name: default spec: nodeClassRef: group: karpenter.k8s.aws # Updated since only a single version will be served kind: EC2NodeClass name: default taints: - key: example.com/special-taint effect: NoSchedule startupTaints: - key: example.com/another-taint effect: NoSchedule requirements: - key: "karpenter.k8s.aws/instance-category" operator: In values: ["c", "m", "r"] minValues: 2 resources: requests: cpu: "20" memory: "8192Mi" expireAfter: 720h | Never terminationGracePeriod: 1d status: allocatable: cpu: 1930m ephemeral-storage: 17Gi memory: 3055Mi pods: "29" vpc.amazonaws.com/pod-eni: "9" capacity: cpu: "2" ephemeral-storage: 20Gi memory: 3729Mi pods: "29" vpc.amazonaws.com/pod-eni: "9" conditions: - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: Launched - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: Registered - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: Initialized - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: Drifted reason: RequirementsDrifted - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: Expired - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: Empty - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: Ready nodeName: ip-192-168-71-87.us-west-2.compute.internal providerID: aws:///us-west-2b/i-053c6b324e29d2275 imageID: ami-0b1e393fbe12f411c ``` -------------------------------- ### Configure Static NodePool with Scaling and Disruption Budgets Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/static-capacity.md A complete NodePool configuration demonstrating fixed replica counts, instance type constraints, expiration, and time-based disruption budgets. ```yaml apiVersion: karpenter.sh/v1beta1 kind: NodePool metadata: name: static-prod-nodepool spec: replicas: 12 # Maintains 12 nodes template: metadata: labels: nodepool-type: static spec: nodeClassRef: group: karpenter.k8s.aws kind: EC2NodeClass name: myEc2NodeClass expireAfter: 720h taints: - key: example.com/special-taint effect: NoSchedule requirements: - key: topology.kubernetes.io/zone operator: In values: ["zone-2a"] - key: karpenter.k8s.aws/instance-type operator: In values: ["m5.2xlarge"] disruption: budgets: - nodes: 10% # On Weekdays during business hours, don't do any deprovisioning. - schedule: "0 9 * * mon-fri" duration: 8h nodes: "0" limits: # Constrain the size of static Nodepool nodes: 20 # Karpenter will not scale up nodes or create replacements if limits are breaching ``` -------------------------------- ### Define Zonal Topology Requirements Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/static-capacity.md Example of specifying multiple availability zones within a NodePool requirement. ```yaml - key: topology.kubernetes.io/zone operator: In values: ["zone-2a", "zone-2b", "zone-2c"] ``` -------------------------------- ### NodeClaim Printer Columns Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/v1-api.md Defines the columns displayed when listing NodeClaims using `kubectl get nodeclaims`. ```APIDOC ## NodeClaim Printer Columns ### Description Printer columns define the output format for `kubectl get nodeclaims`. They can be customized to show specific fields. ### Standard Columns 1. **Name**: The name of the NodeClaim. 2. **Instance Type**: The instance type provisioned for the NodeClaim. 3. **Capacity**: The capacity of the provisioned node (e.g., spot, on-demand). 4. **Zone**: The availability zone where the node is provisioned. 5. **Node**: The name of the Kubernetes node. 6. **Ready**: Indicates if the node is ready to accept pods. 7. **Age**: The age of the NodeClaim resource. ### Wide Columns (-o wide) In addition to standard columns, wide output includes: 1. **ID**: The provider ID of the node (e.g., AWS instance ID). 2. **NodePool Name**: The name of the NodePool associated with the NodeClaim. 3. **NodeClass Name**: The name of the NodeClass used for provisioning. ``` -------------------------------- ### Run End-to-End Tests Source: https://github.com/kubernetes-sigs/karpenter/blob/main/kwok/README.md Command to execute all end-to-end tests for the Kwok provider. Set the FOCUS environment variable to test a specific case. ```bash export FOCUS="" make e2etests ``` -------------------------------- ### NodePool API Specification Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/v1-api.md Example of a NodePool resource definition including template, disruption budgets, and status fields. ```yaml apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: default spec: template: metadata: labels: billing-team: my-team annotations: example.com/owner: "my-team" spec: nodeClassRef: group: karpenter.k8s.aws # Updated since only a single version will be served kind: EC2NodeClass name: default taints: - key: example.com/special-taint effect: NoSchedule startupTaints: - key: example.com/another-taint effect: NoSchedule requirements: - key: "karpenter.k8s.aws/instance-category" operator: In values: ["c", "m", "r"] minValues: 2 # Alpha field, added for spot best practices support expireAfter: 720h | Never terminationGracePeriod: 1d disruption: budgets: - nodes: 0 schedule: "0 10 * * mon-fri" duration: 16h reasons: - Drifted - Expired - nodes: 100% reasons: - Empty - nodes: "10%" - nodes: 5 consolidationPolicy: WhenUnderutilized | WhenEmpty consolidateAfter: 1m | Never # Added to allow additional control over consolidation aggressiveness weight: 10 limits: cpu: "1000" memory: 1000Gi status: conditions: - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: NodeClassReady - lastTransitionTime: "2024-02-02T19:54:34Z" status: "True" type: Ready resources: nodes: "5" cpu: "20" memory: "8192Mi" ephemeral-storage: "100Gi" ``` -------------------------------- ### Active Buffer with Resource Limits Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/capacity-buffers.md Configure a Capacity Buffer with a PodTemplate and specific resource limits for CPU and memory. This ensures that the buffer does not exceed defined resource constraints. ```yaml apiVersion: v1 kind: PodTemplate metadata: name: worker-template namespace: workers template: spec: containers: - name: worker image: worker:latest resources: requests: cpu: "2" memory: "4Gi" --- apiVersion: autoscaling.x-k8s.io/v1alpha1 kind: CapacityBuffer metadata: name: worker-buffer namespace: workers spec: provisioningStrategy: "buffer.x-k8s.io/active-capacity" podTemplateRef: name: worker-template limits: cpu: "20" memory: "40Gi" ``` -------------------------------- ### NodePool Printer Columns Source: https://github.com/kubernetes-sigs/karpenter/blob/main/designs/v1-api.md Defines the columns displayed when listing NodePool resources using `kubectl get nodepools`. ```APIDOC ## NodePool Printer Columns ### Description Columns displayed for NodePool resources in `kubectl get nodepools` output, including standard and wide views. ### Current Columns (Standard) - **NAME** - **NODECLASS** - **WEIGHT** ### Proposed Columns (Standard) - **Name** - **NodeClass** - **Nodes** - **Ready** - **Age** - **Weight** ### Proposed Columns (Wide - `-o wide`) - **Weight** - **CPU** - **Memory** ```