部署到 Kubernetes 时,Sonarqube 应用程序 pod 未与 PostgreSQL DB pod 连接

部署到 Kubernetes 时,Sonarqube 应用程序 pod 未与 PostgreSQL DB pod 连接

我正在尝试在 Kubernetes 集群中设置 SonarQube。该集群是使用 AWS 云中的 KubeADM 创建的。我有以下用于设置的文件。

  1. Sonarqube 应用程序部署文件
  2. Sonarqube 应用程序机密文件
  3. Sonarqube-PostgreSQL 部署文件。
  4. Sonarqube-PostgreSQL 持久卷和卷声明文件
  5. Sonarqube-PostgreSQL 秘密文件。

使用这些 YAML 文件,我能够启动应用程序。我使用 NodePort 作为 SonarQube App 的服务类型,它运行良好。App 和 DB pod 都运行良好,我甚至可以登录 SonarQube UI,配置我的项目/数据并执行所有操作。

在此处输入图片描述

在此处输入图片描述

然而,问题是,当我关闭服务器并在一段时间后再次将其恢复,或者删除 SonarQube App pod 并在其位置生成新的服务器时,整个数据就会丢失。

我还可以看到 PostgreSQL DB 已准备好接受连接,但是应用程序 pod 没有提供任何东西。

在此处输入图片描述

似乎数据被存储在 App pod 本身中,当它发生某些事情时,整个数据都会丢失。因此,当我删除 App pod 并再次尝试访问 UI 时,我得到的就是这个。 在此处输入图片描述

从字面上看,所有数据均被清除。

以下是我使用的 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-部署.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

那么,如何让 App Pod 连接到 DB pod 并使用 PVC 和 PV 作为存储数据的方式?

有谁知道如何解决这一问题?

答案1

您使用容器的方式不正确。

sonarqube 和 postgres 部署都引用了同一个 PVC,这无法正常工作。只有 postgres 需要它,因为sonarqube 容器仅带有嵌入式 H2 DB并且应该使用 postgres 部署。

向您的 postgres 部署添加服务并在 JDBC URL 中使用集群 DNS 名称。这里是 postgres 的参考。

遵守有关在容器中运行 SonarQube

DB 连接的环境变量应该是:

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

您只需要在连接到 postgres 的容器(即 sonarqube 容器)上使用这些变量。

相关内容