0

i have created a storage class in my aks cluster and i have mounted it with my 2 pvc of sonarqube "data and extention" volumes , and every thing works. i have created the storage class in a diffrent resource groupe so when i destroy my cluster the storage class will remain and not deleted.

Now what i want is when creating the cluster again i want to mount the volumes "data and extentions" with the existing storage class but it keeps getting errors and i didnt found any good documentation of how to do it.

any ideas ?

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sonarqube-data
  namespace: inf-core
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: sonar-azurefile
  resources:
    requests:
      storage: 5Gi

apiVersion: v1 kind: PersistentVolumeClaim metadata: name: sonarqube-extensions namespace: inf-core spec: accessModes: - ReadWriteMany storageClassName: sonar-azurefile resources: requests: storage: 5Gi

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarqube-deployment
  namespace: inf-core
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarqube
      tier: web
  template:
    metadata:
      labels:
        app: sonarqube
        tier: web
    spec:
      initContainers:
      - name: init-sonarqube-permissions
        image: busybox
        command: ['sh', '-c', 'chown -R 999:999 /opt/sonarqube']  
        volumeMounts:
        - name: sonarqube-data
          mountPath: /opt/sonarqube/data
        - name: sonarqube-extensions
          mountPath: /opt/sonarqube/lib/extensions
      - name: init-sysctl
        image: busybox
        command: ['sysctl', '-w', 'vm.max_map_count=262144']
        securityContext:
          privileged: true    
      containers:
      - name: sonarqube
        image: sonarqube:latest
        ports:
        - containerPort: 9000
        env:
        - name: SONAR_JDBC_USERNAME
          valueFrom:
            secretKeyRef:
              name: sonarqube-secret
              key: SONAR_JDBC_USERNAME
        - name: SONAR_JDBC_PASSWORD
          valueFrom:
            secretKeyRef:
              name: sonarqube-secret
              key: SONAR_JDBC_PASSWORD
        - name: SONAR_JDBC_URL
          value: jdbc:postgresql://postgres-service:5432/sonarqube
        volumeMounts:
        - name: sonarqube-data
          mountPath: /opt/sonarqube/data
        - name: sonarqube-extensions
          mountPath: /opt/sonarqube/lib/extensions
      volumes:
      - name: sonarqube-data
        persistentVolumeClaim:
          claimName: sonarqube-data
      - name: sonarqube-extensions
        persistentVolumeClaim:
          claimName: sonarqube-extensions

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sonar-azurefile
provisioner: file.csi.azure.com
allowVolumeExpansion: true
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=1000
  - gid=1000
  - mfsymlinks
  - cache=strict
  - actimeo=30
parameters:
  skuName: Standard_LRS
  resourceGroup: AKS-STORAGECLASS

1 Answer 1

0

To ensure that your existing storage class and persistent volumes are correctly reattached to your new AKS cluster, make sure your Azure Storage Account and the associated file shares for sonarqube-data and sonarqube-extensions still exist in the specified resource group. Since your existing PVCs are bound to PVs that persist in a different resource group, you need to manually create PVs that reference the existing Azure File shares. This way, your new PVCs can bind to these manually created PVs.

Create a Kubernetes secret that contains the Azure Storage Account name and key

kubectl create secret generic azure-secret --from-literal=azurestorageaccountname=arkostor --from-literal=azurestorageaccountkey=$STORAGE_KEY

enter image description here

Create PVs for for sonarqube-data and sonarqube-extensions

data

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-sonarqube-data
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: sonar-azurefile
  azureFile:
    secretName: azure-secret
    shareName: sonarqube-data
    secretNamespace: default

extensions

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-sonarqube-extensions
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: sonar-azurefile
  azureFile:
    secretName: azure-secret
    shareName: sonarqube-extensions
    secretNamespace: default

enter image description here

enter image description here

Create PVC for the same data and extensions

data

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sonarqube-data
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: sonar-azurefile
  resources:
    requests:
      storage: 5Gi

extensions

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sonarqube-extensions
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: sonar-azurefile
  resources:
    requests:
      storage: 5Gi

enter image description here

enter image description here

Finally deploy your sonarqube

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarqube-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarqube
      tier: web
  template:
    metadata:
      labels:
        app: sonarqube
        tier: web
    spec:
      initContainers:
      - name: init-sonarqube-permissions
        image: busybox
        command: ['sh', '-c', 'chown -R 999:999 /opt/sonarqube/data /opt/sonarqube/lib/extensions']
        volumeMounts:
        - name: sonarqube-data
          mountPath: /opt/sonarqube/data
        - name: sonarqube-extensions
          mountPath: /opt/sonarqube/lib/extensions
      - name: init-sysctl
        image: busybox
        command: ['sysctl', '-w', 'vm.max_map_count=262144']
        securityContext:
          privileged: true    
      containers:
      - name: sonarqube
        image: sonarqube:latest
        ports:
        - containerPort: 9000
        env:
        - name: SONAR_JDBC_USERNAME
          valueFrom:
            secretKeyRef:
              name: sonarqube-secret
              key: SONAR_JDBC_USERNAME
        - name: SONAR_JDBC_PASSWORD
          valueFrom:
            secretKeyRef:
              name: sonarqube-secret
              key: SONAR_JDBC_PASSWORD
        - name: SONAR_JDBC_URL
          value: jdbc:postgresql://postgres-service:5432/sonarqube
        volumeMounts:
        - name: sonarqube-data
          mountPath: /opt/sonarqube/data
        - name: sonarqube-extensions
          mountPath: /opt/sonarqube/lib/extensions
      volumes:
      - name: sonarqube-data
        persistentVolumeClaim:
          claimName: sonarqube-data
      - name: sonarqube-extensions
        persistentVolumeClaim:
          claimName: sonarqube-extensions

enter image description here

kubectl get pods -n default

enter image description here

This setup ensures that your storage remains persistent even if the AKS cluster is recreated.

1
  • @Lahmar Oussama is your issue resolved?
    – Arko
    Commented Jul 22 at 12:01

Not the answer you're looking for? Browse other questions tagged or ask your own question.