Harbor容器化部署

安装说明

K8S版本为v1.26.6
Helm 版本:v3.12.1
harbor版本:2.10.2

准备开始

本次安装只讨论容器化部署,裸机部署的请直接查看官方文档。
harbor 官网
Helm 安装教程

下载 harbor 安装包

# 添加helm源
helm repo add harbor https://helm.goharbor.io

# 下载 harbor 安装包,注意:不指定版本默认下载最新版。
helm pull harbor/harbor

# 解压
tar -xf harbor-1.14.2.tgz

[root@master01 harbor]# ls
Chart.yaml  LICENSE  README.md  templates  values.yaml

字段解释

查看 values.yaml 文件配置(注释我删除了 要不太长了.至少用过一段时间的K8S要不你没法配置。)

## 下面这些是配置 访问 Harbor 的方式以及详细的配置
expose:
  type: ingress                         # 选择通过什么方式暴漏你的服务,这里使用 ingress 方式暴漏。可选的有:"ingress", "clusterIP", "nodePort" or "loadBalancer"
  tls:
    enabled: true                       # 是否启用HTTPS
    certSource: secret                  # 是否自动生成 tls证书,当前是用自己的证书。如果需要自动生成证书修改为 auto 即可
    auto:
      commonName: ""                    # 自动生成证书的是你这个地方需要修改为访问的域名
    secret:
      secretName: "harbor-peopleurl-cn" # 使用自己单位的证书 的时候这个地方需要修改为 secret名字,如果是自动生成证书这个地方设置为空。

  ingress:                              # 上面选择了 ingress 方式以后需要根据自己需求配置ingress
    hosts:
      core: harbor.ppleurl.cn         # 访问harbor镜像仓库的域名
    controller: default                 # 定义了使用的Ingress控制器的类型。默认情况下,它被设置为default,这意味着它将使用Kubernetes集群中默认的Ingress控制器。但是,如果你的集群中部署了特定的Ingress控制器(如GCE、NCP、ALB或F5 BIG-IP),你可以在这里指定它。
    kubeVersionOverride: ""             # 允许你在创建Ingress时覆盖.Capabilities.KubeVersion.Version的值。在大多数情况下,这个字段应该留空。
    className: ""                       # 指定Ingress资源的类。在某些Kubernetes环境中,可以使用Ingress类来指定应处理该Ingress资源的Ingress控制器。留空意味着使用默认的Ingress类。
    annotations:                        # ingress 注解 它们为Ingress资源提供了额外的配置选项。这些注解通常由特定的Ingress控制器识别并用于定制Ingress的行为。
      ingress.kubernetes.io/ssl-redirect: "true"    # 当设置为"true"时,这个注解告诉Ingress控制器将所有HTTP请求重定向到HTTPS。
      ingress.kubernetes.io/proxy-body-size: "0"    # 这个注解用于设置Ingress代理后端服务时允许的最大请求体大小。设置为"0"表示没有限制
      nginx.ingress.kubernetes.io/ssl-redirect: "true"   # 这些是特定于Nginx Ingress控制器的注解,与上面的注解有相同的功能。
      nginx.ingress.kubernetes.io/proxy-body-size: "0"   # 这些是特定于Nginx Ingress控制器的注解,与上面的注解有相同的功能。
    harbor:
      annotations: {}           # 这是一个空的注解集合,用于为Harbor的Ingress资源添加特定的注解。你可以在这里添加Harbor特定的注解,例如用于身份验证或自定义路由的注解
      labels: {}                # 这是一个空的标签集合,用于为Harbor的Ingress资源添加自定义的标签。这些标签可以用于在Kubernetes集群中标识和选择Ingress资源。


#  clusterIP 方式暴漏服务 以为上面写了 ingress方式暴漏服务所以这个里面不用修改
  clusterIP:
    name: harbor                 # clusterIP 服务名称
    staticClusterIP: ""          # 是否需要静态ip地址,一般不用静态ip地址
    annotations: {}              # 用于为ClusterIP服务添加注解。
    ports:                       # 端口配置
      httpPort: 80
      httpsPort: 443

#  nodePort 方式暴漏服务 以为上面写了 ingress方式暴漏服务所以这个里面不用修改
  nodePort:
    name: harbor
    ports:
      http:
        port: 80
        nodePort: 30002
      https:
        port: 443
        nodePort: 30003

#  loadBalancer 方式暴漏服务 以为上面写了 ingress方式暴漏服务所以这个里面不用修改   
  loadBalancer:
    name: harbor
    IP: ""
    ports:
      httpPort: 80
      httpsPort: 443
    annotations: {}
    sourceRanges: []

