Redis struggle

Redis running in OCP, deployed using ARGO, loadTEST and failover test

Content
*file: 1.md *

INSTALL as GITOPS

ZADOST O SAS (nas prideleny SAS je DEV-LIN)

SAS_DEV_LIN je dulezitej jak bude videt dale, kazdopadne je trochu chaos kdy se pouziva DEV_LIN a kdy DEV-LIN konkretne to vypadne z kontextu, hodne to vychazi z toho ze "-_" jsou nekdy zakazane znaky.

Zároveň je potřeba si na základě SASU zažádat o projekt na platformě Openshift.

GIT repozitáře

tento repozitář vznikne automaticky v rámci flow:

tento repozitář je potřeba zažádat:

  • csas-dev/dev-lin-redis-app.git (CI část)

    ServiceNow Ticket A protože je to jiná organizace v githubu, tak budou nové skupiny a o ty si musí v redimu požádat. Vytvoří se ale až po založení toho repa.

    Pro členství v týmu je potřeba si požádat o Windows skupinu v Redimu, která je ve formátu GHB_{ORG}{CMDB_ID}{ROLE}, kde {ORG} je zkratka organizace (DEV/SEC/OPS/OSS), {CMDB_ID} je “SAS” aplikace (bez prefixu “SAS_”), která tým reprezentuje a {ROLE} je jedna z [ADM, WRITE, READ]. Tyto skupiny vytvoří DevTools při zakládání týmu.

NAME OF THE REPOSITORY  : redis-app
APPLICATION SYSTEM      : DEV LIN CZ (SAS_DEV_LIN)
GITHUB ORGANIZATION     : csas-dev
FINAL REPOSITORY URL    : https://github.com/csas-dev/dev-lin-redis-app

role v redimu: GHB_DEV_DEV_LIN_WRITE v lepším případě GHB_DEV_DEV_LIN_ADMIN

Role “write” do Artifactory ma jen organizace csas-dev

flow

flow

VZNIKLE OBJEKTY V OCP

Na OCP se nám na základě žádosti vzniknou následující objekty které definují projekt

# základní definice projektu
➤ oc get projects.ops.csas.cz dev-lin
NAME      AGE
dev-lin   54d

# definice projektu pro argoCD
➤ oc get appprojects.argoproj.io -n csas-argocd-app|grep dev-lin
dev-lin-dev        54d
dev-lin-int        54d
dev-lin-prs        54d

➤ oc get appprojects.argoproj.io -n csas-argocd-app dev-lin-dev -o yaml|neat
#shortened
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: dev-lin-dev
  namespace: csas-argocd-app
  roles:
  - groups:
    - OCP_DEV_LIN_DEV
    - OCP_DEV_LIN_OPS
  - groups:
    - OCP_DEV_LIN_USR
    name: view
  sourceRepos:
  - git@github.com:csas-ops/dev-lin-*.git
  - https://github.com/csas-ops/dev-lin-*.git
  - https://artifactory.csin.cz/artifactory/dev-lin-helm
  - https://artifactory.csin.cz:443/artifactory/dev-lin-helm

# definice aplikace pro argoCD
➤ oc get applications.argoproj.io --namespace csas-argocd-app dev-lin-dev-apps -o yaml|neat
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: dev-lin-dev-apps
  namespace: csas-argocd-app
spec:
  destination:
    namespace: dev-lin-dev
    server: https://kubernetes.default.svc
  info:
  - name: description
    value: System Application used for synchronization of user provided Application
      objects
  - name: project
    value: dev-lin
  - name: environment-name
    value: dev
  - name: environment-type
    value: dev
  project: dev-lin-dev
  source:
    path: .
    repoURL: https://github.com/csas-ops/dev-lin-ocp4s-apps.git
    targetRevision: env/dev
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Jelikoz jsme v prostredi dev budeme pouzivat Namespace dev-lin-dev

BUILD APLIKACE A HELM CHARTU

HELM CHART

Redis helm chart je whitelistován jako remote repozitory v Artifactory

#artifactory settings
charts-bitnami-com	helm	https://artifactory.csin.cz/artifactory/charts-bitnami-com-virtual	https://charts.bitnami.com/bitnami

