Skip to content
This repository has been archived by the owner on Dec 11, 2023. It is now read-only.

Commit

Permalink
Merge pull request #199 from Dynatrace/feature/node-affinity
Browse files Browse the repository at this point in the history
Use node affinity to schedule pods on supported platforms
  • Loading branch information
lrgar committed Feb 4, 2020
2 parents 69da420 + ca273fa commit 5eb7c58
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 23 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
Operation cannot be fulfilled on oneagents.dynatrace.com \"oneagent\": the object has been modified; please apply your changes to the latest version and try again
```

### Other changes
* Support deprecation of `beta.kubernetes.io/arch` and `beta.kubernetes.io/os` labels ([#199](https://github.com/Dynatrace/dynatrace-oneagent-operator/pull/199))

## v0.6

### Features
Expand Down
25 changes: 22 additions & 3 deletions deploy/kubernetes.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -582,9 +582,28 @@ spec:
limits:
cpu: 100m
memory: 256Mi
nodeSelector:
beta.kubernetes.io/os: linux
beta.kubernetes.io/arch: amd64
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
- key: beta.kubernetes.io/os
operator: In
values:
- linux
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
serviceAccountName: dynatrace-oneagent-operator
---
apiVersion: rbac.authorization.k8s.io/v1beta1
Expand Down
25 changes: 22 additions & 3 deletions deploy/kubernetes/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,26 @@ spec:
limits:
cpu: 100m
memory: 256Mi
nodeSelector:
beta.kubernetes.io/os: linux
beta.kubernetes.io/arch: amd64
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
- key: beta.kubernetes.io/os
operator: In
values:
- linux
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
serviceAccountName: dynatrace-oneagent-operator
25 changes: 22 additions & 3 deletions deploy/openshift.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -522,9 +522,28 @@ spec:
limits:
cpu: 100m
memory: 256Mi
nodeSelector:
beta.kubernetes.io/os: linux
beta.kubernetes.io/arch: amd64
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
- key: beta.kubernetes.io/os
operator: In
values:
- linux
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
serviceAccountName: dynatrace-oneagent-operator
---
apiVersion: rbac.authorization.k8s.io/v1beta1
Expand Down
25 changes: 22 additions & 3 deletions deploy/openshift/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,26 @@ spec:
limits:
cpu: 100m
memory: 256Mi
nodeSelector:
beta.kubernetes.io/os: linux
beta.kubernetes.io/arch: amd64
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
- key: beta.kubernetes.io/os
operator: In
values:
- linux
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
serviceAccountName: dynatrace-oneagent-operator
7 changes: 0 additions & 7 deletions pkg/apis/dynatrace/v1alpha1/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,6 @@ func SetDefaults_OneAgentSpec(obj *OneAgentSpec) {
obj.Image = "docker.io/dynatrace/oneagent:latest"
}

if _, ok := obj.NodeSelector["beta.kubernetes.io/os"]; !ok {
if obj.NodeSelector == nil {
obj.NodeSelector = make(map[string]string)
}
obj.NodeSelector["beta.kubernetes.io/os"] = "linux"
}

if obj.ServiceAccountName == "" {
obj.ServiceAccountName = "dynatrace-oneagent"
}
Expand Down
1 change: 0 additions & 1 deletion pkg/apis/dynatrace/v1alpha1/defaults_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ func TestSetDefaults_OneAgentSpec(t *testing.T) {
SetDefaults_OneAgentSpec(oa)
assert.NotNil(t, oa.WaitReadySeconds)
assert.NotEmpty(t, oa.Image)
assert.NotEmpty(t, oa.NodeSelector)
assert.NotEmpty(t, oa.Env)
}

Expand Down
44 changes: 41 additions & 3 deletions pkg/controller/oneagent/oneagent_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,8 @@ func (r *ReconcileOneAgent) Reconcile(request reconcile.Request) (reconcile.Resu
}

// finally we have to determine the correct non error phase
updateCR, err = r.determineOneAgentPhase(instance);
if (updateCR) {
updateCR, err = r.determineOneAgentPhase(instance)
if updateCR {
logger.Info("updating custom resource", "cause", "phase change")
if errClient := r.updateCR(instance); errClient != nil {
if err != nil {
Expand All @@ -222,7 +222,6 @@ func (r *ReconcileOneAgent) Reconcile(request reconcile.Request) (reconcile.Resu
}
}


return reconcile.Result{RequeueAfter: 30 * time.Minute}, nil
}

Expand Down Expand Up @@ -397,6 +396,9 @@ func newDaemonSetForCR(instance *dynatracev1alpha1.OneAgent) *appsv1.DaemonSet {
func newPodSpecForCR(instance *dynatracev1alpha1.OneAgent) corev1.PodSpec {
trueVar := true

// K8s 1.18+ is expected to drop the "beta.kubernetes.io" labels in favor of "kubernetes.io" which was added on K8s 1.14.
// To support both older and newer K8s versions we use node affinity.

return corev1.PodSpec{
Containers: []corev1.Container{{
Args: instance.Spec.Args,
Expand Down Expand Up @@ -433,6 +435,42 @@ func newPodSpecForCR(instance *dynatracev1alpha1.OneAgent) corev1.PodSpec {
ServiceAccountName: instance.Spec.ServiceAccountName,
Tolerations: instance.Spec.Tolerations,
DNSPolicy: instance.Spec.DNSPolicy,
Affinity: &corev1.Affinity{
NodeAffinity: &corev1.NodeAffinity{
RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
NodeSelectorTerms: []corev1.NodeSelectorTerm{
corev1.NodeSelectorTerm{
MatchExpressions: []corev1.NodeSelectorRequirement{
corev1.NodeSelectorRequirement{
Key: "beta.kubernetes.io/arch",
Operator: corev1.NodeSelectorOpIn,
Values: []string{"amd64"},
},
corev1.NodeSelectorRequirement{
Key: "beta.kubernetes.io/os",
Operator: corev1.NodeSelectorOpIn,
Values: []string{"linux"},
},
},
},
corev1.NodeSelectorTerm{
MatchExpressions: []corev1.NodeSelectorRequirement{
corev1.NodeSelectorRequirement{
Key: "kubernetes.io/arch",
Operator: corev1.NodeSelectorOpIn,
Values: []string{"amd64"},
},
corev1.NodeSelectorRequirement{
Key: "kubernetes.io/os",
Operator: corev1.NodeSelectorOpIn,
Values: []string{"linux"},
},
},
},
},
},
},
},
Volumes: []corev1.Volume{{
Name: "host-root",
VolumeSource: corev1.VolumeSource{
Expand Down

0 comments on commit 5eb7c58

Please sign in to comment.