This is in continuation of my previous article - DevOps tool-chain setup on Kubernetes cluster. Part - 1/3. In this article, I have covered on how to setup the SonarQube and PostgreSQL on the Kubernetes cluster.
SonarQube is a web-based open source platform used to measure and analyse the source code quality. Code quality analysis makes your code more reliable and readable. It can analyse and manage code of more than 20 programming languages.
SonarQube needs a database and it supports databases like MySQL, PostgreSQL, MSSQL, etc. In this article I have used PostgreSQL as the database for SonarQube. I have followed a sequence of creating PostgreSQL DB kubernetes components followed by SonarQube Kubernetes components.
Let me configure PostgreSQL and SonarQube on the Kubernetes cluster by using the below scripts.
In this section, I have setup PostSQL on Kubernetes cluster by using the below scripts.
I have created the Storage Class for PostgreSQL Database.
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: sonar-storage labels: app: sonar-storage provisioner: kubernetes.io/aws-ebs parameters: type: gp2 zone: eu-west-2a allowVolumeExpansion: true
I have created Persistent Volume and allocated 4GB as the storage space for PostgreSQL.
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: sonar-postgres-data labels: app: Sonar-Postgres-Data annotations: volume.beta.kubernetes.io/storage-class: "sonar-storage" spec: accessModes: - ReadWriteOnce resources: requests: storage: 4Gi
I have created a deployment script which pulls the PostgreSQL image, if the image is not persent in the Kubernetes cluster. I have configured PostgreSQL with the port 5432. Its data are persisted on the persistent volume which is created in the previous step. This deployment is created with single Replica. PostgreSQL Database credentials (user name & password) are mentioned in clear text. In production environment it is not advisable to have password in clear text.
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: postgresql-sonar spec: replicas: 1 template: metadata: name: postgresql-sonar labels: app: postgresql-sonar spec: containers: - name: postgreqsl-sonar image: postgres:9.6 imagePullPolicy: IfNotPresent ports: - containerPort: 5432 name: postgresql-port env: - name: POSTGRES_USER value: sonar - name: POSTGRES_PASSWORD value: password - name: PGDATA value: /var/lib/postgresql/data/pgdata volumeMounts: - name: db-data mountPath: /var/lib/postgresql/data volumes: - name: db-data persistentVolumeClaim: claimName: sonar-postgres-data
I have created service for PostgreSQL on port 5432.
kind: Service apiVersion: v1 metadata: name: postgresql-db labels: name: postgresql-db spec: type: NodePort ports: - port: 5432 targetPort: 5432 protocol: TCP name: postgresql-db-port selector: app: postgresql-sonar
I have created all the required Kubernetes components for the SonarQube Database in the previous sections. Now, I am going to create Kubernetes components for SonarQube which will use all the Database components.
I have created a deployment script which pulls the SonarQube image, if not persent in the Kubernetes cluster and configured on port 9000. I have configured SonarQube to connect with the PostgreSQL DB which is exposed on port 5432 by providing the user credentials.
kind: Deployment apiVersion: extensions/v1beta1 metadata: name: sonar spec: replicas: 1 template: metadata: name: sonar labels: app: sonar spec: containers: - name: sonar image: sonarqube:6.7 imagePullPolicy: IfNotPresent ports: - containerPort: 9000 name: sonarport env: - name: SONARQUBE_JDBC_USERNAME value: sonar - name: SONARQUBE_JDBC_PASSWORD value: password - name: SONARQUBE_JDBC_URL value: jdbc:postgresql://postgresql-db:5432/sonar
I have created a service for SoanrQube on its default port 9000.
kind: Service apiVersion: v1 metadata: name: sonar labels: app: sonar spec: type: NodePort ports: - port: 9200 targetPort: 9000 name: sonarport selector: app: sonar type: LoadBalancer
By now I have created storage class, persistent volume, deployment, and service for SonarQube and PostgreSQL DB and it is up & running.
$kubectl get deployment $kubectl get pod $kubectl get svc
By now I have covered how to setup SonarQube and PostgreSQL with single Replicaset on a Kubernetes cluster. I will discuss the Nexus setup in the final article.
yaml files are space sensitive and the scripts that are available in this article might have tab spaces instead of whitespace. These scripts will fail, if you copy and paste without changing the tab to whitespace.