• Русский
  • Развертывание экземпляра SonarQube

    В этом документе описывается подписка на SonarQube Operator и функциональность по развертыванию экземпляров SonarQube.

    Ограничения политики безопасности пространства имён

    SonarQube не поддерживает развертывание в пространствах имён с политикой SPA (Security Policy Admission), установленной в Restricted или Baseline по следующим причинам:

    1. Init Container требует прав root: SonarQube использует init-контейнеры для инициализации прав на директорию PVC, что требует прав root, которые не разрешены при политике Restricted.
    2. InitSysctl требует привилегированных прав: По умолчанию SonarQube использует initSysctl-контейнеры для настройки параметров sysctl (например, vm.max_map_count и fs.file-max), необходимых Elasticsearch. Для этого требуются привилегированные права для изменения системных параметров ядра.

    Рекомендация: Создайте отдельное пространство имён для развертывания SonarQube и убедитесь, что его политика безопасности установлена в privileged.

    Предварительные требования

    • Этот документ применим к версиям SonarQube 9.9.5 и выше, предоставляемым платформой. Он отделён от платформы с использованием таких технологий, как Operator.

    • Убедитесь, что SonarQube Operator был развернут (подписан) в целевом кластере, то есть создание экземпляров через SonarQube Operator готово к использованию.

    Планирование развертывания

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

    Основная информация

    1. SonarQube Operator, предоставляемый платформой, основан на официальном сообществом SonarQube Chart с расширенными корпоративными возможностями, такими как поддержка IPv6 и исправления уязвимостей безопасности. Он полностью совместим с версией сообщества по функционалу и улучшает удобство развертывания SonarQube за счёт опциональных, настраиваемых шаблонов и других методов.

    Планирование ресурсов перед развертыванием

    Планирование ресурсов перед развертыванием включает принятие решений до начала развертывания, которые будут применяться в процессе развертывания.

    Для получения дополнительных рекомендаций по ресурсам среды обратитесь к официальной документации: https://docs.sonarsource.com/sonarqube-server/2025.1/setup-and-upgrade/installation-requirements/server-host/#hardware

    Развертывание экземпляра

    Развертывание из шаблона Quickstart Template

    Этот шаблон используется для быстрого создания лёгкого экземпляра SonarQube, подходящего для сценариев разработки и тестирования, не рекомендуется для производственной среды.

    • Вычислительные ресурсы: 800m CPU, 4 Gi памяти
    • Хранение: Используется локальное хранилище узла, настройте IP узла хранения и путь
    • Сетевой доступ: Используется NodePort для доступа к сервису, IP узла совпадает с узлом хранения, укажите порт

    Развертывание из шаблона Production Template

    Этот шаблон используется для быстрого создания производственного экземпляра SonarQube, подходит для производственных сценариев, рекомендуется для продакшн-среды.

    • Вычислительные ресурсы: 8 ядер CPU, 16 Gi памяти
    • Хранение: Используется PVC, настройте класс хранения
    • Сетевой доступ: Используется доменное имя для доступа к сервису.

    Развертывание из YAML

    Конфигурация ресурсов

    SonarQube требует настройки только общих ресурсов, например:

    spec:
      helmValues:
        resources:
          limits:
            cpu: 800m
            memory: 4Gi
          requests:
            cpu: 400m
            memory: 2Gi

    Подробнее см. Описание ресурсов в SonarQube Chart

    Конфигурация сети

    Конфигурации сети делятся на два типа:

    • Конфигурация сети на основе ingress
    • Конфигурация сети на основе NodePort

    Конфигурация сети на основе ingress поддерживает протоколы https и http. В кластере должен быть предварительно развернут ingress controller.

    spec:
      helmValues:
        ingress:
          enabled: true
          hosts:
            - name: test-ingress-https.example.com
          tls:
            - secretName: test-tls-cert
              hosts:
                - test-ingress-http.example.com

    Конфигурация сети на основе NodePort:

    spec:
      helmValues:
        service:
          name: sonarqube
          type: NodePort
          nodePort: <nodeport.http>

    Конфигурация хранения

    Конфигурации хранения делятся на три категории:

    • Конфигурация хранения на основе StorageClass
    • Конфигурация хранения на основе PVC
    • Конфигурация хранения на основе HostPath

    Конфигурация хранения на основе StorageClass:

    spec:
      helmValues:
        persistence:
          enabled: true
          storageClass: <storage-class.rwm> ## StorageClass должен быть создан заранее
          size: 10Gi

    Конфигурация хранения на основе PVC:

    spec:
      helmValues:
        persistence:
          enabled: true
          existingClaim: sonarqube-pvc ## PVC должен быть создан заранее

    Конфигурация хранения на основе HostPath:

    spec:
      helmValues:
        nodeSelector:
          kubernetes.io/hostname: <node.random>  ## Выбор узла для развертывания
        
        persistence:
          enabled: false
          host:
            nodeName: <node.random> ## Имя узла
            path: /tmp/sonarqube-<template.{{randAlphaNum 10}}> ## Выбор узла и указание пути хранения

    Конфигурация учётных данных доступа к PostgreSQL

    На платформе необходимо заранее создать экземпляр PostgreSQL и базу данных для использования.

    Поддерживаемые версии PostgreSQL для SonarQube 25.1.0 — от 13 до 17.

    Доступ к PostgreSQL осуществляется путём настройки ресурса secret с определённым форматом содержимого. Подробнее см. Настройка PostgreSQL и учётных данных доступа.

    Использование секрета для учётных данных доступа к PG в yaml SonarQube:

    spec:
      helmValues:
        postgresql:
          enabled: false ## Отключить стандартный экземпляр PostgreSQL
        jdbcOverwrite:
          enable: true
          jdbcSecretName: postgres-password ## Учётные данные для подключения к PG
          jdbcUrl: jdbc:postgresql://<pg.host>:<pg.port>/<pg.database>?socketTimeout=1500 ## Адрес подключения к PG
          jdbcUsername: postgres ## Пользователь доступа к PG

    Конфигурация учётной записи администратора

    При инициализации экземпляра SonarQube необходимо настроить учётную запись администратора и её пароль. Это делается путём настройки ресурса secret. Подробнее см. Настройка PostgreSQL и учётных данных доступа.

    Укажите это в YAML SonarQube:

    spec:
      helmValues:
        account:
          adminPasswordSecretName: sonarqube-root-password

    Полный пример YAML

    NodePort, PVC, PostgreSQL, учётная запись администратора

    apiVersion: operator.alaudadevops.io/v1alpha1
    kind: Sonarqube
    metadata:
      name: sonarqube-demo
    spec:
      helmValues:
        prometheusExporter: # Отключить стандартный мониторинг prometheus, jar-пакеты должны быть добавлены заранее при запуске
          enabled: false
        resources: # Установить лимиты ресурсов
          limits:
           cpu: 800m
           memory: 4Gi
          requests:
           cpu: 400m
           memory: 2Gi
        postgresql: # Отключить стандартный экземпляр PostgreSQL
          enabled: false
        jdbcOverwrite: # Использовать заранее созданный экземпляр PostgreSQL
          enable: true
          jdbcSecretName: postgres-password
          jdbcUrl: jdbc:postgresql://<pg.host>:<pg.port>/<pg.database>?socketTimeout=1500
          jdbcUsername: <pg.username>
        service: # Использовать NodePort для экспонирования экземпляра SonarQube
          name: sonarqube
          type: NodePort
          nodePort: <nodeport.http>
        account: # Установить пароль Root
          adminPasswordSecretName: sonarqube-root-password
        persistence: # Использовать PVC для монтирования хранилища
          enabled: true
          existingClaim: sonarqube-pvc

    Конфигурация SSO

    Настройка SSO включает следующие шаги:

    Регистрация клиента аутентификации SSO в глобальном кластере

    • Создайте ресурс OAuth2Client в глобальном кластере для регистрации клиента аутентификации SSO.
    • Настройте экземпляр SonarQube для использования аутентификации SSO
    apiVersion: dex.coreos.com/v1
    kind: OAuth2Client
    name: OIDC
    metadata:
      name: onxw4ylsof2wezjnmrsxrs7sttsiiirdeu # Это значение вычисляется на основе хеша поля id, онлайн-калькулятор: https://go.dev/play/p/QsoqUohsKok
      namespace: cpaas-system
    id: sonarqube-dex # Client id
    public: false
    redirectURIs:
      - <sonarqube-host>/* # Адрес обратного вызова аутентификации SonarQube, где <sonarqube-host> заменяется на адрес доступа к экземпляру SonarQube
    secret: Z2l0bGFiLW9mZmljaWFsLTAK # Client secret
    spec: {}
    ПолеОписаниеПример
    nameОтображаемое имя ресурса.OIDC
    idИдентификатор клиента для аутентификации SSO. Допускается любое значение, кроме alauda-dex, которое зарезервировано и может вызвать конфликты.sonarqube-dex
    secretСекрет клиента, используемый для аутентификации SSO. Может быть любым значением.Z2l0bGFiLW9mZmljaWFsLTAK
    redirectURIsURL обратного вызова аутентификации SonarQube, формат <sonarqube-host>/*.https://example.sonarqube.com/*
    metadata.nameИмя ресурса, которое должно быть вычислено на основе хеша поля id. Можно использовать онлайн-калькуляторы хешей, например https://go.dev/play/p/QsoqUohsKok.onxw4ylsof2wezjnmrsxrs7sttsiiirdeu
    metadata.namespaceПространство имён системы платформы, должно быть cpaas-system.cpaas-system

    Добавьте конфигурацию SSO в экземпляр SonarQube:

    spec:
      helmValues:
        sonarProperties:
          sonar.core.serverBaseURL: <sonarqube url>
          sonar.forceAuthentication: false
          sonar.auth.oidc.enabled: true
          sonar.auth.oidc.issuerUri: <platform-url>/dex
          sonar.auth.oidc.clientId.secured: sonarqube-dex # Client id
          sonar.auth.oidc.clientSecret.secured: Z2l0bGFiLW9mZmljaWFsLTAK  # Client secret
          sonar.auth.oidc.loginStrategy: Preferred username
          sonar.auth.oidc.providerConfiguration: '{"issuer":"<platform-url>/dex","authorization_endpoint":"<platform-url>/dex/auth","token_endpoint":"<platform-url>/dex/token","jwks_uri":"<platform-url>/dex/keys","response_types_supported":["code","id_token","token"],"subject_types_supported":["public"],"id_token_signing_alg_values_supported":["RS256"],"scopes_supported":["openid","email","groups","profile","offline_access"],"token_endpoint_auth_methods_supported":["client_secret_basic"],"claims_supported":["aud","email","email_verified","exp","iat","iss","locale","name","sub"]}'

    Включение SSO для платформ с самоподписанными сертификатами

    Если доступ к платформе осуществляется по https с использованием самоподписанного сертификата, необходимо смонтировать CA самоподписанного сертификата в экземпляр SonarQube. Метод следующий:

    В пространстве имён cpaas-system глобального кластера найдите секрет с именем dex.tls, получите из него содержимое ca.crt и tls.crt, сохраните как новый секрет и создайте его в пространстве имён экземпляра SonarQube.

    apiVersion: v1
    data:
      ca.crt: <base64 encode data>
      tls.crt: <base64 encode data>
    kind: Secret
    metadata:
      name: dex-tls
      namespace: cpaas-system

    Отредактируйте экземпляр SonarQube для использования этого CA:

    spec:
      helmValues:
        caCerts:
          enabled: true
          secret: dex-tls

    Использование в чисто IPv6 кластерах

    При развертывании в среде чисто IPv6 кластера необходимо явно настроить параметры протокола IPv6, поскольку Java по умолчанию поддерживает dual-stack. Добавьте следующую конфигурацию для обеспечения корректного подключения:

    spec:
      helmValues:
        env:
          - name: JAVA_TOOL_OPTIONS
            value: '-Djava.net.preferIPv6Addresses=true'
        sonarProperties:
          sonar.cluster.node.search.host: '[::1]'
          sonar.cluster.node.es.host: '[::1]'
          sonar.web.javaAdditionalOpts: '-javaagent:/opt/sonarqube/extensions/plugins/sonarqube-community-branch-plugin-1.23.1.jar=web -Djava.net.preferIPv6Addresses=true'