OT-CONTAINER-KIT / redis-operator

A golang based redis operator that will make/oversee Redis standalone/cluster/replication/sentinel mode setup on top of the Kubernetes.
https://ot-redis-operator.netlify.app/
Apache License 2.0
742 stars 207 forks source link

Configure tolerations and nodeSelector on RedisCluster not working #647

Open raulpuente opened 9 months ago

raulpuente commented 9 months ago

What version of redis operator are you using? CHART: redis-operator-0.15.3 APP_VERSION: 0.15.0

Does this issue reproduce with the latest release? Yes

What operating system and processor architecture are you using (kubectl version)?

kubectl version Output
$ kubectl version
Client Version: v1.28.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.27.4-eks-2d98532

What did you do?

1- Install helm operator

helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/
helm repo update
helm upgrade redis-operator ot-helm/redis-operator --install --create-namespace --namespace ot-operators

2- Create configuration file values-redis-cluster.yaml for helm ot-helm/redis-cluster

redisCluster:
  clusterSize: 3
tolerations:
  - effect: NoSchedule
    key: example/name
    operator: Equal
    value: "true"
nodeSelector:
  example.com/name: "true"

3- Install helm redis cluster with file configuration

helm upgrade redis ot-helm/redis-cluster --install --namespace ot-operators -f values-redis-cluster.yaml --debug

history.go:56: [debug] getting history for release redis
Release "redis" does not exist. Installing it now.
install.go:200: [debug] Original chart version: ""
install.go:217: [debug] CHART PATH: /Users/rpuente/Library/Caches/helm/repository/redis-cluster-0.15.3.tgz

client.go:134: [debug] creating 1 resource(s)
W0925 11:24:59.922717    6004 warnings.go:70] unknown field "spec.nodeSelector"
W0925 11:24:59.922736    6004 warnings.go:70] unknown field "spec.tolerations"
NAME: redis
LAST DEPLOYED: Mon Sep 25 11:24:59 2023
NAMESPACE: ot-operators
STATUS: deployed
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
nodeSelector:
  example.com/name: "true"
redisCluster:
  clusterSize: 3
tolerations:
- effect: NoSchedule
  key: example/name
  operator: Equal
  value: "true"

COMPUTED VALUES:
affinity: {}
externalConfig:
  data: |
    tcp-keepalive 400
    slowlog-max-len 158
    stream-node-max-bytes 2048
  enabled: false
externalService:
  enabled: false
  port: 6379
  serviceType: LoadBalancer
nodeSelector:
  example.com/name: "true"
pdb:
  enabled: false
  maxUnavailable: 1
podSecurityContext:
  fsGroup: 1000
  runAsUser: 1000
redisCluster:
  clusterSize: 3
  clusterVersion: v7
  follower:
    affinity: {}
    replicas: 3
    serviceType: ClusterIP
  image: quay.io/opstree/redis
  imagePullPolicy: IfNotPresent
  leader:
    affinity: {}
    replicas: 3
    serviceType: ClusterIP
  persistenceEnabled: true
  resources: {}
  tag: v7.0.5
redisExporter:
  enabled: true
  image: quay.io/opstree/redis-exporter
  imagePullPolicy: IfNotPresent
  resources: {}
  tag: v1.44.0
serviceMonitor:
  enabled: false
  interval: 30s
  namespace: monitoring
  scrapeTimeout: 10s
sidecars: []
storageSpec:
  nodeConfVolumeClaimTemplate:
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
  volumeClaimTemplate:
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
tolerations:
- effect: NoSchedule
  key: example/name
  operator: Equal
  value: "true"

HOOKS:
MANIFEST:
---
# Source: redis-cluster/templates/redis-cluster.yaml
apiVersion: redis.redis.opstreelabs.in/v1beta1
kind: RedisCluster
metadata:
  name: redis
  labels:
    app.kubernetes.io/name: redis
    helm.sh/chart: redis-cluster-0.15.3
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/instance: redis
    app.kubernetes.io/version: 0.15.0
    app.kubernetes.io/component: middleware
