Nexus 实例部署

Deprecated: Nexus 3.81 (nexus-ce-operator v3.81.1 and v3.81.2)

由于 Nexus 3.81 Community Edition 的限制性限制,该版本已被弃用。一旦使用达到配额限制(总组件数 100,000 和每日请求数 200,000),实例将无法正常工作。

如果您已经升级到 3.81 版本,请按照回滚到 Nexus 3.76指南进行降级。

有关 Community Edition 限制的更多信息,请参见Community Edition Limitations

本文档介绍了 Nexus Operator 的订阅及 Nexus 实例的部署功能。

Namespace Security Policy Restrictions

由于以下原因,Nexus 不支持在设置了 SPA(Security Policy Admission)策略为 Restricted 的命名空间中部署:

  1. Init 容器需要 root 权限:Nexus 使用 init 容器初始化 PVC 目录权限,需 root 权限,而 Restricted 策略不允许。

建议:为 Nexus 部署创建专用命名空间,确保其安全策略设置为 Restricted。使用 hostPath 存储部署 Nexus 时,命名空间安全策略必须配置为 Privileged

前提条件

  • 本文档适用于平台提供的 Nexus 3.76 及以上版本,基于 Operator 等技术与平台解耦。
  • 请确保目标集群已部署(订阅)Nexus Operator,即 Nexus Operator 已准备好创建实例。

部署规划

Nexus 支持多种资源配置以满足不同客户场景。不同场景下所需资源和配置差异较大。因此,本节描述部署 Nexus 实例前需考虑的方面及决策点的影响,帮助用户基于此信息进行后续具体实例部署。

基本信息

  1. 平台提供的 Nexus Operator 基于社区官方 Nexus Chart,增强了安全漏洞修复等企业能力。功能上与社区版完全兼容,用户体验上通过可选自定义模板等方式提升了 Nexus 部署的便捷性。

实例部署

通过 Quick Start Template 部署

该模板用于快速创建轻量级 Nexus 实例,适合开发和测试场景,不建议用于生产环境。

  • 计算资源:2 CPU 核,4 Gi 内存
  • 存储:使用节点本地存储,配置存储节点 IP 和路径
  • 网络访问:使用 NodePort 访问服务,共享节点 IP 和存储,指定端口

根据模板提示填写相关信息完成部署。

通过 Production Template 部署

该模板用于快速创建生产级 Nexus 实例,适合生产场景,推荐用于生产环境。

  • 计算资源:4 CPU 核,8 Gi 内存
  • 存储:使用 PVC 存储,配置存储类
  • 网络访问:使用域名访问服务

根据模板提示填写相关信息完成部署。

通过 YAML 部署

资源配置

Nexus 通过 StatefulSet 部署,包含 4 个容器:1 个业务容器和 3 个日志容器。配置资源时重点关注业务容器资源,日志容器可使用默认配置。

spec:
  helmValues:
    statefulset:
      container:
        resources:
          requests:
            cpu: 2
            memory: "4Gi"
          limits:
            cpu: 4
            memory: "8Gi"

更多信息请参考 SonarQube Chart 中的资源描述

网络配置

网络配置分为两类:

  • 基于 ingress 的网络配置
  • 基于 NodePort 的网络配置

基于 ingress 的网络配置支持 https 和 http 协议,需提前在集群中部署 ingress controller。

spec:
  helmValues:
    service:
      nexus:
        enabled: true
        type: ClusterIP
    ingress:
      enabled: true
      host: test-ingress-http.example.com
      defaultRule: true
      tls:
        - secretName: "test-tls-cert"
          hosts:
          - test-ingress-https.example.com

基于 NodePort 的网络配置:

spec:
  helmValues:
    service:
      nexus:
        enabled: true
        nodePort: 30100

存储配置

存储配置主要分为三类:

  • 基于 StorageClass 的存储配置
  • 基于 PVC 的存储配置
  • 基于 HostPath 的存储配置

基于 StorageClass 的存储配置:

spec:
  helmValues:
    storageClass:
      name: <storage-class> ## StorageClass 需提前创建
    pvc:
      volumeClaimTemplate:
        enabled: true
      storage: 200Gi   ## 根据实际需求调整

基于 PVC 的存储配置:

spec:
  helmValues:
    pvc:
      existingClaim: "nexus-pvc" ## PVC 需提前创建

基于 HostPath 的存储配置:

spec:
  helmValues:
    hostPath: /data/nexus ## 选择部署节点并指定存储路径

    statefulset:
      nodeSelector:
        kubernetes.io/hostname: node1 ## 选择部署节点
    nodeSelector:
      kubernetes.io/hostname: node1

管理员账号配置

将准备好的管理员密码写入 Secret,默认登录用户名为 admin

创建 Secret,选择 Opaque 类型,配置项中添加 password 字段:

apiVersion: v1
data:
  password: <base64 encode password>
kind: Secret
metadata:
  name: nexus-password
type: Opaque

通过 YAML 指定给 Nexus:

spec:
  helmValues:
    secret:
      nexusAdminSecret:
        enabled: true
        existingSecret: "nexus-password"
        secretKey: "password"

完整 YAML 示例

NodePort、HostPath、管理员账号

apiVersion: operator.alaudadevops.io/v1alpha1
kind: Nexus
metadata:
  name: gitlab
  namespace: aesfv-1-testns
spec:
  helmValues:
    secret:
      nexusAdminSecret:
        enabled: true
        existingSecret: aesfv-restore-source
        secretKey: password
      nexusSecret:
        enabled: true
        secretKeyfile: |
          {
            "active": "default",
            "keys": [
              {
                "id": "default",
                "key": "default-key"
              }
            ]
          }
    statefulset:
      container:
        resources:
          requests:
            cpu: 2
            memory: 4Gi
          limits:
            cpu: 4
            memory: 8Gi
        env:
          zeroDowntimeEnabled: true
      nodeSelector:
        kubernetes.io/hostname: node1
    service:
      nexus:
        enabled: true
        nodePort: 30100
    hostPath: /tmp/nexus