Redis helm chart i kdyz je v remote-repository nemuzeme referencovat naprimo jelikoz sourceRepos pro argo to nedovoli

➤ oc get appprojects.argoproj.io -n csas-argocd-app dev-lin-dev -o yaml|yq e .spec.sourceRepos
- git@github.com:csas-ops/dev-lin-*.git
- https://github.com/csas-ops/dev-lin-*.git
- https://artifactory.csin.cz/artifactory/dev-lin-helm
- https://artifactory.csin.cz:443/artifactory/dev-lin-helm

Helm chart udelame nejaky generic ktery bude vlastne jen templatovat deployment Alpine linuxu, ale chceme k tomu pribalit Redis. Apline linux nam vlastne simuluje libovolnou aplikaci.
Jelikoz redis helm chart nemuzeme adresovat naprimo udelame ho jako subchart pro nas aplikacni helm. Pri helm package se pak tento subchart “pribali” ve forme taru k hlavnimu chartu a bude pushnut do artifactory.

#Chart.yaml
apiVersion: v2
name: redis-app
description: Redis deployment  with app
type: application
version: 0.1.0
appVersion: "1.16.0"
dependencies: 
  - name: redis
    version: 17.0.7
    repository: https://artifactory.csin.cz/artifactory/charts-bitnami-com-virtual/redis
    alias: redis

BUILD APLIKACE GITHUB ACTIONS

Rozhodl jsem se ze pro priklad udelam build containeru postavenem na Alpine linuxu ktery bude slouzit jako redisCLI client.
app repo URL

#containerFile really simple
FROM alpine:3.15.5
RUN apk --update add redis bash gawk
#GHA env snippet
env:
  ARTIFACTORY_URL: artifactory.csin.cz
  CHART_REPOSITORY: https://artifactory.csin.cz:443/artifactory/dev-lin-helm-local
  IMAGE_REPOSITORY: artifactory.csin.cz/dev-lin-docker-local/rediscli

image se pushne s generovanym tagem:
0.0.0-master.0c64f524-expire2208221434

ARGOCD DEPLOYMENT

CD git repo

vytvorime csas application v branch env/dev s values pro HELM chart (redis subchart referencujeme jeho aliasem tedy “redis”)

apiVersion: ops.csas.cz/v1
kind: Application
metadata:
  name: redis
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
  source:
    repoURL: https://artifactory.csin.cz/artifactory/dev-lin-helm
    chart: redis-app
    targetRevision: 0.0.0-master.0c64f524-expire2208221434
    helm:
      values: |
        redis:
          auth:
            enabled: false
            sentinel: false
            podSecurityContext:
              enabled: false
              fsGroup: 1001
            containerSecurityContext:
              enabled: false
            persistence:
              enabled: false
          replica:
            replicaCount: 3
            podSecurityContext:
              enabled: false
            containerSecurityContext:
              enabled: false
            persistence:
              enabled: false
          sentinel:
            enabled: true
            persistence:
              enabled: false
            containerSecurityContext:
              enabled: false        

Application.ops.csas.cz operator se postara o transformaci a ulozeni v podobe CRD application.argoproj.io do NS csas-argocd-app a nasledne tak vznikne argoCD aplikace
ARGO CD REDIS APPLICATION

*file: 2.md *

USING TRIDENT as STATE

Prvotni konfigurace byla ve forme bez PersistentVolume ale skusime taky udelat konfiguraci s PersistentVolume.

Persistence volume pouzijeme pro NODE(8GB). Jako storage CLASS pouzijeme trident s reclaimPolicy Delete ! pro produkcni nastaveni by asi bylo vhodnejsi pouzit policy Retain abychom pokud mozno o data nechtene neprisli.
Mozna by stalo za to se i zamyslet nad nepouzitim StrorageClass vubec ale vytvorit PV manualne a jen upravit VolumeClaimTemplate pro StatefullSet a trefit tyto PV.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-trident-tprgnasbe02
mountOptions:
- rw
- hard
- nfsvers=4.0
- proto=tcp
parameters:
  backendType: ontap-nas-economy
  storagePools: tprgnasbe02:.*
