PaaS/Kubernetes

SonarQube를 k8s에 컨테이너로 배포해보자

armyost 2023. 11. 19. 21:31
728x90

SonarQube는 하위에 여러 오픈소스가 배포된다. PostgreSQL, ElasticSearch 를 포함하여 여러 오픈소스가 install된다.

 

SonarQube 공식사이트에 Docker 기반 배포에 대한 가이드가 있는데, 약간 부실하다. 디테일이 빠져있다. 

https://docs.sonarsource.com/sonarqube/8.9/setup-and-upgrade/deploy-sonarqube-on-kubernetes/

 

Deploy SonarQube on Kubernetes

Learn how to deploy SonarQube on Kubernetes.

docs.sonarsource.com

 

우선 서두에 언급한 바와 같이 SonarQube는 여러 컨테이너로 구성되어 있는데, 이중 sonarqube -postgresql-0 이라는 컨테이너는 PV를 별도로 생성해주어야 한다. 

 

필자의 경우 PV를 사용하는 컨테이너가 있으면 배포될 노드를 지정한다. 공유볼륨을 사용하면 모르겠지만 그냥 로컬 볼륨을 할당할 수 있기 때문에 배포할 노드를 지정하는것이 편하다. 

 

SonarQube 배포할 Worker Node에도 Label을 추가하자

labels:
    app: sonarqube
    sonarqube: "true"

 

이제 노드를 고정시켜 배포할 수 있도록 조치완료하였으므로 Physical Volume을 해당 노드에 생성한다. 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-sonarqube
  namespace: sonarqube
  labels:
    app.kubernetes.io/instance: sonarqube
    app.kubernetes.io/name: postgresql
    role: primary
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/sonarqube
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: sonarqube
          operator: In
          values:
          - "true"

 

그리고 물리적인 로컬볼륨의 권한을 바꾸어 주어야 한다. 왜냐하면 sonarqube-postgresql이 runAsUser 가 1001이기 때문이다. 

$ chown -R 1001:1001 /data


이제 helm으로 SonarQube를 배포한다.

$ helm repo add sonarqube https://SonarSource.github.io/helm-chart-sonarqube
$ helm repo update
$ kubectl create namespace sonarqube
$ helm upgrade --install -n sonarqube sonarqube sonarqube/sonarqube

 

이때 helm으로 배포된 sonarqube-postgresql StatefulSet 에 아래와 같은 Selector가 적용되어 있는지 확인하자. 없다면 추가.

selector:
      matchLabels:
        app: sonarqube

 

sonarqube-postgresql이 잘 Running되었는지 확인하고..

 

만약 sonarqube-sonarqube 가 말썽인 경우 다음 포스팅을 참고바란다. 아마 initContainer에서 permissoin deny가 발생하였을 것이다.

https://armyost.tistory.com/441

 

permission denied on key "vm.max_map_count", ignoring 오류 해결하기

컨테이너로 오픈소스를 배포하다보면 아래와같이 init container에서 권한오류가 발생하는 경우가 종종있다. 특히 ElasticSearch 를 배포하는 경우 자주 발생한다. sysctl: permission denied on key "vm.max_map_coun

armyost.tistory.com

 

 

 

 

다음과 같이 잘 Running 중이라면 이제 Ingress를 뚤어 서비스로 접속해보자.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sonar-ingress
  namespace: sonarqube
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  ingressClassName: "nginx"
  rules:
  - host: sonar.armyost.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: sonarqube-sonarqube
            port:
              number: 9000

 

접속해보면 잘 뜬다.