externalURL: https://harbor.peopleurl.cn   # 访问 Harbor 的域名 

## 这是关于Harbor内部TLS(传输层安全性)配置的部分。TLS用于加密Harbor各组件之间的通信,以确保数据在传输过程中的安全性。
internalTLS:
  enabled: false      # 是否启用内部TLS。设置为false表示不启用TLS。
  strong_ssl_ciphers: false
  certSource: "auto"   # auto 表示自动生成证书,
  trustCa: ""

  core:
    secretName: ""
    crt: ""
    key: ""
  jobservice:
    secretName: ""
    crt: ""
    key: ""
  registry:
    secretName: ""
    crt: ""
    key: ""
  portal:
    secretName: ""
    crt: ""
    key: ""
  trivy:
    secretName: ""
    crt: ""
    key: ""

## 用于配置IPv4和IPv6在集群中的启用状态。
ipFamily:
  ipv6:
    enabled: true
  ipv4:
    enabled: true

## 配置个个组件的持戒话存储
persistence:
  enabled: true                 # 是否启用存储
  resourcePolicy: "keep"        # helm 删除操作期间保持 PVC(PersistentVolumeClaim)不变。如果不设置或为空,则在删除 Helm chart 时会删除 PVC
  persistentVolumeClaim:
    registry:
      existingClaim: ""         # 如果要使用现有的 PVC,则指定其名称。如果为空,则会动态创建一个新的 PVC。
      storageClass: ""          # 用于供应存储的存储类。如果为空,则使用默认的存储类。设置为 "-" 以禁用动态供应。
      subPath: ""               # 如果 PVC 与其他组件共享,则指定子路径。
      accessMode: ReadWriteOnce # 访问模式
      size: 5Gi                 # 存储卷大小
      annotations: {}           # 是否添加PVC注解
    jobservice:
      jobLog:
        existingClaim: ""
        storageClass: ""
        subPath: ""
        accessMode: ReadWriteOnce
        size: 1Gi
        annotations: {}
    database:
      existingClaim: ""
      storageClass: ""
      subPath: ""
      accessMode: ReadWriteOnce
      size: 1Gi
      annotations: {}
    redis:
      existingClaim: ""
      storageClass: ""
      subPath: ""
      accessMode: ReadWriteOnce
      size: 1Gi
      annotations: {}
    trivy:
      existingClaim: ""
      storageClass: ""
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
      annotations: {}
 
 ## 对象存储配置
  imageChartStorage:
    disableredirect: false                    # 是否禁用重定向。对于不支持重定向的存储后端(如使用 MinIO 作为 S3 存储类型),应将其设置为 true。默认情况下,它设置为 false。
    type: filesystem                          # 指定存储类型。可选项包括 "filesystem", "azure", "gcs", "s3", "swift", "oss" 等。这里设置为 "filesystem",表示使用文件系统作为存储后端。
    filesystem:
      rootdirectory: /storage                 # 指定文件系统上的根目录,用于存储镜像和图表
      #maxthreads: 100                        # 指定用于处理存储请求的最大线程数。
    azure:
      accountname: accountname
      accountkey: base64encodedaccountkey
      container: containername
      existingSecret: ""
    gcs:
      bucket: bucketname
      encodedkey: base64-encoded-json-key-file
      existingSecret: ""
      useWorkloadIdentity: false
    s3:
      region: us-west-1
      bucket: bucketname
    swift:
      authurl: https://storage.myprovider.com/v3/auth
      username: username
      password: password
      container: containername
      existingSecret: ""
    oss:
      accesskeyid: accesskeyid
      accesskeysecret: accesskeysecret
      region: regionname
      bucket: bucketname
      existingSecret: ""

imagePullPolicy: IfNotPresent       # 镜像拉去策略
imagePullSecrets:                   # 用于从私有容器镜像仓库拉取镜像时提供凭据的字段。它允许你定义一组密钥(Secrets),这些密钥包含用于访问私有仓库的凭据(如用户名和密码或访问令牌)。
updateStrategy:                     # Pod 更新策略
  type: RollingUpdate
logLevel: info                      # 定义了日志记录的级别。 