spec:
  clusterSize: 3
  persistenceEnabled: true
  clusterVersion: v7
  redisLeader:
    replicas: 3
  redisFollower:
    replicas: 3
  redisExporter:
    enabled: true
    image: "quay.io/opstree/redis-exporter:v1.44.0"
    imagePullPolicy: "IfNotPresent"
    resources:
      {}
  kubernetesConfig:
    image: "quay.io/opstree/redis:v7.0.5"
    imagePullPolicy: "IfNotPresent"
    resources:
      {}
  storage:
    nodeConfVolumeClaimTemplate:
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
    volumeClaimTemplate:
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
  nodeSelector:
    example.com/name: "true"
  podSecurityContext:
    fsGroup: 1000
    runAsUser: 1000
  tolerations:
    - effect: NoSchedule
      key: example/name
      operator: Equal
      value: "true"

What did you expect to see? I expected that the redis-operator create the two statefulset redis-leader and redis-follower with tolerations and nodeSelector defined on kind RedisCluster.

Somethink like that:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  annotations:
    meta.helm.sh/release-name: redis
    meta.helm.sh/release-namespace: ot-operators
    redis.opstreelabs.in: "true"
    redis.opstreelabs.instance: redis
  ...
spec:
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Retain
  podManagementPolicy: OrderedReady
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: redis-leader
      app.kubernetes.io/component: middleware
      app.kubernetes.io/instance: redis
      app.kubernetes.io/managed-by: Helm
      app.kubernetes.io/name: redis
      app.kubernetes.io/version: 0.15.0
      helm.sh/chart: redis-cluster-0.15.3
      redis_setup_type: cluster
      role: leader
  serviceName: redis-leader-headless
  template:
    metadata:
      annotations:
        meta.helm.sh/release-name: redis
        meta.helm.sh/release-namespace: ot-operators
        redis.opstreelabs.in: "true"
        redis.opstreelabs.instance: redis
      creationTimestamp: null
      labels:
        app: redis-leader
        app.kubernetes.io/component: middleware
        app.kubernetes.io/instance: redis
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: redis
        app.kubernetes.io/version: 0.15.0
        helm.sh/chart: redis-cluster-0.15.3
        redis_setup_type: cluster
        role: leader
    spec:
      containers:
      - env:
        - name: PERSISTENCE_ENABLED
          value: "true"
        - name: REDIS_ADDR
          value: redis://localhost:6379
        - name: SERVER_MODE
          value: cluster
        - name: SETUP_MODE
          value: cluster
        image: quay.io/opstree/redis:v7.0.5
        imagePullPolicy: IfNotPresent
        livenessProbe:
          exec:
            command:
            - bash
            - /usr/bin/healthcheck.sh
          failureThreshold: 3
          initialDelaySeconds: 1
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: redis-leader
        readinessProbe:
          exec:
            command:
            - bash
            - /usr/bin/healthcheck.sh
          failureThreshold: 3
          initialDelaySeconds: 1
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /node-conf
          name: node-conf
        - mountPath: /data
          name: redis-leader
      - env:
        - name: PERSISTENCE_ENABLED
          value: "true"
        - name: REDIS_ADDR
          value: redis://localhost:6379
        - name: SERVER_MODE
          value: cluster
        - name: SETUP_MODE
          value: cluster
        image: quay.io/opstree/redis-exporter:v1.44.0
        imagePullPolicy: IfNotPresent
        name: redis-exporter
        ports:
        - containerPort: 9121
          name: redis-exporter
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 1000
        runAsUser: 1000
      tolerations:
        - effect: NoSchedule
          key: example/name
          operator: Equal
          value: "true"
      nodeSelector:
        example.com/name: "true"
      terminationGracePeriodSeconds: 30
      ...

What did you see instead?

kubectl -n ot-operators get statefulsets.apps redis-leader -o yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  annotations:
    meta.helm.sh/release-name: redis
    meta.helm.sh/release-namespace: ot-operators
    redis.opstreelabs.in: "true"
    redis.opstreelabs.instance: redis
  creationTimestamp: "2023-09-25T08:55:47Z"
  generation: 1
  labels:
    app: redis-leader
    app.kubernetes.io/component: middleware
    app.kubernetes.io/instance: redis
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: redis
    app.kubernetes.io/version: 0.15.0
    helm.sh/chart: redis-cluster-0.15.3
    redis_setup_type: cluster
    role: leader
  name: redis-leader
  namespace: ot-operators
  ownerReferences:
  - apiVersion: redis.redis.opstreelabs.in/v1beta1
    controller: true
    kind: RedisCluster
    name: redis
    uid: 9b21d0c1-bcc6-42ea-8b4c-ce282e79ec0e
  resourceVersion: "398691902"
  uid: 38c70982-01ea-44e7-932d-2cb75cb8d05a
