Skip to content

Commit a2f64eb

Browse files
github-actions[bot]sergelogvinov
authored andcommitted
chore: release v0.7.1
Release v0.7.1 Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Signed-off-by: Serge Logvinov <[email protected]>
1 parent 4f97f52 commit a2f64eb

File tree

8 files changed

+822
-51
lines changed

8 files changed

+822
-51
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.7.0"
2+
".": "0.7.1"
33
}

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# Changelog
22

3+
## [0.7.1](https://github.com/sergelogvinov/karpenter-provider-proxmox/compare/v0.7.0...v0.7.1) (2025-10-27)
4+
5+
6+
### Bug Fixes
7+
8+
* continue node scanning even if some nodes are inaccessible ([a823d87](https://github.com/sergelogvinov/karpenter-provider-proxmox/commit/a823d87f2c6fba5bdfb2efd87d89cc34cfc698dd))
9+
* default mtu size ([375eacf](https://github.com/sergelogvinov/karpenter-provider-proxmox/commit/375eacf56572dbd246a4f0a7ad0e5bd7973881b2))
10+
* find instancetype by capacity ([4f97f52](https://github.com/sergelogvinov/karpenter-provider-proxmox/commit/4f97f52a0e82fe12043975833c572e145d023ee2))
11+
* ipam subnets do not exists warning ([905e1bf](https://github.com/sergelogvinov/karpenter-provider-proxmox/commit/905e1bfffdccd6747482ec0fa5a503650488a6f6))
12+
* network trunk and mtu options ([f564db2](https://github.com/sergelogvinov/karpenter-provider-proxmox/commit/f564db2df553d7430fdbe7b11c7b4c42435b2721))
13+
* set default gateway as cidr ([ecfb26d](https://github.com/sergelogvinov/karpenter-provider-proxmox/commit/ecfb26d01bcf4670ee361a9ca5ffe6a2e61eb74a))
14+
315
## [0.7.0](https://github.com/sergelogvinov/karpenter-provider-proxmox/compare/v0.6.0...v0.7.0) (2025-09-21)
416

517

charts/karpenter-provider-proxmox/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ maintainers:
1818
url: https://github.com/sergelogvinov
1919
#
2020
# Versions are expected to follow Semantic Versioning (https://semver.org/)
21-
version: 0.4.0
21+
version: 0.4.1
2222
# This is the version number of the application being deployed. This version number should be
2323
# incremented each time you make changes to the application. Versions are not expected to
2424
# follow Semantic Versioning. They should reflect the version the application is using.
2525
# It is recommended to use it with quotes.
26-
appVersion: v0.7.0
26+
appVersion: v0.7.1
2727
#
2828
annotations:
2929
artifacthub.io/alternativeName: karpenter-provider-proxmox

charts/karpenter-provider-proxmox/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# karpenter-provider-proxmox
22

3-
![Version: 0.4.0](https://img.shields.io/badge/Version-0.4.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v0.7.0](https://img.shields.io/badge/AppVersion-v0.7.0-informational?style=flat-square)
3+
![Version: 0.4.1](https://img.shields.io/badge/Version-0.4.1-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v0.7.1](https://img.shields.io/badge/AppVersion-v0.7.1-informational?style=flat-square)
44

55
Karpenter for Proxmox VE.
66

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
---
2+
apiVersion: apiextensions.k8s.io/v1
3+
kind: CustomResourceDefinition
4+
metadata:
5+
annotations:
6+
controller-gen.kubebuilder.io/version: v0.19.0
7+
name: nodeoverlays.karpenter.sh
8+
spec:
9+
group: karpenter.sh
10+
names:
11+
categories:
12+
- karpenter
13+
kind: NodeOverlay
14+
listKind: NodeOverlayList
15+
plural: nodeoverlays
16+
shortNames:
17+
- overlays
18+
singular: nodeoverlay
19+
scope: Cluster
20+
versions:
21+
- additionalPrinterColumns:
22+
- jsonPath: .status.conditions[?(@.type=="Ready")].status
23+
name: Ready
24+
type: string
25+
- jsonPath: .metadata.creationTimestamp
26+
name: Age
27+
type: date
28+
- jsonPath: .spec.weight
29+
name: Weight
30+
priority: 1
31+
type: integer
32+
name: v1alpha1
33+
schema:
34+
openAPIV3Schema:
35+
properties:
36+
apiVersion:
37+
description: |-
38+
APIVersion defines the versioned schema of this representation of an object.
39+
Servers should convert recognized schemas to the latest internal value, and
40+
may reject unrecognized values.
41+
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
42+
type: string
43+
kind:
44+
description: |-
45+
Kind is a string value representing the REST resource this object represents.
46+
Servers may infer this from the endpoint the client submits requests to.
47+
Cannot be updated.
48+
In CamelCase.
49+
More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
50+
type: string
51+
metadata:
52+
type: object
53+
spec:
54+
properties:
55+
capacity:
56+
additionalProperties:
57+
anyOf:
58+
- type: integer
59+
- type: string
60+
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
61+
x-kubernetes-int-or-string: true
62+
description: |-
63+
Capacity adds extended resources only, and does not replace any existing resources.
64+
These extended resources are appended to the node's existing resource list.
65+
Note: This field does not modify or override standard resources like cpu, memory, ephemeral-storage, or pods.
66+
type: object
67+
x-kubernetes-validations:
68+
- message: invalid resource restricted
69+
rule: self.all(x, !(x in ['cpu', 'memory', 'ephemeral-storage',
70+
'pods']))
71+
price:
72+
description: Price specifies amount for an instance types that match
73+
the specified labels. Users can override prices using a signed float
74+
representing the price override
75+
pattern: ^\d+(\.\d+)?$
76+
type: string
77+
priceAdjustment:
78+
description: |-
79+
PriceAdjustment specifies the price change for matching instance types. Accepts either:
80+
- A fixed price modifier (e.g., -0.5, 1.2)
81+
- A percentage modifier (e.g., +10% for increase, -15% for decrees)
82+
pattern: ^(([+-]{1}(\d*\.?\d+))|(\+{1}\d*\.?\d+%)|(^(-\d{1,2}(\.\d+)?%)$)|(-100%))$
83+
type: string
84+
requirements:
85+
description: |-
86+
Requirements constrain when this NodeOverlay is applied during scheduling simulations.
87+
These requirements can match:
88+
- Well-known labels (e.g., node.kubernetes.io/instance-type, karpenter.sh/nodepool)
89+
- Custom labels from NodePool's spec.template.labels
90+
items:
91+
description: |-
92+
A node selector requirement is a selector that contains values, a key, and an operator
93+
that relates the key and values.
94+
properties:
95+
key:
96+
description: The label key that the selector applies to.
97+
type: string
98+
operator:
99+
description: |-
100+
Represents a key's relationship to a set of values.
101+
Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
102+
type: string
103+
values:
104+
description: |-
105+
An array of string values. If the operator is In or NotIn,
106+
the values array must be non-empty. If the operator is Exists or DoesNotExist,
107+
the values array must be empty. If the operator is Gt or Lt, the values
108+
array must have a single element, which will be interpreted as an integer.
109+
This array is replaced during a strategic merge patch.
110+
items:
111+
type: string
112+
type: array
113+
x-kubernetes-list-type: atomic
114+
required:
115+
- key
116+
- operator
117+
type: object
118+
maxItems: 100
119+
type: array
120+
x-kubernetes-validations:
121+
- message: requirements with operator 'NotIn' must have a value defined
122+
rule: 'self.all(x, x.operator == ''NotIn'' ? x.values.size() !=
123+
0 : true)'
124+
- message: requirements with operator 'In' must have a value defined
125+
rule: 'self.all(x, x.operator == ''In'' ? x.values.size() != 0 :
126+
true)'
127+
- message: requirements operator 'Gt' or 'Lt' must have a single positive
128+
integer value
129+
rule: 'self.all(x, (x.operator == ''Gt'' || x.operator == ''Lt'')
130+
? (x.values.size() == 1 && int(x.values[0]) >= 0) : true)'
131+
weight:
132+
description: |-
133+
Weight defines the priority of this NodeOverlay when overriding node attributes.
134+
NodeOverlays with higher numerical weights take precedence over those with lower weights.
135+
If no weight is specified, the NodeOverlay is treated as having a weight of 0.
136+
When multiple NodeOverlays have identical weights, they are merged in alphabetical order.
137+
format: int32
138+
maximum: 10000
139+
minimum: 1
140+
type: integer
141+
required:
142+
- requirements
143+
type: object
144+
x-kubernetes-validations:
145+
- message: cannot set both 'price' and 'priceAdjustment'
146+
rule: '!has(self.price) || !has(self.priceAdjustment)'
147+
status:
148+
description: NodeOverlayStatus defines the observed state of NodeOverlay
149+
properties:
150+
conditions:
151+
description: Conditions contains signals for health and readiness
152+
items:
153+
description: Condition aliases the upstream type and adds additional
154+
helper methods
155+
properties:
156+
lastTransitionTime:
157+
description: |-
158+
lastTransitionTime is the last time the condition transitioned from one status to another.
159+
This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
160+
format: date-time
161+
type: string
162+
message:
163+
description: |-
164+
message is a human readable message indicating details about the transition.
165+
This may be an empty string.
166+
maxLength: 32768
167+
type: string
168+
observedGeneration:
169+
description: |-
170+
observedGeneration represents the .metadata.generation that the condition was set based upon.
171+
For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
172+
with respect to the current state of the instance.
173+
format: int64
174+
minimum: 0
175+
type: integer
176+
reason:
177+
description: |-
178+
reason contains a programmatic identifier indicating the reason for the condition's last transition.
179+
Producers of specific condition types may define expected values and meanings for this field,
180+
and whether the values are considered a guaranteed API.
181+
The value should be a CamelCase string.
182+
This field may not be empty.
183+
maxLength: 1024
184+
minLength: 1
185+
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
186+
type: string
187+
status:
188+
description: status of the condition, one of True, False, Unknown.
189+
enum:
190+
- "True"
191+
- "False"
192+
- Unknown
193+
type: string
194+
type:
195+
description: type of condition in CamelCase or in foo.example.com/CamelCase.
196+
maxLength: 316
197+
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
198+
type: string
199+
required:
200+
- lastTransitionTime
201+
- message
202+
- reason
203+
- status
204+
- type
205+
type: object
206+
type: array
207+
type: object
208+
required:
209+
- spec
210+
type: object
211+
served: true
212+
storage: true
213+
subresources:
214+
status: {}

charts/karpenter-provider-proxmox/crds/karpenter.sh_nodepools.yaml

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ spec:
2020
- jsonPath: .spec.template.spec.nodeClassRef.name
2121
name: NodeClass
2222
type: string
23-
- jsonPath: .status.resources.nodes
23+
- jsonPath: .status.nodes
2424
name: Nodes
2525
type: string
2626
- jsonPath: .status.conditions[?(@.type=="Ready")].status
@@ -124,6 +124,7 @@ spec:
124124
- Empty
125125
- Drifted
126126
type: string
127+
maxItems: 50
127128
type: array
128129
schedule:
129130
description: |-
@@ -146,13 +147,15 @@ spec:
146147
ConsolidateAfter is the duration the controller will wait
147148
before attempting to terminate nodes that are underutilized.
148149
Refer to ConsolidationPolicy for how underutilization is considered.
150+
When replicas is set, ConsolidateAfter is simply ignored
149151
pattern: ^(([0-9]+(s|m|h))+|Never)$
150152
type: string
151153
consolidationPolicy:
152154
default: WhenEmptyOrUnderutilized
153155
description: |-
154156
ConsolidationPolicy describes which nodes Karpenter can disrupt through its consolidation
155157
algorithm. This policy defaults to "WhenEmptyOrUnderutilized" if not specified
158+
When replicas is set, ConsolidationPolicy is simply ignored
156159
enum:
157160
- WhenEmpty
158161
- WhenEmptyOrUnderutilized
@@ -167,8 +170,24 @@ spec:
167170
- type: string
168171
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
169172
x-kubernetes-int-or-string: true
170-
description: Limits define a set of bounds for provisioning capacity.
173+
description: |-
174+
Limits define a set of bounds for provisioning capacity.
175+
Limits other than limits.nodes is not supported when replicas is set.
171176
type: object
177+
replicas:
178+
description: |-
179+
Replicas is the desired number of nodes for the NodePool. When specified, the NodePool will
180+
maintain this fixed number of replicas rather than scaling based on pod demand.
181+
When replicas is set:
182+
- The following fields are ignored:
183+
* disruption.consolidationPolicy
184+
* disruption.consolidateAfter
185+
- Only limits.nodes is supported; other resource limits (e.g., CPU, memory) must not be specified.
186+
- Weight is not supported.
187+
Note: This field is alpha.
188+
format: int64
189+
minimum: 0
190+
type: integer
172191
template:
173192
description: |-
174193
Template contains the template of possibilities for the provisioning logic to launch a NodeClaim with.
@@ -394,13 +413,23 @@ spec:
394413
numerical weight indicates that this nodepool will be ordered
395414
ahead of other nodepools with lower weights. A nodepool with no weight
396415
will be treated as if it is a nodepool with a weight of 0.
416+
Weight is not supported when replicas is set.
397417
format: int32
398418
maximum: 100
399419
minimum: 1
400420
type: integer
401421
required:
402422
- template
403423
type: object
424+
x-kubernetes-validations:
425+
- message: Cannot transition NodePool between static (replicas set) and
426+
dynamic (replicas unset) provisioning modes
427+
rule: has(self.replicas) == has(oldSelf.replicas)
428+
- message: only 'limits.nodes' is supported on static NodePools
429+
rule: '!has(self.replicas) || (!has(self.limits) || size(self.limits)
430+
== 0 || (size(self.limits) == 1 && ''nodes'' in self.limits))'
431+
- message: '''weight'' is not supported on static NodePools'
432+
rule: '!has(self.replicas) || !has(self.weight)'
404433
status:
405434
description: NodePoolStatus defines the observed state of NodePool
406435
properties:
@@ -467,6 +496,11 @@ spec:
467496
the actual NodeClass Generation, NodeRegistrationHealthy status condition on the NodePool will be reset
468497
format: int64
469498
type: integer
499+
nodes:
500+
default: 0
501+
description: Nodes is the count of nodes associated with this NodePool
502+
format: int64
503+
type: integer
470504
resources:
471505
additionalProperties:
472506
anyOf:
@@ -483,4 +517,7 @@ spec:
483517
served: true
484518
storage: true
485519
subresources:
520+
scale:
521+
specReplicasPath: .spec.replicas
522+
statusReplicasPath: .status.nodes
486523
status: {}

0 commit comments

Comments
 (0)