我正在尝试在 Kubernetes 集群中设置 SonarQube。该集群是使用 AWS 云中的 KubeADM 创建的。我有以下用于设置的文件。
- Sonarqube 应用程序部署文件
- Sonarqube 应用程序机密文件
- Sonarqube-PostgreSQL 部署文件。
- Sonarqube-PostgreSQL 持久卷和卷声明文件
- 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 容器)上使用这些变量。