Overriding Operator Pod Affinity Configuration
Overriding Operator Pod Affinity Configuration
Pods can be configured to be scheduled in particular nodes using affinity and anti-affinity constraints. Namely, node affinity, and pod affinity and anti-affinity. These constraints can enable users to have high-grained control over where pods are scheduled in the cluster, e.g. to schedule them on nodes running with cheaper architectures, such as arm64, or to improve service resilience by ensuring pod replicas are never scheduled on the same node. In OLM, the Subscription
API can be used to override operator pod’s affinity configuration, thus giving users the ability to override or define their own affinity settings for operator deployments.
The affinity settings for an operator deployment pod defined by the operator author can be overriden in Subscription.config.affinity
, i.e.
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: my-package
namespace: my-namespace
spec:
name: my-package
source: my-operators
sourceNamespace: operator-registries
config:
affinity:
nodeAffinity:
...
podAffinity:
...
podAntiAffinity:
...
Example: Overriding/Defining Node Affinity
The operator nodeAffinity
configuration can be overriden in the following way:
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: my-package
namespace: my-namespace
spec:
name: my-package
source: my-operators
sourceNamespace: operator-registries
config:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
Note that this will completely override the nodeAffinity
configuration defined in the operator deployment pod spec defined by the author.
Example: Removing Operator Author defined Affinity
The empty object {}
can be used to remove any affinity definition already defined in the operator deployment pod spec, e.g.
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: my-package
namespace: my-namespace
spec:
name: my-package
source: my-operators
sourceNamespace: operator-registries
config:
affinity: {}
If equivalent to no affinity configuration. And,
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: my-package
namespace: my-namespace
spec:
name: my-package
source: my-operators
sourceNamespace: operator-registries
config:
affinity:
podAffinity: {}
podAntiAffinity: {}
Is equivalent to keeping the original nodeAffinity
, while removing the original podAffinity
and podAnitAffinity
configurations.