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

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

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

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

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

    Рекомендация: Создайте отдельное пространство имен для развертывания 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-community-build/server-installation/server-host-requirements

    Не используйте сетевое хранилище в качестве backend-хранилища

    Не используйте StorageClass, PVC или другое удаленно подключаемое хранилище на основе сетевого хранилища для постоянного хранения SonarQube в production-средах. SonarQube внутренне использует Elasticsearch, а в официальных требованиях SonarSource к хосту указано, что для каталога SonarQube data не следует использовать удаленно подключаемое хранилище, такое как NFS, SMB/CIFS или NAS, поскольку оно часто медленнее, имеет большую вариативность задержек и становится единой точкой отказа. В официальном документе также указан затрагиваемый путь как <sonarqubeHome>/data, где хранятся индексы Elasticsearch и где требуется высокая производительность ввода-вывода.

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

    Связанные ссылки:

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

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

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

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

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

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

    • Ресурсы вычислений: 8 CPU cores, 16 Gi памяти
    • Хранилище: использовать PVC storage, настроить storage class
    • Сетевой доступ: использовать Domain для доступа к сервису.

    Развертывание из 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:

    Warning

    Не выбирайте StorageClass на основе сетевого хранилища для постоянного хранения SonarQube. Используйте backend-хранилище с низкой задержкой и высокой производительностью чтения/записи.

    spec:
      helmValues:
        persistence:
          enabled: true
          storageClass: <storage-class.rwm> ## StorageClass needs to be created in advance
          size: 10Gi

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

    spec:
      helmValues:
        persistence:
          enabled: true
          existingClaim: sonarqube-pvc ## PVC needs to be created in advance

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

    spec:
      helmValues:
        nodeSelector:
          kubernetes.io/hostname: <node.random>  ## Select the deployment node
        
        persistence:
          enabled: false
          host:
            nodeName: <node.random> ## Name of the node
            path: /tmp/sonarqube-<template.{{randAlphaNum 10}}> ## Select the deployment node and specify the storage path

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

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

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

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

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

    spec:
      helmValues:
        postgresql:
          enabled: false ## Disable the default PostgreSQL instance
        jdbcOverwrite:
          enable: true
          jdbcSecretName: postgres-password ## Credentials for connecting to PG
          jdbcUrl: jdbc:postgresql://<pg.host>:<pg.port>/<pg.database>?socketTimeout=1500 ## Address for connecting to PG
          jdbcUsername: postgres ## PG access user

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

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

    Укажите это для SonarQube через YAML:

    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: # Disable the default prometheus monitoring, jar packages need to be added in advance when starting
          enabled: false
        resources: # Set resource limits
          limits:
           cpu: 800m
           memory: 4Gi
          requests:
           cpu: 400m
           memory: 2Gi
        postgresql: # Disable the default PostgreSQL instance
          enabled: false
        jdbcOverwrite: # Use a pre-created PostgreSQL instance
          enable: true
          jdbcSecretName: postgres-password
          jdbcUrl: jdbc:postgresql://<pg.host>:<pg.port>/<pg.database>?socketTimeout=1500
          jdbcUsername: <pg.username>
        service: # Use NodePort to expose the SonarQube instance
          name: sonarqube
          type: NodePort
          nodePort: <nodeport.http>
        account: # Set Root password
          adminPasswordSecretName: sonarqube-root-password
        persistence: # Use PVC for storage mounting
          enabled: true
          existingClaim: sonarqube-pvc

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

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

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

    • Создайте следующий ресурс OAuth2Client в глобальном кластере, чтобы зарегистрировать клиент аутентификации SSO.
    • Настройте экземпляр SonarQube для использования аутентификации SSO
    apiVersion: dex.coreos.com/v1
    kind: OAuth2Client
    name: OIDC
    metadata:
      name: onxw4ylsof2wezjnmrsxrs7sttsiiirdeu # This value is calculated based on the hash of the id field, online calculator: https://go.dev/play/p/QsoqUohsKok
      namespace: cpaas-system
    id: sonarqube-dex # Client id
    public: false
    redirectURIs:
      - <sonarqube-host>/* # SonarQube authentication callback address, where <sonarqube-host> is replaced with the access address of the SonarQube instance
    secret: Z2l0bGFiLW9mZmljaWFsLTAK # Client secret
    spec: {}
    ПолеОписаниеПример
    nameОтображаемое имя ресурса.OIDC
    idClient ID для аутентификации SSO. Допускается любое значение, кроме alauda-dex, которое зарезервировано и может вызвать конфликт.sonarqube-dex
    secretClient 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 глобального кластера найдите secret с именем dex.tls, извлеките из него содержимое ca.crt и tls.crt, сохраните его как новый secret и создайте его в пространстве имен экземпляра 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-26.1.0.jar=web -Djava.net.preferIPv6Addresses=true'