existingSecretAdminPasswordKey: HARBOR_ADMIN_PASSWORD # 这个配置项用于指定一个已经存在的 Kubernetes Secret 中包含 Harbor 管理员初始密码的键名。如果你设置了这个值,那么 Harbor 就不会使用 harborAdminPassword 配置项中的密码,而是会查找指定的 Secret 并使用该 Secret 中指定键名的值作为管理员密码。
harborAdminPassword: "Harbor12345"                    # 这是 Harbor 管理员的初始密码。默认情况下,当你首次启动 Harbor 时,你会使用这个密码登录到 Harbor 的管理界面。

caSecretName: "" # 这个配置项用于指定一个包含 CA 证书(通常是 ca.crt 文件)的 Kubernetes Secret 的名称。如果你设置了这个值,那么当 Harbor 不自动生成证书时,用户可以通过 Harbor 的管理界面下载这个 CA 证书。这通常用于客户端(如 Docker 客户端)在访问 Harbor 时进行验证。
secretKey: "not-a-secure-key" # 这个配置项用于指定一个加密密钥,Harbor 会使用这个密钥来加密一些敏感数据(如密码)。出于安全考虑,这个密钥应该是一个足够复杂的、长度为 16 个字符的字符串。
existingSecretSecretKey: "" # 这个配置项与 secretKey 类似,但是它允许你指定一个已经存在的 Kubernetes Secret 中包含加密密钥的键名。如果你设置了这个值,那么 Harbor 就不会使用 secretKey 配置项中的密钥,而是会查找指定的 Secret 并使用该 Secret 中指定键名的值作为加密密钥。

## 这段配置片段是用于配置 Harbor 及其组件使用的代理设置,并设置是否启用 Helm 迁移钩子的
proxy:
  httpProxy:
  httpsProxy:
  noProxy: 127.0.0.1,localhost,.local,.internal
  components:
    - core
    - jobservice
    - trivy
enableMigrateHelmHook: false  # 是否启用迁移钩子

## 这部分是关于 Nginx 的配置,Nginx 通常用作 Harbor 的反向代理和负载均衡器。
nginx:
  image:  # nginx 镜像
    repository: goharbor/nginx-photon
    tag: v2.10.2
  serviceAccountName: ""  # 用于指定 Kubernetes 服务账户的名称,但在这里它是空的,意味着将使用默认的服务账户。
  automountServiceAccountToken: false    # 指定是否自动挂载服务账户令牌到 Pod 中。在这里它被设置为 false。
  replicas: 1    # nginx 副本数量
  revisionHistoryLimit: 10  # 保留旧版本的数量
  ## 下面这五个配置 是用于更细粒度地控制 Pod 调度的选项。
  extraEnvVars: []
  nodeSelector: {}
  tolerations: []
  affinity: {}
  topologySpreadConstraints: []
  #############################

  podAnnotations: {}  # 可以为 Nginx 的 Pod 添加额外的注释
  podLabels: {}       # 添加标签
  priorityClassName:  # 指定了 Pod 的优先级类,用于在资源紧张时决定 Pod 的调度顺序。

## 下面这些全是 Harbor 组件相关的Pod 配置大致和 nginx 相关的配置一样的。
portal:
  image:
    repository: goharbor/harbor-portal
    tag: v2.10.2
  serviceAccountName: ""
  automountServiceAccountToken: false
  replicas: 1
  revisionHistoryLimit: 10
  extraEnvVars: []
  nodeSelector: {}
  tolerations: []
  affinity: {}
  topologySpreadConstraints: []
  podAnnotations: {}
  podLabels: {}
  serviceAnnotations: {}
  priorityClassName:

core:
  image:
    repository: goharbor/harbor-core
    tag: v2.10.2
  serviceAccountName: ""
  automountServiceAccountToken: false
  replicas: 1
  revisionHistoryLimit: 10
  startupProbe:
    enabled: true
    initialDelaySeconds: 10
  # resources:
  #  requests:
  #    memory: 256Mi
  #    cpu: 100m
  extraEnvVars: []
  nodeSelector: {}
  tolerations: []
  affinity: {}
  topologySpreadConstraints: []
  podAnnotations: {}
  podLabels: {}
  serviceAnnotations: {}

  configureUserSettings:
  quotaUpdateProvider: db 
  secret: ""
  existingSecret: ""
  secretName: ""
  tokenKey: |
  tokenCert: |
  xsrfKey: ""
  existingXsrfSecret: ""
  existingXsrfSecretKey: CSRF_KEY
  priorityClassName:
  artifactPullAsyncFlushDuration:
  gdpr:
    deleteUser: false
    auditLogsCompliant: false

