Skip to main content
Version: v1.8 ๐Ÿšง

Webhook Extensions

Introductionโ€‹

Koordinator provides an extensible webhook framework that enables custom admission control logic through mutating and validating webhooks. This document details the webhook mechanisms available for extending Koordinator's functionality, focusing on pod, node, and quota admission controls. The framework in pkg/webhook/util/framework provides a structured approach for implementing custom webhook plugins with proper registration, certificate management, and service configuration.

Section sources

Webhook Framework Architectureโ€‹

Webhook Core Architecture:

Webhook Core Components
โ”œโ”€โ”€ Webhook Server
โ”œโ”€โ”€ HandlerBuilder Interface
โ””โ”€โ”€ HandlerBuilderMap

Webhook Types
โ”œโ”€โ”€ Mutating Webhooks
โ””โ”€โ”€ Validating Webhooks

Resource-Specific Handlers
โ”œโ”€โ”€ Pod Webhooks
โ”œโ”€โ”€ Node Webhooks
โ”œโ”€โ”€ Quota Webhooks
โ”œโ”€โ”€ ConfigMap Webhooks
โ””โ”€โ”€ Reservation Webhooks

Relationship Flow:
HandlerBuilder โ†’ HandlerBuilderMap โ†’ Webhook Server
Webhook Server โ†’ Mutating/Validating Webhooks
Mutating/Validating Webhooks โ†’ Various Resource Handlers

Diagram sources

Section sources

Mutating and Validating Webhook Interfacesโ€‹

The webhook framework defines a standardized interface for both mutating and validating webhooks through the HandlerBuilder interface in pkg/webhook/util/framework/builder.go. This interface requires two methods: WithControllerManager to inject the controller manager dependency, and Build to construct the admission handler.

Mutating webhooks modify resources during creation or update operations, while validating webhooks reject requests that don't meet specific criteria. Both types follow the same registration pattern but serve different purposes in the admission control process.

Webhook Handler Class Structure:

Core classes and relationships:

  • HandlerBuilder (Handler builder interface)

    • Methods: WithControllerManager(mgr ctrl.Manager) HandlerBuilder, Build() admission.Handler
  • PodMutatingHandler (Pod mutating handler)

    • Fields: Client client.Client, Decoder *admission.Decoder
    • Methods: Handle(ctx, req), InjectClient(c), InjectDecoder(d)
    • Implements: HandlerBuilder
  • PodValidatingHandler (Pod validating handler)

    • Fields: Client client.Client, Decoder *admission.Decoder, QuotaEvaluator, PodEnhancedValidator
    • Methods: Handle(ctx, req), InjectClient(c), InjectDecoder(d)
    • Implements: HandlerBuilder
  • NodeMutatingHandler (Node mutating handler)

    • Fields: Client client.Client, Decoder *admission.Decoder, ignoreFilter IgnoreFilter
    • Methods: Handle(ctx, req), InjectClient(c), InjectDecoder(d)
    • Implements: HandlerBuilder
  • ElasticQuotaMutatingHandler (Elastic quota mutating handler)

    • Fields: Client client.Client, Decoder *admission.Decoder
    • Methods: Handle(ctx, req), InjectClient(c), InjectDecoder(decoder), InjectCache(cache)
    • Implements: HandlerBuilder

Diagram sources

Section sources

Pod Webhook Implementationโ€‹

Pod webhooks in Koordinator handle both mutating and validating operations for pod resources. The mutating webhook processes pod creation by applying various transformations, while the validating webhook ensures pods meet specific criteria before admission.

The pod mutating webhook implements multiple mutation functions that are executed sequentially during pod creation, including cluster colocation profile application, extended resource specification, multi-quota tree affinity, and device resource specification. Each mutation function is timed and metrics are recorded for performance monitoring.

The pod validating webhook performs comprehensive validation checks, including cluster reservation validation, cluster colocation profile validation, elastic quota validation, quota evaluation, device resource validation, and enhanced validation. These validations are executed in sequence, and any failure results in the rejection of the pod creation request.

Pod Webhook Processing Flow:

Participants:
- Client
- APIserver
- PodMutatingWebhook (Pod mutating webhook)
- PodValidatingWebhook (Pod validating webhook)

Flow:

1. Client โ†’ APIserver: Create Pod Request

2. APIserver โ†’ PodMutatingWebhook: Admission Review

