Redis struggle
Redis running in OCP, deployed using ARGO, loadTEST and failover test
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
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
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
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
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