jobservice:
  image:
    repository: goharbor/harbor-jobservice
    tag: v2.10.2
  replicas: 1
  revisionHistoryLimit: 10
  serviceAccountName: ""
  automountServiceAccountToken: false
  maxJobWorkers: 10
  jobLoggers:
    - file
  loggerSweeperDuration: 14 #days
  notification:
    webhook_job_max_retry: 3
    webhook_job_http_client_timeout: 3 # in seconds
  reaper:
    max_update_hours: 24
    max_dangling_hours: 168
  extraEnvVars: []
  nodeSelector: {}
  tolerations: []
  affinity: {}
  topologySpreadConstraints:
  podAnnotations: {}
  podLabels: {}
  secret: ""
  existingSecret: ""
  existingSecretKey: JOBSERVICE_SECRET
  priorityClassName:

registry:
  serviceAccountName: ""
  automountServiceAccountToken: false
  registry:
    image:
      repository: goharbor/registry-photon
      tag: v2.10.2
    extraEnvVars: []
  controller:
    image:
      repository: goharbor/harbor-registryctl
      tag: v2.10.2
    extraEnvVars: []
  replicas: 1
  revisionHistoryLimit: 10
  nodeSelector: {}
  tolerations: []
  affinity: {}
  topologySpreadConstraints: []
  podAnnotations: {}
  podLabels: {}
  priorityClassName:
  secret: ""
  existingSecret: ""
  existingSecretKey: REGISTRY_HTTP_SECRET
  relativeurls: false
  credentials:
    username: "harbor_registry_user"
    password: "harbor_registry_password"
    existingSecret: ""
    htpasswdString: ""
  middleware:
    enabled: false
    type: cloudFront
    cloudFront:
      baseurl: example.cloudfront.net
      keypairid: KEYPAIRID
      duration: 3000s
      ipfilteredby: none
      privateKeySecret: "my-secret"
  upload_purging:
    enabled: true
    age: 168h
    interval: 24h
    dryrun: false

trivy:
  enabled: true
  image:
    repository: goharbor/trivy-adapter-photon
    tag: v2.10.2
  serviceAccountName: ""
  automountServiceAccountToken: false
  replicas: 1
  debugMode: false
  vulnType: "os,library"
  severity: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL"
  ignoreUnfixed: false
  insecure: false
  gitHubToken: ""
  skipUpdate: false
  skipJavaDBUpdate: false  
  offlineScan: false
  securityCheck: "vuln"
  timeout: 5m0s
  resources:
    requests:
      cpu: 200m
      memory: 512Mi
    limits:
      cpu: 1
      memory: 1Gi
  extraEnvVars: []
  nodeSelector: {}
  tolerations: []
  affinity: {}
  topologySpreadConstraints: []
  podAnnotations: {}
  podLabels: {}
  priorityClassName:

database:
  type: internal
  internal:
    serviceAccountName: ""
    automountServiceAccountToken: false
    image:
      repository: goharbor/harbor-db
      tag: v2.10.2
    password: "changeit"
    shmSizeLimit: 512Mi
    livenessProbe:
      timeoutSeconds: 1
    readinessProbe:
      timeoutSeconds: 1
    extraEnvVars: []
    nodeSelector: {}
    tolerations: []
    affinity: {}
    priorityClassName:
    initContainer:
      migrator: {}
      # resources:
      #  requests:
      #    memory: 128Mi
      #    cpu: 100m
      permissions: {}
      # resources:
      #  requests:
      #    memory: 128Mi
      #    cpu: 100m
  external:
    host: "192.168.0.1"
    port: "5432"
    username: "user"
    password: "password"
    coreDatabase: "registry"
    existingSecret: ""
    sslmode: "disable"
  maxIdleConns: 100
  maxOpenConns: 900
  podAnnotations: {}
  podLabels: {}

redis:
  type: internal
  internal:
    serviceAccountName: ""
    automountServiceAccountToken: false
    image:
      repository: goharbor/redis-photon
      tag: v2.10.2
    # resources:
    #  requests:
    #    memory: 256Mi
    #    cpu: 100m
    extraEnvVars: []
    nodeSelector: {}
    tolerations: []
    affinity: {}
    priorityClassName:
    jobserviceDatabaseIndex: "1"
    registryDatabaseIndex: "2"
    trivyAdapterIndex: "5"
  external:
    addr: "192.168.0.2:6379"
    sentinelMasterSet: ""
    coreDatabaseIndex: "0"
    jobserviceDatabaseIndex: "1"
    registryDatabaseIndex: "2"
    trivyAdapterIndex: "5"
    username: ""
    password: ""
    existingSecret: ""
  podAnnotations: {}
  podLabels: {}