provisioner: csi.trident.netapp.io
reclaimPolicy: Delete
volumeBindingMode: Immediate

Upravime aplikaci a jelikoz zmeny provadime na StateFullSetem a zasahujeme do spec je nejdrive nutne appku smazat prez argo konzoli.

one or more objects failed to apply, reason: StatefulSet.apps “dev-lin-dev-redis-node” is invalid: spec: Forbidden: updates to statefulset spec for fields other than ‘replicas’, ’template’, ‘updateStrategy’, ‘persistentVolumeClaimRetentionPolicy’ and ‘minReadySeconds’ are forbidden

apiVersion: ops.csas.cz/v1
kind: Application
metadata:
  name: redis
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
  source:
    repoURL: https://artifactory.csin.cz/artifactory/dev-lin-helm
    chart: redis-app
    targetRevision: 0.0.0-master.0c64f524-expire2208221434
    helm:
      values: |
        redis:
          auth:
            enabled: false
            sentinel: false
          replica:
            replicaCount: 3
            podSecurityContext:
              enabled: false
            containerSecurityContext:
              enabled: false
            persistence:
              enabled: true
              storageClass: nfs-trident-tprgnasbe02
          sentinel:
            enabled: true
            persistence:
              enabled: false
            containerSecurityContext:
              enabled: false        

Vznikne nam 3 PVC a k nim do paru 3 PV.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: csi.trident.netapp.io
    volume.kubernetes.io/storage-provisioner: csi.trident.netapp.io
  labels:
    app.kubernetes.io/component: node
    app.kubernetes.io/instance: dev-lin-dev-redis
    app.kubernetes.io/name: redis
  name: redis-data-dev-lin-dev-redis-node-0
  namespace: dev-lin-dev
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  storageClassName: nfs-trident-tprgnasbe02
  volumeName: pvc-5fe06de3-95e6-4b4b-9891-491d243581f2
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: csi.trident.netapp.io
  name: pvc-5fe06de3-95e6-4b4b-9891-491d243581f2
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 8Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: redis-data-dev-lin-dev-redis-node-0
    namespace: dev-lin-dev
    resourceVersion: "201908638"
    uid: 5fe06de3-95e6-4b4b-9891-491d243581f2
  csi:
    driver: csi.trident.netapp.io
    volumeAttributes:
      backendUUID: 84ee5930-b697-49e8-9d80-e52ca664fc83
      internalName: tocp4s_pvc_5fe06de3_95e6_4b4b_9891_491d243581f2
      name: pvc-5fe06de3-95e6-4b4b-9891-491d243581f2
      protocol: file
      storage.kubernetes.io/csiProvisionerIdentity: 1658230595756-8081-csi.trident.netapp.io
    volumeHandle: pvc-5fe06de3-95e6-4b4b-9891-491d243581f2
  mountOptions:
  - rw
  - hard
  - nfsvers=4.0
  - proto=tcp
  persistentVolumeReclaimPolicy: Delete
  storageClassName: nfs-trident-tprgnasbe02

vazba mezi nimi je prez objekt spec.claimRef a ze STS jsou referencovany prez VolumeClaimTemplate

  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      creationTimestamp: null
      labels:
        app.kubernetes.io/component: node
        app.kubernetes.io/instance: dev-lin-dev-redis
        app.kubernetes.io/name: redis
      name: redis-data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 8Gi
      storageClassName: nfs-trident-tprgnasbe02
      volumeMode: Filesystem
*file: 3.md *

REDIS common

Redis se sentinelem používá dva porty

oc port-forward svc/redis 26379:26379 & #port pro pristup na Sentinel
redis-cli -h 127.0.0.1 -p 26379
SENTINEL get-master-addr-by-name mymaster
1) "redis-node-0.redis-headless.dev-lin-dev.svc.cluster.local"
2) "6379"


oc port-forward svc/redis 6379:6379 & #read only pristup na redis
redis-cli -h 127.0.0.1 -p 6379
INFO keyspace #list all databases and keys
KEYS * #all keys