3. PodMutatingWebhook internal processing:
- Apply ClusterColocationProfile
- Apply ExtendedResourceSpec
- Add MultiQuotaTree Affinity
- Apply DeviceResourceSpec

4. PodMutatingWebhook โ†’ APIserver: Return Mutated Pod

5. APIserver โ†’ PodValidatingWebhook: Admission Review

6. PodValidatingWebhook internal validation:
- Validate ClusterReservation
- Validate ClusterColocationProfile
- Validate ElasticQuota
- Evaluate Quota
- Validate DeviceResource
- Enhanced Validation

7. PodValidatingWebhook โ†’ APIserver: Validation Response

8. APIserver โ†’ Client: Pod Created or Rejected

Diagram sources

Section sources

Node Webhook Implementationโ€‹

Node webhooks in Koordinator focus on mutating node status resources rather than the node resources themselves. The implementation is designed to modify node status information during updates, enabling dynamic adjustment of node properties based on various plugins.

The node mutating webhook uses a plugin-based architecture where multiple plugins can be registered to handle different aspects of node mutation. Currently, the resource amplification plugin is implemented to adjust node resource reporting. The webhook specifically targets the node status sub-resource, ensuring that only status updates are processed.

Node Webhook Processing Flow:

1. Node Status Update
โ†“
2. Check Resource Type (Resource = nodes?)
โ”œโ”€ No โ†’ Allow Request
โ””โ”€ Yes โ†’ Continue
โ†“
3. Check SubResource (SubResource = status?)
โ”œโ”€ No โ†’ Allow Request
โ””โ”€ Yes โ†’ Continue
โ†“
4. Decode Node Object
โ†“
5. Create Deep Copy
โ†“
6. For Each Plugin
โ†“
7. Call plugin.Admit
โ†“
8. Check Error?
โ”œโ”€ Yes โ†’ Reject Request
โ””โ”€ No โ†’ Next Plugin
โ†“
9. Last Plugin?
โ”œโ”€ No โ†’ Return to Step 6
โ””โ”€ Yes โ†’ Continue
โ†“
10. Modified?
โ”œโ”€ No โ†’ Allow Request
โ””โ”€ Yes โ†’ Continue
โ†“
11. Generate JSON Patch
โ†“
12. Return Patch Response

Diagram sources

Section sources

Quota Webhook Implementationโ€‹

Quota webhooks in Koordinator handle the admission control for elastic quota resources. These webhooks ensure that quota specifications are valid and properly configured before they are applied to the cluster.

The elastic quota mutating webhook processes quota creation and updates by applying necessary mutations through the quota plugin system. The webhook specifically targets the elasticquotas resource and uses the quota topology plugin to perform the actual mutation logic. The implementation includes proper error handling and metrics collection for performance monitoring.

Elastic Quota Webhook Processing Flow:

Participants:
- Client
- APIserver
- QuotaMutatingWebhook (Quota mutating webhook)
- QuotaPlugin (Quota plugin)

Flow:

1. Client โ†’ APIserver: Create/Update ElasticQuota

2. APIserver โ†’ QuotaMutatingWebhook: Admission Review

3. QuotaMutatingWebhook internal processing:
- Decode Quota Object
- Create Copy

4. QuotaMutatingWebhook โ†’ QuotaPlugin: NewPlugin

5. QuotaMutatingWebhook โ†’ QuotaPlugin: AdmitQuota

6. QuotaPlugin internal: Apply Quota Topology

7. QuotaPlugin โ†’ QuotaMutatingWebhook: Mutation Result

8. QuotaMutatingWebhook internal:
- Compare Original vs Modified
- Generate JSON Patch if Modified

9. QuotaMutatingWebhook โ†’ APIserver: Patch Response

10. APIserver โ†’ Client: Quota Created/Updated or Rejected

Diagram sources

Section sources

Custom Webhook Plugin Developmentโ€‹

Developing custom webhook plugins in Koordinator follows a standardized pattern using the framework in pkg/webhook/util/framework. Developers can create new webhook plugins by implementing the HandlerBuilder interface and registering their handlers in the appropriate webhook package.

The process involves creating a new package under the webhook directory for the target resource, implementing the mutating or validating handler struct, and registering the handler builder in the package's webhooks.go file. Feature gates control the enablement of webhook plugins, allowing for gradual rollout and testing.

Custom Webhook Plugin Development Flow:

