Модуль приложения Sonarqube не подключается к модулю базы данных PostgreSQL при развертывании в Kubernetes

Я пытаюсь настроить SonarQube в кластере Kubernetes. Кластер сделан с помощью KubeADM в облаке AWS. У меня есть следующие файлы для установки.

  1. Файл развертывания приложения Sonarqube
  2. Файл секретов приложения Sonarqube
  3. Файл развертывания Sonarqube-PostgreSQL.
  4. Постоянный том Sonarqube-PostgreSQL и файл заявки на том
  5. Файл секретов Sonarqube-PostgreSQL.

Используя эти файлы YAML, я могу запустить приложение. Я использую NodePort в качестве типа службы для приложения SonarQube, и оно работает нормально. Модули приложений и БД работают нормально, и я даже могу войти в пользовательский интерфейс SonarQube, настроить свои проекты/данные и сделать все.

Однако проблема в том, что когда я выключаю серверы и возвращаю их снова через некоторое время или удаляю модуль приложения SonarQube, а когда на его месте появляется новый, все данные как бы теряются.

Я также вижу, что база данных PostgreSQL готова принимать соединения, однако модуль приложения ничего не предоставляет.

Похоже, что данные хранятся в самом модуле приложения, и когда с ним что-то происходит, все данные теряются. Итак, когда я удаляю модуль приложения и пытаюсь получить доступ к пользовательскому интерфейсу еще раз, я получаю вот что.

Буквально все данные сбрасываются.

Ниже приведены файлы YAML, которые я использовал:

sonarqube-app.yaml

      ---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarqube
  namespace: sonarqube
  labels:
    app: sonarqube
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarqube
  template:
    metadata:
      labels:
        app: sonarqube
    spec:
      containers:
      - name: sonarqube
        image: sonarqube:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 9000
        env:
          - name: POSTGRES_SERVICE_HOST
            value: "10.107.194.222" # update this to reflect your IP 
          - name: POSTGRES_USER
            valueFrom:
              secretKeyRef:
                name: postgres-db-credentials
                key: user
          - name: POSTGRES_PASSWORD
            valueFrom:
              secretKeyRef:
                name: postgres-db-credentials
                key: password
          - name: POSTGRES_NAME
            value: 'postgres'
          - name: DATABASE_URL
            value: jdbc:postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@postgresql:5432/$(POSTGRES_NAME)
          - name: SECRET_KEY
            valueFrom:
              secretKeyRef:
                name: sonarqube-secret-key
                key: secret_key    

        volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgresql-volume-mount
      volumes:
      - name: postgresql-volume-mount
        persistentVolumeClaim:
          claimName: postgres-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: sonarqube-service
  namespace: sonarqube 
  labels:
    app: sonarqube
spec:
  ports:
  - port: 9000
    targetPort: 9000
    protocol: TCP
    nodePort: 31000
  type: NodePort
  selector:
    app: sonarqube

postgres-deployment.yaml

      ---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgresql
  namespace: sonarqube 
  labels:
    app: postgres-db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-db
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: postgres-db
        tier: postgreSQL
    spec:
      containers:
        - name: postgresql
          image: postgres:10.3
          ports:
          - containerPort: 5432
          env:
          - name: POSTGRES_USER
            valueFrom:
              secretKeyRef:
                name: postgres-db-credentials
                key: user
          - name: POSTGRES_PASSWORD
            valueFrom:
              secretKeyRef:
                name: postgres-db-credentials
                key: password
          - name: POSTGRES_NAME
            value: 'postgres'
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgresql-volume-mount
          resources:
            requests:
              memory: "64Mi"
              cpu: "250m"
            limits:
              memory: "128Mi"
              cpu: "500m"
      volumes:
      - name: postgresql-volume-mount
        persistentVolumeClaim:
          claimName: postgres-pv-claim
      tolerations:
      - key: "blue"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"
---
apiVersion: v1
kind: Service
metadata:
  name: postgresql
  namespace: sonarqube
  labels:
    app: postgres-db
spec:
  clusterIP: 10.107.194.222
  type: ClusterIP
  ports:
  - port: 5432
    targetPort: 5432
    protocol: TCP
  selector:
    app: postgres-db
    tier: postgreSQL

pv-pvc.yaml

      ---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-pv
  namespace: sonarqube 
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 200M
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/data"

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
  labels: 
    app: postgres-db
  name: postgres-pv-claim
  namespace: sonarqube
spec: 
  accessModes: 
    - ReadWriteOnce
  resources: 
    requests: 
      storage: 100M
  storageClassName: manual

Итак, как я могу подключить модуль приложения к модулю БД, а также использовать PVC и PV в качестве средства хранения данных?

Кто-нибудь знает, как это исправить?

1 ответ

Вы неправильно используете контейнер.

Развертывание sonarqube и postgres ссылается на один и тот же PVC, который не может работать. Это нужно только postgres, поскольку контейнер sonarqube поставляется только со встроенной базой данных H2 и должен использовать развертывание postgres.

Добавьте службу в развертывание postgres и используйте DNS-имя кластера в URL-адресе JDBC. Вот ссылка на postgres.

Соблюдайте документацию по запуску SonarQube в контейнере .

Переменные среды для подключения к БД должны быть:

          -e SONAR_JDBC_URL=... \
    -e SONAR_JDBC_USERNAME=... \
    -e SONAR_JDBC_PASSWORD=... 

Эти переменные нужны вам только в контейнере, подключающемся к postgres, то есть в контейнере sonarqube.

Другие вопросы по тегам