Skip to content

Commit 8511d39

Browse files
Merge branch 'main' into vijayr/109585-k8sagent-addon-2
2 parents 2ec690c + 53680cf commit 8511d39

File tree

39 files changed

+1989
-34
lines changed

39 files changed

+1989
-34
lines changed

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.35.1"
2+
".": "0.36.0"
33
}

CHANGELOG.md

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

3+
## 0.36.0 (2025-10-28)
4+
5+
<!-- Release notes generated using configuration in .github/release.yaml at main -->
6+
7+
## What's Changed
8+
### Exciting New Features 🎉
9+
* feat: update Nutanix CSI to 3.3.8 by @prajnutanix in https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pull/1320
10+
* feat: update all addon versions by @dkoshkin in https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pull/1352
11+
* feat: deploy AWS Load Balancer controller in EKS clusters by @dkoshkin in https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pull/1341
12+
* feat: NFD local feature discovery for aws placement groups by @supershal in https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pull/1363
13+
### Fixes 🔧
14+
* fix: update CAPA to v2.10.0-ncn.1 by @supershal in https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pull/1360
15+
* fix: skip syncing controlplane's infrastructure templates for EKS Clusterclass by @supershal in https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pull/1366
16+
### Other Changes
17+
* build: handle missing creds Secrets listing CSI images by @dkoshkin in https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pull/1359
18+
* build: fix list-images for AWS LB controller by @dkoshkin in https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pull/1364
19+
20+
21+
**Full Changelog**: https://github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/compare/v0.35.1...v0.36.0
22+
323
## 0.35.1 (2025-10-07)
424

525
<!-- Release notes generated using configuration in .github/release.yaml at main -->

charts/cluster-api-runtime-extensions-nutanix/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ A Helm chart for cluster-api-runtime-extensions-nutanix
7878
| hooks.cni.cilium.crsStrategy.defaultCiliumConfigMap.name | string | `"cilium"` | |
7979
| hooks.cni.cilium.helmAddonStrategy.defaultValueTemplateConfigMap.create | bool | `true` | |
8080
| hooks.cni.cilium.helmAddonStrategy.defaultValueTemplateConfigMap.name | string | `"default-cilium-cni-helm-values-template"` | |
81+
| hooks.cni.multus.helmAddonStrategy.defaultValueTemplateConfigMap.create | bool | `true` | |
82+
| hooks.cni.multus.helmAddonStrategy.defaultValueTemplateConfigMap.name | string | `"default-multus-values-template"` | |
8183
| hooks.cosi.controller.helmAddonStrategy.defaultValueTemplateConfigMap.create | bool | `true` | |
8284
| hooks.cosi.controller.helmAddonStrategy.defaultValueTemplateConfigMap.name | string | `"default-cosi-controller-helm-values-template"` | |
8385
| hooks.csi.aws-ebs.helmAddonStrategy.defaultValueTemplateConfigMap.create | bool | `true` | |
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Multus daemon configuration overrides
2+
daemonConfig:
3+
readinessIndicatorFile: "{{ .ReadinessSocketPath }}"
4+
5+
{{- if .ReadinessSocketPath }}
6+
# Volumes for CNI readiness socket
7+
volumes:
8+
- name: cni-readiness-sock
9+
hostPath:
10+
path: "{{ .ReadinessSocketPath }}"
11+
type: Socket
12+
13+
# Volume mounts for CNI readiness socket
14+
volumeMounts:
15+
- name: cni-readiness-sock
16+
mountPath: "{{ .ReadinessSocketPath }}"
17+
readOnly: true
18+
{{- end }}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Copyright 2024 Nutanix. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
{{- if .Values.hooks.cni.multus.helmAddonStrategy.defaultValueTemplateConfigMap.create }}
5+
apiVersion: v1
6+
kind: ConfigMap
7+
metadata:
8+
name: '{{ .Values.hooks.cni.multus.helmAddonStrategy.defaultValueTemplateConfigMap.name }}'
9+
data:
10+
values.yaml: |-
11+
{{- .Files.Get "addons/cni/multus/values-template.yaml" | nindent 4 }}
12+
{{- end -}}