1. Create New Webhook Package
โ†“
2. Implement Handler Struct
โ†“
3. Fulfill HandlerBuilder Interface
โ†“
4. Implement WithControllerManager Method
โ†“
5. Implement Build Method
โ†“
6. Create webhooks.go File
โ†“
7. Register Handler to HandlerBuilderMap
โ†“
8. Add to init() in add_<resource>.go
โ†“
9. Use Feature Gate for Enablement
โ†“
10. Implement Unit Tests
โ†“
11. Integrate with Webhook Server

Section sources

Webhook Registration and Configurationโ€‹

Webhook registration in Koordinator follows a centralized pattern where individual webhook packages register their handlers through the addHandlersWithGate function in pkg/webhook/server.go. This function takes a map of handler builders and a gate function that determines whether the webhook should be enabled based on feature flags.

Each resource-specific webhook is registered in its corresponding add_<resource>.go file, which calls addHandlersWithGate with the appropriate handler builder map and feature gate check. This modular approach allows for independent development and testing of webhook functionality.

The registration process also includes setting up the webhook server with the appropriate host, port, and certificate directory, which are configured through the webhook utility package.

Webhook Registration and Configuration Flow:

Participants:
- Main (main program)
- WebhookServer (webhook server)
- HandlerRegistry (handler registry)
- HandlerBuilder (handler builder)

Flow:

1. Main โ†’ WebhookServer: SetupWithManager

2. WebhookServer โ†’ HandlerRegistry: filterActiveHandlers

3. HandlerRegistry internal processing:
- Check Feature Gates
- Remove Disabled Handlers

4. WebhookServer โ†’ HandlerRegistry: Iterate HandlerBuilderMap

5. For each HandlerBuilder:
- HandlerRegistry โ†’ HandlerBuilder: WithControllerManager
- HandlerBuilder internal: Build
- WebhookServer: Register Handler

6. WebhookServer internal:
- Register Conversion Handler
- Register Health Handler

7. WebhookServer โ†’ Main: Return Success

Diagram sources

Section sources

Certificate Management and Service Configurationโ€‹

Certificate management for Koordinator webhooks is handled through the webhook utility package, which provides functions to retrieve the certificate directory and port configuration. The webhook server is configured to use TLS with certificates stored in the specified directory.

The service configuration is defined in the config/webhook directory, which contains the necessary manifests for deploying the webhook service, including the service definition, certificate manager configuration, and webhook manifests. The kustomization files in this directory orchestrate the deployment of the webhook components.

The certificate generation and management process is automated, with the webhook controller handling the lifecycle of webhook configurations and certificates. This ensures that the webhook server can securely communicate with the Kubernetes API server.

Section sources

Security Considerationsโ€‹

Security considerations for Koordinator webhooks include proper authentication and authorization through RBAC configuration, secure communication via TLS, and input validation to prevent malicious requests. The webhook server requires specific permissions to access secrets for certificate management and to update webhook configurations.

Feature gates provide an additional security layer by allowing administrators to enable or disable specific webhooks based on their security requirements. The modular design of the webhook system ensures that individual webhooks can be disabled without affecting the overall functionality of the system.

Input validation is critical in webhook handlers to prevent injection attacks and ensure data integrity. All webhook handlers should validate incoming requests and reject malformed or unauthorized requests with appropriate error messages.

Section sources

Performance Implicationsโ€‹

Performance implications of custom webhook development in Koordinator include latency added to the admission control process, resource utilization of the webhook server, and potential bottlenecks during high-volume operations. Each webhook handler introduces additional processing time that can impact the overall cluster performance.

The framework includes built-in metrics collection to monitor webhook performance, with duration metrics recorded for each webhook operation. These metrics help identify performance bottlenecks and optimize webhook implementations.

To minimize performance impact, webhook handlers should be designed to be lightweight and efficient, avoiding expensive operations or external dependencies. Caching and batching can be used to reduce the overhead of repeated operations.

Section sources

Conclusionโ€‹

Koordinator's webhook framework provides a robust and extensible mechanism for implementing custom admission control logic. The system supports both mutating and validating webhooks for various resources including pods, nodes, and quotas, with a standardized interface for plugin development.

The architecture emphasizes modularity, security, and performance, with feature gates enabling controlled rollout of new webhook functionality. The framework in pkg/webhook/util/framework provides the necessary abstractions for building custom webhook plugins, while the registration system ensures proper integration with the webhook server.

When developing custom webhook plugins, developers should follow the established patterns, implement proper error handling, and consider the performance implications of their code. The comprehensive metrics collection system enables monitoring and optimization of webhook performance in production environments.