Skip to content

Commit e00f3e4

Browse files
committed
feat: auto tolerate daemonsets with MAP
Signed-off-by: pehlicd <furkanpehlivan34@gmail.com>
1 parent 24fde7b commit e00f3e4

File tree

5 files changed

+19
-4
lines changed

5 files changed

+19
-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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ rules:
77
- apiGroups:
88
- ""
99
resources:
10+
- configmaps
1011
- nodes
1112
verbs:
1213
- 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
@@ -90,6 +90,8 @@ func (r *RuleReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager)
9090
// +kubebuilder:rbac:groups=readiness.node.x-k8s.io,resources=nodereadinessrules,verbs=get;list;watch;create;update;patch;delete
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
93+
// +kubebuilder:rbac:groups="",resources=configmaps,verbs=get;list;watch;create;update;patch;delete
94+
// +kubebuilder:rbac:groups="",resources=nodes,verbs=get;list;watch;create;update;patch;delete
9395

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

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

@@ -690,6 +700,10 @@ func (r *RuleReadinessController) syncTaintsConfigMap(ctx context.Context) error
690700
// Extract unique taint keys with readiness.k8s.io/ prefix and NoSchedule effect
691701
taintKeysSet := make(map[string]struct{})
692702
for _, rule := range ruleList.Items {
703+
// Skip rules that are being deleted
704+
if !rule.DeletionTimestamp.IsZero() {
705+
continue
706+
}
693707
if rule.Spec.Taint.Key != "" &&
694708
strings.HasPrefix(rule.Spec.Taint.Key, "readiness.k8s.io/") &&
695709
rule.Spec.Taint.Effect == corev1.TaintEffectNoSchedule {
@@ -733,7 +747,7 @@ func (r *RuleReadinessController) syncTaintsConfigMap(ctx context.Context) error
733747
} else {
734748
// Update existing ConfigMap
735749
log.V(1).Info("Updating readiness-taints ConfigMap", "taintCount", len(taintKeys))
736-
patch := client.MergeFrom(existingCM)
750+
patch := client.MergeFrom(existingCM.DeepCopy())
737751
existingCM.Data = cm.Data
738752
if err := r.Patch(ctx, existingCM, patch); err != nil {
739753
return fmt.Errorf("failed to update configmap: %w", err)

0 commit comments

Comments
 (0)