charts/cluster-api-runtime-extensions-nutanix/templates/helm-config.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ data:
4747
ChartName: metallb
4848
ChartVersion: 0.15.2
4949
RepositoryURL: '{{ if .Values.helmRepository.enabled }}oci://helm-repository.{{ .Release.Namespace }}.svc/charts{{ else }}https://metallb.github.io/metallb{{ end }}'
50+
multus: |
51+
ChartName: multus
52+
ChartVersion: 0.1.0
53+
RepositoryURL: '{{ if .Values.helmRepository.enabled }}oci://helm-repository.{{ .Release.Namespace }}.svc/charts{{ else }}https://mesosphere.github.io/charts/stable/{{ end }}'
5054
nfd: |
5155
ChartName: node-feature-discovery
5256
ChartVersion: 0.18.1

charts/cluster-api-runtime-extensions-nutanix/values.schema.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,27 @@
381381
}
382382
}
383383
}
384+
},
385+
"multus": {
386+
"type": "object",
387+
"properties": {
388+
"helmAddonStrategy": {
389+
"type": "object",
390+
"properties": {
391+
"defaultValueTemplateConfigMap": {
392+
"type": "object",
393+
"properties": {
394+
"create": {
395+
"type": "boolean"
396+
},
397+
"name": {
398+
"type": "string"
399+
}
400+
}
401+
}
402+
}
403+
}
404+
}
384405
}
385406
}
386407
},

