diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e5f4c2ad4170984e3e7e976d167acada2c67a33..2a797ae650afaf14ecac056d77b0e2e5e74627d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +### v0.12.0 +##### October 12, 2022 + +#### :beetle: Bug Fixes + +- PDB (Pod disruption budget) creation issue +- Fixed cluster recovery logic +- Fixed IP check and conversion logic +- Persistence issue fix + +#### :tada: Features + +- Added pvc, pv clusterrole fix +- Support for defining serviceAccount +- Closing of redis client connection +- Added finalizer for statefulset +- Added Prometheus service annotation +- Added support for Redis 7 with DNS hostname + ### v0.11.0 ##### July 5, 2022 diff --git a/SECURITY.md b/SECURITY.md index b55c63bf8807624db3d136630b3de3582ea6f8a9..71e7c63c17636372b9097dc41ed44bf74cc6e6f5 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,15 +6,19 @@ Use this section to tell people about which versions of your project are currently being supported with security updates. | Version | Supported | -| ------- | ------------------ | -| 0.8.0 | :white_check_mark: | -| 0.7.0 | :white_check_mark: | -| 0.6.0 | :white_check_mark: | -| 0.5.0 | :x: | -| 0.4.0 | :x: | -| 0.3.0 | :x: | -| 0.2.0 | :x: | -| 0.1.0 | :x: | +|---------|--------------------| +| 0.12.0 | :white_check_mark: | +| 0.11.0 | :white_check_mark: | +| 0.10.0 | :x: | +| 0.9.0 | :x: | +| 0.8.0 | :x: | +| 0.7.0 | :x: | +| 0.6.0 | :x: | +| 0.5.0 | :x: | +| 0.4.0 | :x: | +| 0.3.0 | :x: | +| 0.2.0 | :x: | +| 0.1.0 | :x: | ## Reporting a Vulnerability diff --git a/api/v1beta1/rediscluster_types.go b/api/v1beta1/rediscluster_types.go index c817e21caf41b89d11926080238df3e97bbba5fa..5f91a4963b9db325b5a871f997e65e806d18a65c 100644 --- a/api/v1beta1/rediscluster_types.go +++ b/api/v1beta1/rediscluster_types.go @@ -25,6 +25,8 @@ import ( type RedisClusterSpec struct { Size *int32 `json:"clusterSize"` KubernetesConfig KubernetesConfig `json:"kubernetesConfig"` + // +kubebuilder:default:=v7 + ClusterVersion *string `json:"clusterVersion,omitempty"` // +kubebuilder:default:={livenessProbe:{initialDelaySeconds: 1, timeoutSeconds: 1, periodSeconds: 10, successThreshold: 1, failureThreshold:3}, readinessProbe:{initialDelaySeconds: 1, timeoutSeconds: 1, periodSeconds: 10, successThreshold: 1, failureThreshold:3}} RedisLeader RedisLeader `json:"redisLeader,omitempty"` // +kubebuilder:default:={livenessProbe:{initialDelaySeconds: 1, timeoutSeconds: 1, periodSeconds: 10, successThreshold: 1, failureThreshold:3}, readinessProbe:{initialDelaySeconds: 1, timeoutSeconds: 1, periodSeconds: 10, successThreshold: 1, failureThreshold:3}} @@ -58,8 +60,10 @@ type RedisLeader struct { RedisConfig *RedisConfig `json:"redisConfig,omitempty"` Affinity *corev1.Affinity `json:"affinity,omitempty"` PodDisruptionBudget *RedisPodDisruptionBudget `json:"pdb,omitempty"` - ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"` - LivenessProbe *Probe `json:"livenessProbe,omitempty" protobuf:"bytes,11,opt,name=livenessProbe"` + // +kubebuilder:default:={initialDelaySeconds: 1, timeoutSeconds: 1, periodSeconds: 10, successThreshold: 1, failureThreshold:3} + ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"` + // +kubebuilder:default:={initialDelaySeconds: 1, timeoutSeconds: 1, periodSeconds: 10, successThreshold: 1, failureThreshold:3} + LivenessProbe *Probe `json:"livenessProbe,omitempty" protobuf:"bytes,11,opt,name=livenessProbe"` } // RedisFollower interface will have the redis follower configuration @@ -68,8 +72,10 @@ type RedisFollower struct { RedisConfig *RedisConfig `json:"redisConfig,omitempty"` Affinity *corev1.Affinity `json:"affinity,omitempty"` PodDisruptionBudget *RedisPodDisruptionBudget `json:"pdb,omitempty"` - ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"` - LivenessProbe *Probe `json:"livenessProbe,omitempty" protobuf:"bytes,11,opt,name=livenessProbe"` + // +kubebuilder:default:={initialDelaySeconds: 1, timeoutSeconds: 1, periodSeconds: 10, successThreshold: 1, failureThreshold:3} + ReadinessProbe *Probe `json:"readinessProbe,omitempty" protobuf:"bytes,11,opt,name=readinessProbe"` + // +kubebuilder:default:={initialDelaySeconds: 1, timeoutSeconds: 1, periodSeconds: 10, successThreshold: 1, failureThreshold:3} + LivenessProbe *Probe `json:"livenessProbe,omitempty" protobuf:"bytes,11,opt,name=livenessProbe"` } // RedisClusterStatus defines the observed state of RedisCluster diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go index 9ae16c08d819b3b67bcc2797b7741ecbfce45435..f8d062a2cd1f7987b215ba09dd3dec111b215167 100644 --- a/api/v1beta1/zz_generated.deepcopy.go +++ b/api/v1beta1/zz_generated.deepcopy.go @@ -195,6 +195,11 @@ func (in *RedisClusterSpec) DeepCopyInto(out *RedisClusterSpec) { **out = **in } in.KubernetesConfig.DeepCopyInto(&out.KubernetesConfig) + if in.ClusterVersion != nil { + in, out := &in.ClusterVersion, &out.ClusterVersion + *out = new(string) + **out = **in + } in.RedisLeader.DeepCopyInto(&out.RedisLeader) in.RedisFollower.DeepCopyInto(&out.RedisFollower) if in.RedisExporter != nil { diff --git a/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml b/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml index 78486b846db8e16a6e8e9899716b6041c4049cef..05c1c7577b4675f2d2415a5b73f258f6df39fcc4 100644 --- a/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml +++ b/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml @@ -130,6 +130,9 @@ spec: clusterSize: format: int32 type: integer + clusterVersion: + default: v7 + type: string kubernetesConfig: description: KubernetesConfig will be the JSON struct for Basic Redis Config @@ -1232,6 +1235,12 @@ spec: type: object type: object livenessProbe: + default: + failureThreshold: 3 + initialDelaySeconds: 1 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 description: Probe is a interface for ReadinessProbe and LivenessProbe properties: failureThreshold: @@ -1274,6 +1283,12 @@ spec: type: integer type: object readinessProbe: + default: + failureThreshold: 3 + initialDelaySeconds: 1 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 description: Probe is a interface for ReadinessProbe and LivenessProbe properties: failureThreshold: @@ -2195,6 +2210,12 @@ spec: type: object type: object livenessProbe: + default: + failureThreshold: 3 + initialDelaySeconds: 1 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 description: Probe is a interface for ReadinessProbe and LivenessProbe properties: failureThreshold: @@ -2237,6 +2258,12 @@ spec: type: integer type: object readinessProbe: + default: + failureThreshold: 3 + initialDelaySeconds: 1 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 description: Probe is a interface for ReadinessProbe and LivenessProbe properties: failureThreshold: diff --git a/docs/src/guide/README.md b/docs/src/guide/README.md index 0d128ab63e80ad2363abbaffb785d5e5f8702684..c170bfc5e5c70724ef1fa861d4f7ffb7a7ac0ef5 100755 --- a/docs/src/guide/README.md +++ b/docs/src/guide/README.md @@ -29,6 +29,7 @@ Here the features which are supported by this operator:- - Tolerations - SecurityContext - Storage + - ServiceAccount ## Architecture diff --git a/docs/src/guide/changelog.md b/docs/src/guide/changelog.md index 84f01dadf63e275f31cedb1322a3d64a4c0d388e..52ecb7660ffc1eecd0d5f5c4ddd87046b3e4e630 100644 --- a/docs/src/guide/changelog.md +++ b/docs/src/guide/changelog.md @@ -1,3 +1,33 @@ +### v0.12.0 +##### October 12, 2022 + +**:beetle: Bug Fixes** + +- PDB (Pod disruption budget) creation issue +- Fixed cluster recovery logic +- Fixed IP check and conversion logic +- Persistence issue fix + +**:tada: Features** + +- Added pvc, pv clusterrole fix +- Support for defining serviceAccount +- Closing of redis client connection +- Added finalizer for statefulset +- Added Prometheus service annotation +- Added support for Redis 7 with DNS hostname + +### v0.11.0 +**July 5, 2022** + +**:beetle: Bug Fixes** + +- Fix Redis cluster and Redis CRD +- Fixed TLS authentication between redis cluster +- Fixed RBAC policy for PDB +- Redis exporter exception handled +- External service fix + ### v0.10.0 **January 26, 2022** diff --git a/docs/src/guide/failover.md b/docs/src/guide/failover.md index 0d84b73c92cd71c83393f68191e6eef63cbac2ef..d3c5b2d164ad6ae0f3bbca72d98f9def63ff2973 100644 --- a/docs/src/guide/failover.md +++ b/docs/src/guide/failover.md @@ -3,11 +3,11 @@ Before failover testing, we have to write some dummy data inside the Redis cluster, we can write the dummy data using the `redis-cli`. ```shell -$ kubectl exec -it redis-leader-0 -n redis-operator \ +$ kubectl exec -it redis-leader-0 -n ot-operators \ -- redis-cli -a Opstree@1234 -c set tony stark ... Defaulting container name to redis-leader. -Use 'kubectl describe pod/redis-leader-0 -n redis-operator' to see all of the containers in this pod. +Use 'kubectl describe pod/redis-leader-0 -n ot-operatorsr' to see all of the containers in this pod. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. OK ``` @@ -15,10 +15,10 @@ OK Verify the key has been inserted properly by fetching its value. ```shell -$ kubectl exec -it redis-leader-0 -n redis-operator \ +$ kubectl exec -it redis-leader-0 -n ot-operators \ -- redis-cli -a Opstree@1234 -c get tony ... -Use 'kubectl describe pod/redis-leader-0 -n redis-operator' to see all of the containers in this pod. +Use 'kubectl describe pod/redis-leader-0 -n ot-operators' to see all of the containers in this pod. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. "stark" ``` @@ -26,7 +26,7 @@ Warning: Using a password with '-a' or '-u' option on the command line interface Let’s restart the pod name `redis-leader-0` and see the redis node behavior. ```shell -$ kubectl delete pod redis-leader-0 -n redis-operator +$ kubectl delete pod redis-leader-0 -n ot-operators ... pod "redis-leader-0" deleted ``` @@ -34,11 +34,11 @@ pod "redis-leader-0" deleted Now we can again try to list redis cluster nodes from `redis-leader-0` pod and from some other pod as well like:- `redis-follower-2` ```shell -$ kubectl exec -it redis-leader-0 -n redis-operator \ +$ kubectl exec -it redis-leader-0 -n ot-operators \ -- redis-cli -a Opstree@1234 cluster nodes ... Defaulting container name to redis-leader. -Use 'kubectl describe pod/redis-leader-0 -n redis-operator' to see all of the containers in this pod. +Use 'kubectl describe pod/redis-leader-0 -n ot-operators' to see all of the containers in this pod. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. eef84b7dada737051c32d592bd66652b9af0cb35 10.42.2.184:6379@16379 slave 0a36dc5064b0a61afa8bd850e93ff0a1c2267704 0 1619958171517 3 connected a7c424b5ec0e696aa7be15a691846c8820e48cd1 10.42.1.181:6379@16379 master - 0 1619958172520 4 connected 0-5460 @@ -50,14 +50,14 @@ a7c424b5ec0e696aa7be15a691846c8820e48cd1 10.42.1.181:6379@16379 master - 0 16199 So if you notice the output of cluster nodes command, the node IP is updated and it’s connected as a leader. -Let's try to get value of key from some other pod +Let's try to get value of key from some other pods ```shell -$ kubectl exec -it redis-follower-1 -n redis-operator \ +$ kubectl exec -it redis-follower-1 -n ot-operators \ -- redis-cli -a Opstree@1234 -c get tony ... Defaulting container name to redis-follower. -Use 'kubectl describe pod/redis-follower-1 -n redis-operator' to see all of the containers in this pod. +Use 'kubectl describe pod/redis-follower-1 -n ot-operators' to see all of the containers in this pod. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. "stark" ``` diff --git a/docs/src/guide/installation.md b/docs/src/guide/installation.md index 440f552237b448c503878b3e65c409e71ef51248..2737af0d11425432b5f948d1bbfb38352c60e3d6 100644 --- a/docs/src/guide/installation.md +++ b/docs/src/guide/installation.md @@ -13,12 +13,12 @@ The easiest way to install a redis operator is using Helm chart. The operator he ```shell $ helm repo add ot-helm https://ot-container-kit.github.io/helm-charts/ $ helm upgrade redis-operator ot-helm/redis-operator \ - --install --namespace redis-operator + --install --namespace ot-operators ... Release "redis-operator" does not exist. Installing it now. NAME: redis-operator LAST DEPLOYED: Sun May 2 14:42:23 2021 -NAMESPACE: redis-operator +NAMESPACE: ot-operators STATUS: deployed REVISION: 1 TEST SUITE: None @@ -27,7 +27,7 @@ TEST SUITE: None Check the state of the pod is running or not. ```shell -$ kubectl get pods -n redis-operator +$ kubectl get pods -n ot-operators ... NAME READY STATUS RESTARTS AGE redis-operator-74b6cbf5c5-td8t7 1/1 Running 0 2m11s diff --git a/docs/src/guide/redis-cluster-config.md b/docs/src/guide/redis-cluster-config.md index e0a197e4bb4514c4b48004ed5f2d01795996cb72..6ad0c33c5ca55ee90cb2b0aa2c81e194d16690b3 100644 --- a/docs/src/guide/redis-cluster-config.md +++ b/docs/src/guide/redis-cluster-config.md @@ -13,36 +13,38 @@ In this configuration section, we have these configuration parameters:- ## Helm Parameters -|**Name**|**Default Value**|**Description**| -|--------|-----------------|---------------| -|`imagePullSecrets` | [] | List of image pull secrets, in case redis image is getting pull from private registry | -|`redisCluster.clusterSize` | 3 | Size of the redis cluster leader and follower nodes | -|`redisCluster.secretName` | redis-secret | Name of the existing secret in Kubernetes | -|`redisCluster.secretKey` | password | Name of the existing secret key in Kubernetes | -|`redisCluster.image` | quay.io/opstree/redis | Name of the redis image | -|`redisCluster.tag` | v6.2 | Tag of the redis image | -|`redisCluster.imagePullPolicy` | IfNotPresent | Image Pull Policy of the redis image | -|`redisCluster.leader.affinity` | {} | Affinity for node and pods for redis leader statefulset | -|`redisCluster.follower.affinity` | {} | Affinity for node and pods for redis follower statefulset | -|`externalService.enabled`| false | If redis service needs to be exposed using LoadBalancer or NodePort | -|`externalService.annotations`| {} | Kubernetes service related annotations | -|`externalService.serviceType` | NodePort | Kubernetes service type for exposing service, values - ClusterIP, NodePort, and LoadBalancer | -|`externalService.port` | 6379 | Port number on which redis external service should be exposed | -|`serviceMonitor.enabled` | false | Servicemonitor to monitor redis with Prometheus | -|`serviceMonitor.interval` | 30s | Interval at which metrics should be scraped. | -|`serviceMonitor.scrapeTimeout` | 10s | Timeout after which the scrape is ended | -|`serviceMonitor.namespace` | monitoring | Namespace in which Prometheus operator is running | -|`redisExporter.enabled` | true | Redis exporter should be deployed or not | -|`redisExporter.image` | quay.io/opstree/redis-exporter | Name of the redis exporter image | -|`redisExporter.tag` | v6.2 | Tag of the redis exporter image | -|`redisExporter.imagePullPolicy` | IfNotPresent | Image Pull Policy of the redis exporter image | -|`redisExporter.env` | [] | Extra environment variables which needs to be added in redis exporter| -|`nodeSelector` | {} | NodeSelector for redis statefulset | -|`priorityClassName`| "" | Priority class name for the redis statefulset | -|`storageSpec` | {} | Storage configuration for redis setup | -|`securityContext` | {} | Security Context for redis pods for changing system or kernel level parameters | -|`tolerations` | [] | Tolerations for redis statefulset | -|`sidecars` | [] | Sidecar for redis pods +| **Name** | **Default Value** | **Description** | +|------------------------------------|--------------------------------|-----------------------------------------------------------------------------------------------| +| `imagePullSecrets` | [] | List of image pull secrets, in case redis image is getting pull from private registry | +| `redisCluster.clusterSize` | 3 | Size of the redis cluster leader and follower nodes | +| `redisCluster.clusterVersion` | v7 | Major version of Redis setup, values can be v6 or v7 | +| `redisCluster.persistenceEnabled` | true | Persistence should be enabled or not in the Redis cluster setup | +| `redisCluster.secretName` | redis-secret | Name of the existing secret in Kubernetes | +| `redisCluster.secretKey` | password | Name of the existing secret key in Kubernetes | +| `redisCluster.image` | quay.io/opstree/redis | Name of the redis image | +| `redisCluster.tag` | v6.2 | Tag of the redis image | +| `redisCluster.imagePullPolicy` | IfNotPresent | Image Pull Policy of the redis image | +| `redisCluster.leader.affinity` | {} | Affinity for node and pods for redis leader statefulset | +| `redisCluster.follower.affinity` | {} | Affinity for node and pods for redis follower statefulset | +| `externalService.enabled` | false | If redis service needs to be exposed using LoadBalancer or NodePort | +| `externalService.annotations` | {} | Kubernetes service related annotations | +| `externalService.serviceType` | NodePort | Kubernetes service type for exposing service, values - ClusterIP, NodePort, and LoadBalancer | +| `externalService.port` | 6379 | Port number on which redis external service should be exposed | +| `serviceMonitor.enabled` | false | Servicemonitor to monitor redis with Prometheus | +| `serviceMonitor.interval` | 30s | Interval at which metrics should be scraped. | +| `serviceMonitor.scrapeTimeout` | 10s | Timeout after which the scrape is ended | +| `serviceMonitor.namespace` | monitoring | Namespace in which Prometheus operator is running | +| `redisExporter.enabled` | true | Redis exporter should be deployed or not | +| `redisExporter.image` | quay.io/opstree/redis-exporter | Name of the redis exporter image | +| `redisExporter.tag` | v6.2 | Tag of the redis exporter image | +| `redisExporter.imagePullPolicy` | IfNotPresent | Image Pull Policy of the redis exporter image | +| `redisExporter.env` | [] | Extra environment variables which needs to be added in redis exporter | +| `nodeSelector` | {} | NodeSelector for redis statefulset | +| `priorityClassName` | "" | Priority class name for the redis statefulset | +| `storageSpec` | {} | Storage configuration for redis setup | +| `securityContext` | {} | Security Context for redis pods for changing system or kernel level parameters | +| `tolerations` | [] | Tolerations for redis statefulset | +| `sidecars` | [] | Sidecar for redis pods | # CRD Parameters @@ -53,14 +55,40 @@ These are the CRD Parameters which is currently supported by Redis Exporter for `clusterSize` is size of the Redis leader and follower nodes. ```yaml +spec: clusterSize: 3 ``` +**clusterVersion** + +`clusterVersion` is a paramter through which we can control Redis major values. The possible values are:- + +- v6 +- v7 + +```yaml +spec: + clusterVersion: v7 +``` + +**persistenceEnabled** + +`persistenceEnabled` is a configuration parameter to enable the persistence storage in redis cluster. The possible values are:- + +- true +- false + +```yaml +spec: + persistenceEnabled: true +``` + **redisLeader** `redisLeader` is the field for Redis leader related configurations. ```yaml +spec: redisLeader: redisConfig: additionalRedisConfig: redis-external-config @@ -80,6 +108,7 @@ These are the CRD Parameters which is currently supported by Redis Exporter for `redisFollower` is the field for Redis follower related configurations. ```yaml +spec: redisFollower: redisConfig: additionalRedisConfig: redis-external-config @@ -99,6 +128,7 @@ These are the CRD Parameters which is currently supported by Redis Exporter for In the `kubernetesConfig` section, we define configuration related to Kubernetes. ```yaml +spec: kubernetesConfig: image: quay.io/opstree/redis:v6.2 imagePullPolicy: IfNotPresent @@ -122,6 +152,7 @@ In the `kubernetesConfig` section, we define configuration related to Kubernetes `redisExporter` configuration which enable the metrics for Redis Database to get monitored by Prometheus. ```yaml +spec: redisExporter: enabled: true image: quay.io/opstree/redis-exporter:1.0 @@ -153,6 +184,7 @@ In the `kubernetesConfig` section, we define configuration related to Kubernetes `storage` configuration for Redis Statefulset pods. ```yaml +spec: storage: volumeClaimTemplate: spec: @@ -168,7 +200,8 @@ In the `kubernetesConfig` section, we define configuration related to Kubernetes Name of the Kubernetes priority class which you want to associate with redis setup. ```yaml -priorityClassName: priority-100 +spec: + priorityClassName: priority-100 ``` **nodeSelector** @@ -176,6 +209,7 @@ priorityClassName: priority-100 Map of the labels which you want to use as nodeSelector. ```yaml +spec: nodeSelector: kubernetes.io/hostname: minikube ``` @@ -185,8 +219,10 @@ Map of the labels which you want to use as nodeSelector. Kubernetes security context for redis pods. ```yaml +spec: securityContext: runAsUser: 1000 + fsGroup: 1000 ``` **tolerations** @@ -194,6 +230,7 @@ Kubernetes security context for redis pods. Tolerations for nodes and pods in Kubernetes. ```yaml +spec: tolerations: - key: "key1" operator: "Equal" @@ -206,6 +243,7 @@ Tolerations for nodes and pods in Kubernetes. Sidecars for redis pods ```yaml +spec: sidecars: - name: "sidecar1" image: "image:1.0" @@ -227,6 +265,7 @@ Sidecars for redis pods PodDisruptionBugets for redis cluster pods ```yaml +spec: pdb: enabled: true maxUnavailable: 1 @@ -240,21 +279,14 @@ Probes for redis leader and follower pods ```yaml # redisFollower: # redisLeader: +spec: readinessProbe: - exec: - command: - - bash - - /usr/bin/healthcheck.sh failureThreshold: 5 initialDelaySeconds: 15 periodSeconds: 15 successThreshold: 1 timeoutSeconds: 5 livenessProbe: - exec: - command: - - bash - - /usr/bin/healthcheck.sh failureThreshold: 5 initialDelaySeconds: 15 periodSeconds: 15 @@ -267,10 +299,11 @@ Probes for redis leader and follower pods TLS configuration for redis cluster ```yaml +spec: TLS: ca: ca.key cert: tls.crt key: tls.key secret: secretName: sample-cert -``` \ No newline at end of file +``` diff --git a/docs/src/guide/redis-config.md b/docs/src/guide/redis-config.md index 41c25cc338d111b53cec20c6e7387bc56b5233a6..bcd57c4b7018864bd11497090335af7e780e3a8f 100644 --- a/docs/src/guide/redis-config.md +++ b/docs/src/guide/redis-config.md @@ -13,35 +13,35 @@ In this configuration section, we have these configuration parameters:- # Helm Parameters -|**Name**|**Value**|**Description**| -|--------|-----------------|-------| -|`imagePullSecrets` | [] | List of image pull secrets, in case redis image is getting pull from private registry | -|`redisStandalone.secretName` | redis-secret | Name of the existing secret in Kubernetes | -|`redisStandalone.secretKey` | password | Name of the existing secret key in Kubernetes | -|`redisStandalone.image` | quay.io/opstree/redis | Name of the redis image | -|`redisStandalone.tag` | v6.2 | Tag of the redis image | -|`redisStandalone.imagePullPolicy` | IfNotPresent | Image Pull Policy of the redis image | -|`redisStandalone.resources` | {} | Request and limits for redis statefulset | -|`externalService.enabled`| false | If redis service needs to be exposed using LoadBalancer or NodePort | -|`externalService.annotations`| {} | Kubernetes service related annotations | -|`externalService.serviceType` | NodePort | Kubernetes service type for exposing service, values - ClusterIP, NodePort, and LoadBalancer | -|`externalService.port` | 6379 | Port number on which redis external service should be exposed | -|`serviceMonitor.enabled` | false | Servicemonitor to monitor redis with Prometheus | -|`serviceMonitor.interval` | 30s | Interval at which metrics should be scraped. | -|`serviceMonitor.scrapeTimeout` | 10s | Timeout after which the scrape is ended | -|`serviceMonitor.namespace` | monitoring | Namespace in which Prometheus operator is running | -|`redisExporter.enabled` | true | Redis exporter should be deployed or not | -|`redisExporter.image` | quay.io/opstree/redis-exporter | Name of the redis exporter image | -|`redisExporter.tag` | v6.2 | Tag of the redis exporter image | -|`redisExporter.imagePullPolicy` | IfNotPresent | Image Pull Policy of the redis exporter image | -|`redisExporter.env` | [] | Extra environment variables which needs to be added in redis exporter| -|`nodeSelector` | {} | NodeSelector for redis statefulset | -|`priorityClassName`| "" | Priority class name for the redis statefulset | -|`storageSpec` | {} | Storage configuration for redis setup | -|`securityContext` | {} | Security Context for redis pods for changing system or kernel level parameters | -|`affinity` | {} | Affinity for node and pod for redis statefulset | -|`tolerations` | [] | Tolerations for redis statefulset | -|`sidecars` | [] | Sidecar for redis pods +| **Name** | **Value** | **Description** | +|-----------------------------------|--------------------------------|----------------------------------------------------------------------------------------------| +| `imagePullSecrets` | [] | List of image pull secrets, in case redis image is getting pull from private registry | +| `redisStandalone.secretName` | redis-secret | Name of the existing secret in Kubernetes | +| `redisStandalone.secretKey` | password | Name of the existing secret key in Kubernetes | +| `redisStandalone.image` | quay.io/opstree/redis | Name of the redis image | +| `redisStandalone.tag` | v6.2 | Tag of the redis image | +| `redisStandalone.imagePullPolicy` | IfNotPresent | Image Pull Policy of the redis image | +| `redisStandalone.resources` | {} | Request and limits for redis statefulset | +| `externalService.enabled` | false | If redis service needs to be exposed using LoadBalancer or NodePort | +| `externalService.annotations` | {} | Kubernetes service related annotations | +| `externalService.serviceType` | NodePort | Kubernetes service type for exposing service, values - ClusterIP, NodePort, and LoadBalancer | +| `externalService.port` | 6379 | Port number on which redis external service should be exposed | +| `serviceMonitor.enabled` | false | Servicemonitor to monitor redis with Prometheus | +| `serviceMonitor.interval` | 30s | Interval at which metrics should be scraped. | +| `serviceMonitor.scrapeTimeout` | 10s | Timeout after which the scrape is ended | +| `serviceMonitor.namespace` | monitoring | Namespace in which Prometheus operator is running | +| `redisExporter.enabled` | true | Redis exporter should be deployed or not | +| `redisExporter.image` | quay.io/opstree/redis-exporter | Name of the redis exporter image | +| `redisExporter.tag` | v6.2 | Tag of the redis exporter image | +| `redisExporter.imagePullPolicy` | IfNotPresent | Image Pull Policy of the redis exporter image | +| `redisExporter.env` | [] | Extra environment variables which needs to be added in redis exporter | +| `nodeSelector` | {} | NodeSelector for redis statefulset | +| `priorityClassName` | "" | Priority class name for the redis statefulset | +| `storageSpec` | {} | Storage configuration for redis setup | +| `securityContext` | {} | Security Context for redis pods for changing system or kernel level parameters | +| `affinity` | {} | Affinity for node and pod for redis statefulset | +| `tolerations` | [] | Tolerations for redis statefulset | +| `sidecars` | [] | Sidecar for redis pods | # CRD Parameters @@ -52,6 +52,7 @@ These are the CRD Parameters which is currently supported by Redis Exporter for In the `kubernetesConfig` section, we define configuration related to Kubernetes. ```yaml +spec: kubernetesConfig: image: quay.io/opstree/redis:v6.2 imagePullPolicy: IfNotPresent @@ -75,6 +76,7 @@ In the `kubernetesConfig` section, we define configuration related to Kubernetes `redisExporter` configuration which enable the metrics for Redis Database to get monitored by Prometheus. ```yaml +spec: redisExporter: enabled: true image: quay.io/opstree/redis-exporter:1.0 @@ -106,6 +108,7 @@ In the `kubernetesConfig` section, we define configuration related to Kubernetes `storage` configuration for Redis Statefulset pods. ```yaml +spec: storage: volumeClaimTemplate: spec: @@ -121,7 +124,8 @@ In the `kubernetesConfig` section, we define configuration related to Kubernetes Name of the Kubernetes priority class which you want to associate with redis setup. ```yaml -priorityClassName: priority-100 +spec: + priorityClassName: priority-100 ``` **nodeSelector** @@ -129,6 +133,7 @@ priorityClassName: priority-100 Map of the labels which you want to use as nodeSelector. ```yaml +spec: nodeSelector: kubernetes.io/hostname: minikube ``` @@ -138,6 +143,7 @@ Map of the labels which you want to use as nodeSelector. Kubernetes security context for redis pods. ```yaml +spec: securityContext: runAsUser: 1000 ``` @@ -147,6 +153,7 @@ Kubernetes security context for redis pods. Affinity for node and pod for redis setup. ```yaml +spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: @@ -163,6 +170,7 @@ Affinity for node and pod for redis setup. Tolerations for nodes and pods in Kubernetes. ```yaml +spec: tolerations: - key: "key1" operator: "Equal" @@ -175,6 +183,7 @@ Tolerations for nodes and pods in Kubernetes. Sidecars for redis pods ```yaml +spec: sidecars: - name: "sidecar1" image: "image:1.0" @@ -196,6 +205,7 @@ Sidecars for redis pods PodDisruptionBugets for redis standalone pods ```yaml +spec: pdb: enabled: true maxUnavailable: 1 @@ -207,21 +217,14 @@ PodDisruptionBugets for redis standalone pods Probes for redis standalone pods ```yaml +spec: readinessProbe: - exec: - command: - - bash - - /usr/bin/healthcheck.sh failureThreshold: 5 initialDelaySeconds: 15 periodSeconds: 15 successThreshold: 1 timeoutSeconds: 5 livenessProbe: - exec: - command: - - bash - - /usr/bin/healthcheck.sh failureThreshold: 5 initialDelaySeconds: 15 periodSeconds: 15 @@ -234,10 +237,11 @@ Probes for redis standalone pods TLS configuration for redis standalone ```yaml +spec: TLS: ca: ca.key cert: tls.crt key: tls.key secret: secretName: sample-cert -``` \ No newline at end of file +``` diff --git a/example/advance_config/cluster.yaml b/example/advance_config/clusterd.yaml similarity index 76% rename from example/advance_config/cluster.yaml rename to example/advance_config/clusterd.yaml index 6df69180a56a23cd8ddc93d573c4c0a9c7fc75f2..305a13c19826674582a6ba0ca23befd352eed7c2 100644 --- a/example/advance_config/cluster.yaml +++ b/example/advance_config/clusterd.yaml @@ -5,9 +5,13 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 - imagePullPolicy: IfNotPresent + image: quay.io/opstree/redis:v7.0.5 resources: requests: cpu: 101m @@ -19,7 +23,7 @@ spec: - name: regcred redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 storage: volumeClaimTemplate: spec: diff --git a/example/advance_config/standalone.yaml b/example/advance_config/standalone.yaml index 0056bbd7df88a0af93bdc1a92de0110def829ca4..e7662515431e0ab77e81182e93afe1a2089bd2cf 100644 --- a/example/advance_config/standalone.yaml +++ b/example/advance_config/standalone.yaml @@ -5,7 +5,7 @@ metadata: name: redis-standalone spec: kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent resources: requests: @@ -14,6 +14,9 @@ spec: limits: cpu: 101m memory: 128Mi + securityContext: + runAsUser: 1000 + fsGroup: 1000 storage: volumeClaimTemplate: spec: @@ -24,7 +27,7 @@ spec: storage: 1Gi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 # nodeSelector: {} # securityContext: {} # priorityClassName: "" diff --git a/example/affinity/cluster.yaml b/example/affinity/clusterd.yaml similarity index 83% rename from example/affinity/cluster.yaml rename to example/affinity/clusterd.yaml index 3134932de25efdf50c45ce03f4439a4ba05f344a..3d9de93727e602dd1c9fc2d1f950283813b8aae7 100644 --- a/example/affinity/cluster.yaml +++ b/example/affinity/clusterd.yaml @@ -5,19 +5,17 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 redisLeader: affinity: podAntiAffinity: diff --git a/example/affinity/standalone.yaml b/example/affinity/standalone.yaml index 77d13ce462f931553cecd6dc199ef79825f8c2be..e5703a51cb292bc338d877da5ccd6e631ef81635 100644 --- a/example/affinity/standalone.yaml +++ b/example/affinity/standalone.yaml @@ -5,15 +5,11 @@ metadata: name: redis-standalone spec: kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi + securityContext: + runAsUser: 1000 + fsGroup: 1000 storage: volumeClaimTemplate: spec: @@ -24,7 +20,7 @@ spec: storage: 1Gi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: diff --git a/example/disruption_budget/clusterd.yaml b/example/disruption_budget/clusterd.yaml index 78dc98475de3861c6797867ff52398f84c9244da..2059162adcfa54518697ebef5d6e2f8589b5e239 100644 --- a/example/disruption_budget/clusterd.yaml +++ b/example/disruption_budget/clusterd.yaml @@ -5,19 +5,17 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true kubernetesConfig: - image: "quay.io/opstree/redis:v6.2.5" + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - limits: - cpu: 101m - memory: 128Mi - requests: - cpu: 101m - memory: 128Mi redisExporter: enabled: false - image: "quay.io/opstree/redis-exporter:1.0" + image: "quay.io/opstree/redis-exporter:v1.44.0" redisFollower: affinity: podAntiAffinity: diff --git a/example/eks-cluster.yaml b/example/eks-cluster.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b9f0547d7cb20035445fc5aa6d2a6ca9f0c3512e --- /dev/null +++ b/example/eks-cluster.yaml @@ -0,0 +1,14 @@ +apiVersion: eksctl.io/v1alpha5 +kind: ClusterConfig +metadata: + name: operator-testing + region: us-west-2 + version: "1.22" +nodeGroups: + - name: ng-1 + instanceType: t3a.medium + desiredCapacity: 3 + volumeSize: 30 + ssh: + allow: true + volumeType: gp3 diff --git a/example/external_config/cluster.yaml b/example/external_config/clusterd.yaml similarity index 73% rename from example/external_config/cluster.yaml rename to example/external_config/clusterd.yaml index e5807660730b62b46d98bd213626630a002e46bb..a546cc114a024be7746143f60ad932a7ae3826b3 100644 --- a/example/external_config/cluster.yaml +++ b/example/external_config/clusterd.yaml @@ -5,19 +5,17 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 redisLeader: redisConfig: additionalRedisConfig: redis-external-config diff --git a/example/external_config/standalone.yaml b/example/external_config/standalone.yaml index c1a8a2f1c00da55e7da13c68e9c9b5bad5482267..94ea818314a59e5da63f239a9471a81642a6da50 100644 --- a/example/external_config/standalone.yaml +++ b/example/external_config/standalone.yaml @@ -7,15 +7,11 @@ spec: redisConfig: additionalRedisConfig: redis-external-config kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi + securityContext: + runAsUser: 1000 + fsGroup: 1000 storage: volumeClaimTemplate: spec: @@ -26,4 +22,4 @@ spec: storage: 1Gi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 diff --git a/example/external_service/cluster.yaml b/example/external_service/clusterd.yaml similarity index 65% rename from example/external_service/cluster.yaml rename to example/external_service/clusterd.yaml index a9054afb5c878cb99aabd89477be8623451d89ed..26b89a8fb8ee07248d772fe176c07929c643ca7a 100644 --- a/example/external_service/cluster.yaml +++ b/example/external_service/clusterd.yaml @@ -5,19 +5,17 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 storage: volumeClaimTemplate: spec: diff --git a/example/external_service/standalone.yaml b/example/external_service/standalone.yaml index 184476fd56f3ebf9ee498b204734558e62879789..bfc4ff9742d7fa339a1c44be3f7bc332181951ae 100644 --- a/example/external_service/standalone.yaml +++ b/example/external_service/standalone.yaml @@ -5,15 +5,11 @@ metadata: name: redis-standalone spec: kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi + securityContext: + runAsUser: 1000 + fsGroup: 1000 storage: volumeClaimTemplate: spec: @@ -24,4 +20,4 @@ spec: storage: 1Gi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 diff --git a/example/password_protected/cluster.yaml b/example/password_protected/clusterd.yaml similarity index 68% rename from example/password_protected/cluster.yaml rename to example/password_protected/clusterd.yaml index ad90046b1c41b1b6ff70eb376c07bb9da35e517e..a978fdfe8f4863c87512f9ae653ed4d8138ebc92 100644 --- a/example/password_protected/cluster.yaml +++ b/example/password_protected/clusterd.yaml @@ -5,22 +5,20 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi redisSecret: name: redis-secret key: password redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 storage: volumeClaimTemplate: spec: diff --git a/example/password_protected/standalone.yaml b/example/password_protected/standalone.yaml index 424c98eb5f23517236176628bb8e9a9350d72e9b..8be97ea57aabc24942aca05e0ed29138a9e83ba0 100644 --- a/example/password_protected/standalone.yaml +++ b/example/password_protected/standalone.yaml @@ -5,15 +5,8 @@ metadata: name: redis-standalone spec: kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi redisSecret: name: redis-secret key: password @@ -27,4 +20,7 @@ spec: storage: 1Gi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 + securityContext: + runAsUser: 1000 + fsGroup: 1000 diff --git a/example/private_registry/cluster.yaml b/example/private_registry/clusterd.yaml similarity index 67% rename from example/private_registry/cluster.yaml rename to example/private_registry/clusterd.yaml index 74ee7c71565a968870f30421a4adfaf4547a7bf0..3e41c0caade4e443f560f8a67d559c42de03c2b6 100644 --- a/example/private_registry/cluster.yaml +++ b/example/private_registry/clusterd.yaml @@ -5,21 +5,19 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi imagePullSecrets: - name: regcred redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 storage: volumeClaimTemplate: spec: diff --git a/example/private_registry/standalone.yaml b/example/private_registry/standalone.yaml index 578383c1d2a52b4fe69fba03d5d9f047c92efdbb..dc1d640b62edb3953b83ce8d83b503d1c8e47a7e 100644 --- a/example/private_registry/standalone.yaml +++ b/example/private_registry/standalone.yaml @@ -5,15 +5,8 @@ metadata: name: redis-standalone spec: kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi imagePullSecrets: - name: regcred storage: @@ -26,4 +19,7 @@ spec: storage: 1Gi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 + securityContext: + runAsUser: 1000 + fsGroup: 1000 diff --git a/example/probes/clusterd.yaml b/example/probes/clusterd.yaml index 229fe1741c490f87c26023e498a84c127f04b4d7..9c2992d88df1891bc4b4b3ec1963a87dc8abd563 100644 --- a/example/probes/clusterd.yaml +++ b/example/probes/clusterd.yaml @@ -5,35 +5,24 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi + image: quay.io/opstree/redis:v7.0.5 redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 redisLeader: readinessProbe: - exec: - command: - - bash - - /usr/bin/healthcheck.sh failureThreshold: 5 initialDelaySeconds: 15 periodSeconds: 15 successThreshold: 1 timeoutSeconds: 5 livenessProbe: - exec: - command: - - bash - - /usr/bin/healthcheck.sh failureThreshold: 5 initialDelaySeconds: 15 periodSeconds: 15 diff --git a/example/probes/standalone.yaml b/example/probes/standalone.yaml index 22c671560322526ebbf7bbc469561c779c87df5a..70797aced7fbe0b910232876598c4be0a99d72f1 100644 --- a/example/probes/standalone.yaml +++ b/example/probes/standalone.yaml @@ -4,16 +4,12 @@ kind: Redis metadata: name: redis-standalone spec: + securityContext: + runAsUser: 1000 + fsGroup: 1000 kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi storage: volumeClaimTemplate: spec: @@ -24,7 +20,7 @@ spec: storage: 1Gi redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 readinessProbe: failureThreshold: 5 initialDelaySeconds: 15 diff --git a/example/redis-cluster.yaml b/example/redis-cluster.yaml index dd7a5697b2163f9a51dec87ef4071457e86d667c..148c4f74b304d3463b5d0c0215a6587e1ec6f386 100644 --- a/example/redis-cluster.yaml +++ b/example/redis-cluster.yaml @@ -5,8 +5,13 @@ metadata: name: redis-cluster spec: clusterSize: 3 + clusterVersion: v7 + persistenceEnabled: true + securityContext: + runAsUser: 1000 + fsGroup: 1000 kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent resources: requests: @@ -22,7 +27,7 @@ spec: # - name: regcred redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 imagePullPolicy: Always resources: requests: @@ -45,12 +50,12 @@ spec: # secretKeyRef: # name: mysecret # key: username - redisLeader: - redisConfig: - additionalRedisConfig: redis-external-config - redisFollower: - redisConfig: - additionalRedisConfig: redis-external-config +# redisLeader: +# redisConfig: +# additionalRedisConfig: redis-external-config +# redisFollower: +# redisConfig: +# additionalRedisConfig: redis-external-config storage: volumeClaimTemplate: spec: @@ -61,7 +66,6 @@ spec: storage: 1Gi # nodeSelector: # kubernetes.io/hostname: minikube - # securityContext: {} # priorityClassName: # Affinity: # Tolerations: [] diff --git a/example/redis-standalone.yaml b/example/redis-standalone.yaml index 21ee243eaefd8fc99be4dba02c5dc577a44a1008..00340ed64a8bdd9b44e42525ba0da423b865373d 100644 --- a/example/redis-standalone.yaml +++ b/example/redis-standalone.yaml @@ -7,7 +7,7 @@ spec: # redisConfig: # additionalRedisConfig: redis-external-config kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent resources: requests: @@ -23,7 +23,7 @@ spec: # - name: regcred redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 imagePullPolicy: Always resources: requests: diff --git a/example/redis_monitoring/cluster.yaml b/example/redis_monitoring/cluster.yaml deleted file mode 100644 index 85e16956fcf19eb3754fe98625d92eb80730a62c..0000000000000000000000000000000000000000 --- a/example/redis_monitoring/cluster.yaml +++ /dev/null @@ -1,39 +0,0 @@ ---- -apiVersion: redis.redis.opstreelabs.in/v1beta1 -kind: RedisCluster -metadata: - name: redis-cluster -spec: - clusterSize: 3 - kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 - imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi - redisExporter: - enabled: true - image: quay.io/opstree/redis-exporter:1.0 - imagePullPolicy: Always - resources: - requests: - cpu: 100m - memory: 128Mi - limits: - cpu: 100m - memory: 128Mi - # env: - # - name: REDIS_EXPORTER_INCL_SYSTEM_METRICS - # value: "true" - storage: - volumeClaimTemplate: - spec: - # storageClassName: standard - accessModes: ["ReadWriteOnce"] - resources: - requests: - storage: 1Gi diff --git a/example/redis_monitoring/clusterd.yaml b/example/redis_monitoring/clusterd.yaml new file mode 100644 index 0000000000000000000000000000000000000000..445ac7434ed66f4c3292e8d2d3fbc8842805a888 --- /dev/null +++ b/example/redis_monitoring/clusterd.yaml @@ -0,0 +1,28 @@ +--- +apiVersion: redis.redis.opstreelabs.in/v1beta1 +kind: RedisCluster +metadata: + name: redis-cluster +spec: + clusterSize: 3 + clusterVersion: v7 + securityContext: + runAsUser: 1000 + fsGroup: 1000 + persistenceEnabled: true + kubernetesConfig: + image: quay.io/opstree/redis:v7.0.5 + imagePullPolicy: Always + redisExporter: + enabled: true + image: quay.io/opstree/redis-exporter:v1.44.0 + imagePullPolicy: Always + storage: + volumeClaimTemplate: + spec: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 1Gi + # storageClassName: standard + diff --git a/example/redis_monitoring/standalone.yaml b/example/redis_monitoring/standalone.yaml index 1caaa9c6bc2c8a72a8a1673890f59e8fabf6bde7..528b59fda35a8e8e8febea27a12b80cb4483035a 100644 --- a/example/redis_monitoring/standalone.yaml +++ b/example/redis_monitoring/standalone.yaml @@ -5,15 +5,8 @@ metadata: name: redis-standalone spec: kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent - resources: - requests: - cpu: 101m - memory: 128Mi - limits: - cpu: 101m - memory: 128Mi storage: volumeClaimTemplate: spec: @@ -24,15 +17,11 @@ spec: storage: 1Gi redisExporter: enabled: true - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 imagePullPolicy: Always - resources: - requests: - cpu: 100m - memory: 128Mi - limits: - cpu: 100m - memory: 128Mi # env: # - name: REDIS_EXPORTER_INCL_SYSTEM_METRICS # value: "true" + securityContext: + runAsUser: 1000 + fsGroup: 1000 diff --git a/example/tls_enabled/redis-cluster.yaml b/example/tls_enabled/redis-cluster.yaml index ac554922f39c8d54a3211572260ba8260ea2afe4..3c4e3e1a3c6c4ba890d9f9c69142c2028242a64a 100644 --- a/example/tls_enabled/redis-cluster.yaml +++ b/example/tls_enabled/redis-cluster.yaml @@ -12,9 +12,13 @@ spec: key: tls.key secret: secretName: sample-cert - + clusterVersion: v7 + persistenceEnabled: true + securityContext: + runAsUser: 1000 + fsGroup: 1000 kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent resources: requests: @@ -29,7 +33,7 @@ spec: redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 imagePullPolicy: Always resources: requests: diff --git a/example/tls_enabled/redis-standalone.yaml b/example/tls_enabled/redis-standalone.yaml index 024b02240fb1c93541d740773905481f738f6185..e64fffdfb40c194ce6f758e7f543443d07e507ab 100644 --- a/example/tls_enabled/redis-standalone.yaml +++ b/example/tls_enabled/redis-standalone.yaml @@ -12,9 +12,11 @@ spec: key: tls.key secret: secretName: sample-cert - + securityContext: + runAsUser: 1000 + fsGroup: 1000 kubernetesConfig: - image: quay.io/opstree/redis:v6.2.5 + image: quay.io/opstree/redis:v7.0.5 imagePullPolicy: IfNotPresent resources: requests: @@ -26,7 +28,7 @@ spec: redisExporter: enabled: false - image: quay.io/opstree/redis-exporter:1.0 + image: quay.io/opstree/redis-exporter:v1.44.0 imagePullPolicy: Always resources: requests: diff --git a/k8sutils/redis.go b/k8sutils/redis.go index c2e23242f5f0f9d6d4682d804051d7a8ff83ec9e..e2987ae69cd2113297c98311adccd2b557957d6f 100644 --- a/k8sutils/redis.go +++ b/k8sutils/redis.go @@ -46,6 +46,12 @@ func getRedisServerIP(redisInfo RedisDetails) string { return redisIP } +// getRedisHostname will return the complete FQDN for redis +func getRedisHostname(redisInfo RedisDetails, cr *redisv1beta1.RedisCluster, role string) string { + fqdn := fmt.Sprintf("%s.%s-%s-headless.%s.svc", redisInfo.PodName, cr.ObjectMeta.Name, role, cr.Namespace) + return fqdn +} + // CreateSingleLeaderRedisCommand will create command for single leader cluster creation func CreateSingleLeaderRedisCommand(cr *redisv1beta1.RedisCluster) []string { logger := generateRedisManagerLogger(cr.Namespace, cr.ObjectMeta.Name) @@ -69,7 +75,11 @@ func CreateMultipleLeaderRedisCommand(cr *redisv1beta1.RedisCluster) []string { PodName: cr.ObjectMeta.Name + "-leader-" + strconv.Itoa(podCount), Namespace: cr.Namespace, } - cmd = append(cmd, getRedisServerIP(pod)+":6379") + if *cr.Spec.ClusterVersion == "v7" { + cmd = append(cmd, getRedisHostname(pod, cr, "leader")+":6379") + } else { + cmd = append(cmd, getRedisServerIP(pod)+":6379") + } } cmd = append(cmd, "--cluster-yes") @@ -122,8 +132,13 @@ func getRedisTLSArgs(tlsConfig *redisv1beta1.TLSConfig, clientHost string) []str func createRedisReplicationCommand(cr *redisv1beta1.RedisCluster, leaderPod RedisDetails, followerPod RedisDetails) []string { logger := generateRedisManagerLogger(cr.Namespace, cr.ObjectMeta.Name) cmd := []string{"redis-cli", "--cluster", "add-node"} - cmd = append(cmd, getRedisServerIP(followerPod)+":6379") - cmd = append(cmd, getRedisServerIP(leaderPod)+":6379") + if *cr.Spec.ClusterVersion == "v7" { + cmd = append(cmd, getRedisHostname(followerPod, cr, "follower")+":6379") + cmd = append(cmd, getRedisHostname(leaderPod, cr, "leader")+":6379") + } else { + cmd = append(cmd, getRedisServerIP(followerPod)+":6379") + cmd = append(cmd, getRedisServerIP(leaderPod)+":6379") + } cmd = append(cmd, "--cluster-slave") if cr.Spec.KubernetesConfig.ExistingPasswordSecret != nil { @@ -135,12 +150,13 @@ func createRedisReplicationCommand(cr *redisv1beta1.RedisCluster, leaderPod Redi cmd = append(cmd, pass) } cmd = append(cmd, getRedisTLSArgs(cr.Spec.TLS, leaderPod.PodName)...) - logger.Info("Redis replication creation command is", "Command", cmd) + logger.V(2).Info("Redis replication creation command is", "Command", cmd) return cmd } // ExecuteRedisReplicationCommand will execute the replication command func ExecuteRedisReplicationCommand(cr *redisv1beta1.RedisCluster) { + var podIP string logger := generateRedisManagerLogger(cr.Namespace, cr.ObjectMeta.Name) replicas := cr.Spec.GetReplicaCounts("follower") nodes := checkRedisCluster(cr) @@ -153,7 +169,7 @@ func ExecuteRedisReplicationCommand(cr *redisv1beta1.RedisCluster) { PodName: cr.ObjectMeta.Name + "-leader-" + strconv.Itoa(podCount), Namespace: cr.Namespace, } - podIP := getRedisServerIP(followerPod) + podIP = getRedisServerIP(followerPod) if !checkRedisNodePresence(cr, nodes, podIP) { logger.Info("Adding node to cluster.", "Node.IP", podIP, "Follower.Pod", followerPod) cmd := createRedisReplicationCommand(cr, leaderPod, followerPod) diff --git a/k8sutils/statefulset.go b/k8sutils/statefulset.go index 7091ea411cdb2fba9939f8daf3e2d32bee45097f..9835ef35e3719565cd980e67d6fb314a91ffde4b 100644 --- a/k8sutils/statefulset.go +++ b/k8sutils/statefulset.go @@ -183,7 +183,7 @@ func generateStatefulSetsDef(stsMeta metav1.ObjectMeta, params statefulSetParame ObjectMeta: stsMeta, Spec: appsv1.StatefulSetSpec{ Selector: LabelSelectors(stsMeta.GetLabels()), - ServiceName: stsMeta.Name, + ServiceName: fmt.Sprintf("%s-headless", stsMeta.Name), Replicas: params.Replicas, Template: corev1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{