exporter:
  replicas: 1
  revisionHistoryLimit: 10
  # resources:
  #  requests:
  #    memory: 256Mi
  #    cpu: 100m
  extraEnvVars: []
  podAnnotations: {}
  podLabels: {}
  serviceAccountName: ""
  automountServiceAccountToken: false
  image:
    repository: goharbor/harbor-exporter
    tag: v2.10.2
  nodeSelector: {}
  tolerations: []
  affinity: {}
  topologySpreadConstraints: []
  cacheDuration: 23
  cacheCleanInterval: 14400
  priorityClassName:

## Metrics(指标)
metrics:
  enabled: false # 表示指标收集是禁用的。如果设置为true,系统将收集并暴露一些指标。
  core:
    path: /metrics
    port: 8001
  registry:
    path: /metrics
    port: 8001
  jobservice:
    path: /metrics
    port: 8001
  exporter:
    path: /metrics
    port: 8001

  serviceMonitor:  # 这是一个关于Prometheus的ServiceMonitor的配置。
    enabled: false # 表示ServiceMonitor是禁用的。如果设置为true,Prometheus可以通过ServiceMonitor自动发现和抓取这些指标。
    additionalLabels: {}
    interval: ""
    metricRelabelings:
      []
    relabelings:
      []

trace:
  enabled: false   # 表示追踪功能是禁用的。如果设置为true,系统可能会生成和发送追踪数据。
  provider: jaeger
  sample_rate: 1
  jaeger:
    endpoint: http://hostname:14268/api/traces
  otel:
    endpoint: hostname:4318
    url_path: /v1/traces
    compression: false
    insecure: true
    timeout: 10

cache:
  enabled: false    # 表示缓存功能是禁用的。如果设置为true,系统可能会使用缓存来存储一些数据以加速访问。
  expireHours: 24   # 如果缓存功能启用,这个值定义了缓存项在过期前可以保留的小时数。这里是24小时。

安装自己的需求修改好以后开始安装

helm install harbor ./ -n harbor
NAME: harbor
LAST DEPLOYED: Fri May 17 14:27:18 2024
NAMESPACE: harbor
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at https://harbor.test.cn
For more details, please visit https://github.com/goharbor/harbor

查看Pod状态

[root@master01 ~]# kubectl get po -n warehouse 
NAME                                 READY   STATUS    RESTARTS        AGE
harbor-core-689f9844df-8rfs2         1/1     Running   3 (2d20h ago)   2d20h
harbor-database-0                    1/1     Running   0               2d20h
harbor-exporter-7f8d75b6-7qkvj       1/1     Running   3 (2d20h ago)   2d20h
harbor-jobservice-7c54445bc8-f4dkg   1/1     Running   5 (2d20h ago)   2d20h
harbor-portal-57867fcdb9-mr2lh       1/1     Running   0               2d20h
harbor-redis-0                       1/1     Running   0               2d20h
harbor-registry-58b695746b-www56     2/2     Running   0               2d20h
harbor-trivy-0                       1/1     Running   0               2d20h

到此部署完成 访问的话 我这里是通过 ingress 方式访问的 账号密码都在配置文件里面。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jenkins是一个持续集成工具,用于自动构建、测试和部署软件。Docker是一个开源的容器平台,可以帮助开发人员打包应用程序和其依赖项成为一个容器Harbor是一个企业级的Docker镜像注册表,可以帮助组织管理和存储Docker镜像。 在自动部署流程中,Jenkins可以与Docker和Harbor结合使用,实现自动构建、打包和部署应用程序的流程。具体步骤如下: 首先,开发人员在代码仓库中提交新的代码。Jenkins会定期检测代码仓库的变,一旦检测到新的代码提交,Jenkins就会触发自动构建流程。 在构建过程中,Jenkins会使用Docker来创建应用程序的镜像,将应用程序和其依赖项打包成一个可移植的容器。然后,Jenkins会将构建的镜像推送到Harbor中进行存储与管理。 接下来,Jenkins会触发自动部署流程。在部署过程中,Jenkins会从Harbor中拉取最新的镜像,并将其部署到目标环境中。这可以是测试环境、预发布环境或生产环境,具体取决于组织的部署策略。 在部署完成后,Jenkins可以执行自动测试流程,验证应用程序在目标环境中的运行情况。如果测试通过,部署流程就会顺利完成。如果测试失败,Jenkins会通知相关人员,并触发回滚流程。 通过整合Jenkins、Docker和Harbor,可以实现一个端到端的自动部署流程,帮助组织提高软件交付的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值