charts/cluster-api-runtime-extensions-nutanix/values.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ hooks:
4343
defaultValueTemplateConfigMap:
4444
create: true
4545
name: default-cilium-cni-helm-values-template
46+
multus:
47+
helmAddonStrategy:
48+
defaultValueTemplateConfigMap:
49+
create: true
50+
name: default-multus-values-template
4651
csi:
4752
nutanix:
4853
helmAddonStrategy:
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
+++
2+
title = "AWS Placement Group Node Feature Discovery"
3+
+++
4+
5+
The AWS placement group NFD (Node Feature Discovery) customization automatically discovers and labels nodes with their placement group information, enabling workload scheduling based on placement group characteristics.
6+
7+
This customization will be available when the
8+
[provider-specific cluster configuration patch]({{< ref "..">}}) is included in the `ClusterClass`.
9+
10+
## What is Placement Group NFD?
11+
12+
Placement Group NFD automatically discovers the placement group information for each node and creates node labels that can be used for workload scheduling. This enables:
13+
14+
- **Workload Affinity**: Schedule pods on nodes within the same placement group for low latency
15+
- **Fault Isolation**: Schedule critical workloads on nodes in different placement groups
16+
- **Resource Optimization**: Use placement group labels for advanced scheduling strategies
17+
18+
## How it Works
19+
20+
The NFD customization:
21+
22+
1. **Deploys a Discovery Script**: Automatically installs a script on each node that queries AWS metadata
23+
2. **Queries AWS Metadata**: Uses EC2 instance metadata to discover placement group information
24+
3. **Creates Node Labels**: Generates Kubernetes node labels with placement group details
25+
4. **Updates Continuously**: Refreshes labels as nodes are added or moved
26+
27+
## Generated Node Labels
28+
29+
The NFD customization creates the following node labels:
30+
31+
| Label | Description | Example |
32+
|-------|-------------|---------|
33+
| `feature.node.kubernetes.io/aws-placement-group` | The name of the placement group | `my-cluster-pg` |
34+
| `feature.node.kubernetes.io/partition` | The partition number (for partition placement groups) | `0`, `1`, `2` |
35+
36+
## Configuration
37+
38+
The placement group NFD customization is automatically enabled when a placement group is configured. No additional configuration is required.
39+
40+
```yaml
41+
apiVersion: cluster.x-k8s.io/v1beta1
42+
kind: Cluster
43+
metadata:
44+
name: <NAME>
45+
spec:
46+
topology:
47+
variables:
48+
- name: clusterConfig
49+
value:
50+
controlPlane:
51+
aws:
52+
placementGroup:
53+
name: "control-plane-pg"
54+
- name: workerConfig
55+
value:
56+
aws:
57+
placementGroup:
58+
name: "worker-pg"
59+
```
60+
61+
## Usage Examples
62+
63+
### Workload Affinity
64+
65+
Schedule pods on nodes within the same placement group for low latency:
66+
67+
```yaml
68+
apiVersion: apps/v1
69+
kind: Deployment
70+
metadata:
71+
name: high-performance-app
72+
spec:
73+
replicas: 3
74+
selector:
75+
matchLabels:
76+
app: high-performance-app
77+
template:
78+
metadata:
79+
labels:
80+
app: high-performance-app
81+
spec:
82+
affinity:
83+
nodeAffinity:
84+
requiredDuringSchedulingIgnoredDuringExecution:
85+
nodeSelectorTerms:
86+
- matchExpressions:
87+
- key: feature.node.kubernetes.io/aws-placement-group
88+
operator: In
89+
values: ["worker-pg"]
90+
containers:
91+
- name: app
92+
image: my-app:latest
93+
```
94+
95+
### Fault Isolation
96+
97+
Distribute critical workloads across different placement groups:
98+
99+
```yaml
100+
apiVersion: apps/v1
101+
kind: Deployment
102+
metadata:
103+
name: critical-app
104+
spec:
105+
replicas: 6
106+
selector:
107+
matchLabels:
108+
app: critical-app
109+
template:
110+
metadata:
111+
labels:
112+
app: critical-app
113+
spec:
114+
affinity:
115+
podAntiAffinity:
116+
requiredDuringSchedulingIgnoredDuringExecution:
117+
- labelSelector:
118+
matchExpressions:
119+
- key: app
120+
operator: In
121+
values: ["critical-app"]
122+
topologyKey: feature.node.kubernetes.io/aws-placement-group
123+
containers:
124+
- name: app
125+
image: critical-app:latest
126+
```
127+
128+
### Partition-Aware Scheduling
129+
130+
For partition placement groups, schedule workloads on specific partitions:
131+
132+
```yaml
133+
apiVersion: apps/v1
134+
kind: StatefulSet
135+
metadata:
136+
name: distributed-database
137+
spec:
138+
replicas: 3
139+
selector:
140+
matchLabels:
141+
app: distributed-database
142+
template:
143+
metadata:
144+
labels:
145+
app: distributed-database
146+
spec:
147+
affinity:
148+
nodeAffinity:
149+
requiredDuringSchedulingIgnoredDuringExecution:
150+
nodeSelectorTerms:
151+
- matchExpressions:
152+
- key: feature.node.kubernetes.io/partition
153+
operator: In
154+
values: ["0", "1", "2"]
155+
containers:
156+
- name: database
157+
image: my-database:latest
158+
```
159+
160+
## Verification
161+
162+
You can verify that the NFD labels are working by checking the node labels:
163+
164+
```bash
165+
# Check all nodes and their placement group labels
166+
kubectl get nodes --show-labels | grep placement-group
167+
168+
# Check specific node labels
169+
kubectl describe node <node-name> | grep placement-group
170+
171+
# Check partition labels
172+
kubectl get nodes --show-labels | grep partition
173+
```
174+
175+
## Troubleshooting
176+
177+
### Check NFD Script Status
178+
179+
Verify that the discovery script is running:
180+
181+
```bash
182+
# Check if the script exists on nodes
183+
kubectl debug node/<node-name> -it --image=busybox -- chroot /host ls -la /etc/kubernetes/node-feature-discovery/source.d/
184+
185+
# Check script execution
186+
kubectl debug node/<node-name> -it --image=busybox -- chroot /host cat /etc/kubernetes/node-feature-discovery/features.d/placementgroup
187+
```
188+
189+
## Integration with Other Features
190+
191+
Placement Group NFD works seamlessly with:
192+
193+
- **Pod Affinity/Anti-Affinity**: Use placement group labels for advanced scheduling
194+
- **Topology Spread Constraints**: Distribute workloads across placement groups
195+
196+
## Security Considerations
197+
198+
- The discovery script queries AWS instance metadata (IMDSv2)
199+
- No additional IAM permissions are required beyond standard node permissions
200+
- Labels are automatically managed and do not require manual intervention
201+
- The script runs with appropriate permissions and security context

0 commit comments

Comments
 (0)