关注公众号「Linux 容器运维」,回复【对应关键词】(如 docker/k8s/linux/ 面试),即可获取完整版干货,复制到生产环境直接使用~ 更多内容已同步至【公众号官方合集】,点击公众号主页「合集」→「kubernetes」,即可查看全部最新内容,持续更新中~
安装说明
K8S版本为v1.26.6 Helm 版本:v3.12.1 harbor版本:2.10.2
准备开始
本次安装只讨论容器化部署,裸机部署的请直接查看官方文档。 harbor 官网 Helm 安装教程
下载 harbor 安装包
bash
# 添加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要不你没法配置。)
yaml
## 下面这些是配置 访问 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小时。
安装自己的需求修改好以后开始安装
bash
helm install harbor ./ -n harbor
bash
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状态
bash
[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 方式访问的 账号密码都在配置文件里面。