spec:
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Retain
  podManagementPolicy: OrderedReady
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: redis-leader
      app.kubernetes.io/component: middleware
      app.kubernetes.io/instance: redis
      app.kubernetes.io/managed-by: Helm
      app.kubernetes.io/name: redis
      app.kubernetes.io/version: 0.15.0
      helm.sh/chart: redis-cluster-0.15.3
      redis_setup_type: cluster
      role: leader
  serviceName: redis-leader-headless
  template:
    metadata:
      annotations:
        meta.helm.sh/release-name: redis
        meta.helm.sh/release-namespace: ot-operators
        redis.opstreelabs.in: "true"
        redis.opstreelabs.instance: redis
      creationTimestamp: null
      labels:
        app: redis-leader
        app.kubernetes.io/component: middleware
        app.kubernetes.io/instance: redis
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: redis
        app.kubernetes.io/version: 0.15.0
        helm.sh/chart: redis-cluster-0.15.3
        redis_setup_type: cluster
        role: leader
    spec:
      containers:
      - env:
        - name: PERSISTENCE_ENABLED
          value: "true"
        - name: REDIS_ADDR
          value: redis://localhost:6379
        - name: SERVER_MODE
          value: cluster
        - name: SETUP_MODE
          value: cluster
        image: quay.io/opstree/redis:v7.0.5
        imagePullPolicy: IfNotPresent
        livenessProbe:
          exec:
            command:
            - bash
            - /usr/bin/healthcheck.sh
          failureThreshold: 3
          initialDelaySeconds: 1
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: redis-leader
        readinessProbe:
          exec:
            command:
            - bash
            - /usr/bin/healthcheck.sh
          failureThreshold: 3
          initialDelaySeconds: 1
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /node-conf
          name: node-conf
        - mountPath: /data
          name: redis-leader
      - env:
        - name: PERSISTENCE_ENABLED
          value: "true"
        - name: REDIS_ADDR
          value: redis://localhost:6379
        - name: SERVER_MODE
          value: cluster
        - name: SETUP_MODE
          value: cluster
        image: quay.io/opstree/redis-exporter:v1.44.0
        imagePullPolicy: IfNotPresent
        name: redis-exporter
        ports:
        - containerPort: 9121
          name: redis-exporter
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        fsGroup: 1000
        runAsUser: 1000
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        meta.helm.sh/release-name: redis
        meta.helm.sh/release-namespace: ot-operators
        redis.opstreelabs.in: "true"
        redis.opstreelabs.instance: redis
      creationTimestamp: null
      labels:
        app: redis-leader
        app.kubernetes.io/component: middleware
        app.kubernetes.io/instance: redis
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: redis
        app.kubernetes.io/version: 0.15.0
        helm.sh/chart: redis-cluster-0.15.3
        redis_setup_type: cluster
        role: leader
      name: node-conf
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      volumeMode: Filesystem
    status:
      phase: Pending
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        meta.helm.sh/release-name: redis
        meta.helm.sh/release-namespace: ot-operators
        redis.opstreelabs.in: "true"
        redis.opstreelabs.instance: redis
      creationTimestamp: null
      labels:
        app: redis-leader
        app.kubernetes.io/component: middleware
        app.kubernetes.io/instance: redis
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: redis
        app.kubernetes.io/version: 0.15.0
        helm.sh/chart: redis-cluster-0.15.3
        redis_setup_type: cluster
        role: leader
      name: redis-leader
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
      volumeMode: Filesystem
    status:
      phase: Pending
status:
  availableReplicas: 3
  collisionCount: 0
  currentReplicas: 3
  currentRevision: redis-leader-86df467d68
  observedGeneration: 1
  readyReplicas: 3
  replicas: 3
  updateRevision: redis-leader-86df467d68
  updatedReplicas: 3

There is no nodeSelector and tolerations on statefulset.

peter-mueller-viacom commented 9 months ago

Seems I ran into similar issue; it is in flux with commits last few days? There is now 2 versions of the API https://github.com/OT-CONTAINER-KIT/redis-operator/tree/master/example ... validation & templates are mismatched.