Skip to content

Commit 15fb643

Browse files
committed
feat: auto tolerate daemonsets with MAP
Signed-off-by: pehlicd <furkanpehlivan34@gmail.com>
1 parent 64ac877 commit 15fb643

File tree

5 files changed

+26
-4
lines changed

5 files changed

+26
-4
lines changed

config/admission-policy/binding.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
# MutatingAdmissionPolicyBinding binds the policy to the ConfigMap parameter
3-
apiVersion: admissionregistration.k8s.io/v1alpha1
3+
apiVersion: admissionregistration.k8s.io/v1beta1
44
kind: MutatingAdmissionPolicyBinding
55
metadata:
66
name: inject-daemonset-readiness-tolerations-binding

config/admission-policy/policy.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# MutatingAdmissionPolicy for automatic DaemonSet toleration injection
33
# Reads taint keys from a ConfigMap parameter resource
44
# Requires: MutatingAdmissionPolicy feature enabled in the cluster
5-
apiVersion: admissionregistration.k8s.io/v1alpha1
5+
apiVersion: admissionregistration.k8s.io/v1beta1
66
kind: MutatingAdmissionPolicy
77
metadata:
88
name: inject-daemonset-readiness-tolerations

config/rbac/role.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ rules:
1414
- apiGroups:
1515
- ""
1616
resources:
17+
- events
18+
verbs:
19+
- create
20+
- patch
21+
- apiGroups:
22+
- ""
23+
resources:
24+
- configmaps
1725
- nodes
1826
verbs:
1927
- create

docs/admission-policy.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ The MutatingAdmissionPolicy approach uses Kubernetes's native admission control
1212
> MutatingAdmissionPolicy is needed to be enabled in the cluster.
1313
1414
- Feature gate: `MutatingAdmissionPolicy=true`
15-
- Runtime config: `admissionregistration.k8s.io/v1alpha1=true`
15+
- Runtime config: `admissionregistration.k8s.io/v1beta1=true`
1616
- `kubectl` configured to access your cluster
1717
- NodeReadinessRule CRDs installed
1818

internal/controller/nodereadinessrule_controller.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ func (r *RuleReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager)
9191
// +kubebuilder:rbac:groups=readiness.node.x-k8s.io,resources=nodereadinessrules/status,verbs=get;update;patch
9292
// +kubebuilder:rbac:groups=readiness.node.x-k8s.io,resources=nodereadinessrules/finalizers,verbs=update
9393
// +kubebuilder:rbac:groups="",resources=events,verbs=create;patch
94+
// +kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch;delete
95+
// +kubebuilder:rbac:groups="",resources=nodes,verbs=get;list;watch;create;update;patch;delete
9496

9597
func (r *RuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
9698
log := ctrl.LoggerFrom(ctx)
@@ -180,6 +182,7 @@ func (r *RuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.
180182
// 1. Deletes the taints associated with the rule.
181183
// 2. Remove the rule from the cache.
182184
// 3. Remove the finalizer from the rule.
185+
// 4. Sync the Taints ConfigMap.
183186
func (r *RuleReconciler) reconcileDelete(ctx context.Context, rule *readinessv1alpha1.NodeReadinessRule) (ctrl.Result, error) {
184187
log := ctrl.LoggerFrom(ctx)
185188

@@ -203,6 +206,13 @@ func (r *RuleReconciler) reconcileDelete(ctx context.Context, rule *readinessv1a
203206
if err != nil {
204207
return ctrl.Result{}, err
205208
}
209+
210+
// Sync taints to ConfigMap for MutatingAdmissionPolicy
211+
if err := r.Controller.syncTaintsConfigMap(ctx); err != nil {
212+
log.Error(err, "Failed to sync taints configmap", "rule", rule.Name)
213+
// Don't fail reconciliation for this - log and continue
214+
}
215+
206216
return ctrl.Result{}, nil
207217
}
208218

@@ -697,6 +707,10 @@ func (r *RuleReadinessController) syncTaintsConfigMap(ctx context.Context) error
697707
// Extract unique taint keys with readiness.k8s.io/ prefix and NoSchedule effect
698708
taintKeysSet := make(map[string]struct{})
699709
for _, rule := range ruleList.Items {
710+
// Skip rules that are being deleted
711+
if !rule.DeletionTimestamp.IsZero() {
712+
continue
713+
}
700714
if rule.Spec.Taint.Key != "" &&
701715
strings.HasPrefix(rule.Spec.Taint.Key, "readiness.k8s.io/") &&
702716
rule.Spec.Taint.Effect == corev1.TaintEffectNoSchedule {
@@ -740,7 +754,7 @@ func (r *RuleReadinessController) syncTaintsConfigMap(ctx context.Context) error
740754
} else {
741755
// Update existing ConfigMap
742756
log.V(1).Info("Updating readiness-taints ConfigMap", "taintCount", len(taintKeys))
743-
patch := client.MergeFrom(existingCM)
757+
patch := client.MergeFrom(existingCM.DeepCopy())
744758
existingCM.Data = cm.Data
745759
if err := r.Patch(ctx, existingCM, patch); err != nil {
746760
return fmt.Errorf("failed to update configmap: %w", err)

0 commit comments

Comments
 (0)