Harbor 使用 Helm 一键安装

本文详细介绍如何使用HelmChart在Kubernetes集群上安装Harbor,包括配置暴露服务、TLS、外部URL及数据持久化等关键步骤。

 

安装 Harbor

Harbor 支持多种安装方式,源码目录下面默认有一个安装脚本(make/install.sh),采用 docker-compose 的形式运行 Harbor 各个组件,和前面的课程一样,我们这里依然还是将 Harbor 安装到 Kubernetes 集群中,如果我们对 Harbor 的各个组件之间的运行关系非常熟悉,同样的,我们可以自己手动编写资源清单文件进行部署,不过 Harbor 源码目录中也为我们提供了生成这些资源清单的脚本文件了(make/kubernetes/k8s-prepare),我们只需要执行下面的命令即可为我们生成所需要用到的 YAML 文件了:

$ python make/kubernetes/k8s-prepare

当然了如果上面的一些基本配置不能满足你的需求,你也可以做一些更高级的配置。你可以在make/common/templates目录下面找到所有的 Harbor 的配置模板,做相应的修改即可。

不过我们这里给大家介绍另外一种简单的安装方法:Helm,Harbor 官方提供了对应的 Helm Chart 包,所以我们可以很容易安装。

首先下载 Harbor Chart 包到要安装的集群上:

$ git clone https://github.com/goharbor/harbor-helm

切换到我们需要安装的分支,比如我们这里使用 1.0.0分支:

$ cd harbor-helm
$ git checkout 1.0.0

安装 Helm Chart 包最重要的当然是values.yaml文件了,我们可以通过覆盖该文件中的属性来改变配置:

expose:
  # 设置暴露服务的方式。将类型设置为 ingress、clusterIP或nodePort并补充对应部分的信息。
  type: ingress
  tls:
    # 是否开启 tls,注意:如果类型是 ingress 并且tls被禁用,则在pull/push镜像时,则必须包含端口。详细查看文档:https://github.com/goharbor/harbor/issues/5291。
    enabled: true
    # 如果你想使用自己的 TLS 证书和私钥,请填写这个 secret 的名称,这个 secret 必须包含名为 tls.crt 和 tls.key 的证书和私钥文件,如果没有设置则会自动生成证书和私钥文件。
    secretName: ""
    # 默认 Notary 服务会使用上面相同的证书和私钥文件,如果你想用一个独立的则填充下面的字段,注意只有类型是 ingress 的时候才需要。
    notarySecretName: ""
    # common name 是用于生成证书的,当类型是 clusterIP 或者 nodePort 并且 secretName 为空的时候才需要
    commonName: ""
  ingress:
    hosts:
      core: core.harbor.domain
      notary: notary.harbor.domain
    annotations:
      ingress.kubernetes.io/ssl-redirect: "true"
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
      ingress.kubernetes.io/proxy-body-size: "0"
      nginx.ingress.kubernetes.io/proxy-body-size: "0"
  clusterIP:
    # ClusterIP 服务的名称
    name: harbor
    ports:
      httpPort: 80
      httpsPort: 443
      # Notary 服务监听端口,只有当 notary.enabled 设置为 true 的时候有效
      notaryPort: 4443
  nodePort:
    # NodePort 服务名称
    name: harbor
    ports:
      http:
        port: 80
        nodePort: 30002
      https:
        port: 443
        nodePort: 30003
      notary:
        port: 4443
        nodePort: 30004

# Harbor 核心服务外部访问 URL。主要用于:
# 1) 补全 portal 页面上面显示的 docker/helm 命令
# 2) 补全返回给 docker/notary 客户端的 token 服务 URL

# 格式:protocol://domain[:port]。
# 1) 如果 expose.type=ingress,"domain"的值就是 expose.ingress.hosts.core 的值
# 2) 如果 expose.type=clusterIP,"domain"的值就是 expose.clusterIP.name 的值
# 3) 如果 expose.type=nodePort,"domain"的值就是 k8s 节点的 IP 地址

# 如果在代理后面部署 Harbor,请将其设置为代理的 URL
externalURL: https://core.harbor.domain

# 默认情况下开启数据持久化,在k8s集群中需要动态的挂载卷默认需要一个StorageClass对象。
# 如果你有已经存在可以使用的持久卷,需要在"storageClass"中指定你的 storageClass 或者设置 "existingClaim"。
#
# 对于存储 docker 镜像和 Helm charts 包,你也可以用 "azure"、"gcs"、"s3"、"swift" 或者 "oss",直接在 "imageChartStorage" 区域设置即可
persistence:
  enabled: true
  # 设置成"keep"避免在执行 helm 删除操作期间移除 PVC,留空则在 chart 被删除后删除 PVC
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      # 使用一个存在的 PVC(必须在绑定前先手动创建)
      existingClaim: ""
      # 指定"storageClass",或者使用默认的 StorageClass 对象,设置成"-"禁用动态分配挂载卷
      storageClass: ""
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
    chartmuseum:
      existingClaim: ""
      storageClass: ""
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
    jobservice:
      existingClaim: ""
      storageClass: ""
      subPath: ""
      

转载于:https://www.cnblogs.com/cheyunhua/p/10437167.html

Kubernetes 配置与密钥管理实践指南,使用 ConfigMap 和 Secret 管理应用配置,实现 dev/prod 环境切换,并通过 Helm 实现集中化管理和版本控制。 --- ### 一、基础概念快速理解 1. **ConfigMap**:存储非敏感配置数据(如环境变量、配置文件) 2. **Secret**:存储敏感信息(如密码、API密钥),数据以 Base64 编码存储 3. **Helm**:Kubernetes 包管理工具,实现配置模板化和版本控制 4. **多环境管理**:使用不同配置文件切换开发和生产环境 --- ### 二、详细实现步骤 #### 步骤1:创建目录结构 ```bash myapp/ ├── base/ # 基础配置 │ ├── configmap.yaml │ ├── secret.yaml │ └── kustomization.yaml ├── overlays/ # 环境覆盖配置 │ ├── dev/ │ │ ├── configmap-patch.yaml │ │ ├── secret-patch.yaml │ │ └── kustomization.yaml │ └── prod/ │ ├── configmap-patch.yaml │ ├── secret-patch.yaml │ └── kustomization.yaml └── helm/ # Helm 模板 ├── Chart.yaml ├── values.yaml └── templates/ ├── deployment.yaml ├── configmap.yaml └── secret.yaml ``` #### 步骤2:创建基础配置(base/) **base/configmap.yaml** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: # 公共配置 app.properties: | server.port=8080 logging.level=INFO # 环境特定占位符 db.host=${DB_HOST} db.port=${DB_PORT} ``` **base/secret.yaml** ```yaml apiVersion: v1 kind: Secret metadata: name: app-secret type: Opaque data: # 使用base64编码占位符 db.username: ${DB_USERNAME} db.password: ${DB_PASSWORD} ``` **base/kustomization.yaml** ```yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - configmap.yaml - secret.yaml ``` #### 步骤3:创建开发环境覆盖配置(overlays/dev/) **overlays/dev/configmap-patch.yaml** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: app.properties: | db.host=dev-db.example.com db.port=3306 ``` **overlays/dev/secret-patch.yaml** ```yaml apiVersion: v1 kind: Secret metadata: name: app-secret data: db.username: ZGV2LXVzZXI= # base64("dev-user") db.password: ZGV2LXBhc3M= # base64("dev-pass") ``` **overlays/dev/kustomization.yaml** ```yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../base patches: - path: configmap-patch.yaml - path: secret-patch.yaml ``` #### 步骤4:创建生产环境覆盖配置(overlays/prod/) **overlays/prod/configmap-patch.yaml** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: app.properties: | db.host=prod-db.example.com db.port=5432 ``` **overlays/prod/secret-patch.yaml** ```yaml apiVersion: v1 kind: Secret metadata: name: app-secret data: db.username: cHJvZC11c2Vy # base64("prod-user") db.password: cHJvZC1wYXNzd29yZA== # base64("prod-password") ``` **overlays/prod/kustomization.yaml** ```yaml apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - ../../base patches: - path: configmap-patch.yaml - path: secret-patch.yaml ``` #### 步骤5:创建 Helm 模板(helm/) **helm/Chart.yaml** ```yaml apiVersion: v2 name: myapp description: My Application Helm Chart version: 0.1.0 ``` **helm/values.yaml** ```yaml # 默认值 environment: dev replicaCount: 1 config: dbHost: "default-db.example.com" dbPort: "3306" secret: dbUsername: "default-user" dbPassword: "default-pass" ``` **helm/templates/configmap.yaml** ```yaml apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-config data: app.properties: | server.port=8080 logging.level=INFO db.host={{ .Values.config.dbHost }} db.port={{ .Values.config.dbPort }} ``` **helm/templates/secret.yaml** ```yaml apiVersion: v1 kind: Secret metadata: name: {{ .Release.Name }}-secret type: Opaque data: db.username: {{ .Values.secret.dbUsername | b64enc }} db.password: {{ .Values.secret.dbPassword | b64enc }} ``` **helm/templates/deployment.yaml** ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-deployment spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: app image: myapp:{{ .Values.environment }} volumeMounts: - name: config-volume mountPath: /etc/config - name: secret-volume mountPath: /etc/secret readOnly: true env: - name: ENVIRONMENT value: {{ .Values.environment }} volumes: - name: config-volume configMap: name: {{ .Release.Name }}-config - name: secret-volume secret: secretName: {{ .Release.Name }}-secret ``` #### 步骤6:部署应用到不同环境 ```bash # 部署开发环境 helm install myapp-dev ./helm \ --set environment=dev \ --set config.dbHost="dev-db.example.com" \ --set config.dbPort="3306" \ --set secret.dbUsername="dev-user" \ --set secret.dbPassword="dev-pass" # 部署生产环境 helm install myapp-prod ./helm \ --set environment=prod \ --set replicaCount=3 \ --set config.dbHost="prod-db.example.com" \ --set config.dbPort="5432" \ --set secret.dbUsername="prod-user" \ --set secret.dbPassword="prod-password" ``` #### 步骤7:验证配置 ```bash # 检查ConfigMap kubectl get configmap -l app=myapp -o yaml # 检查Secret(注意:密码会以base64显示) kubectl get secret -l app=myapp -o yaml # 查看Pod中的环境变量 kubectl exec <pod-name> -- env | grep DB_ ``` --- ### 三、配置热重载(可选) 在Deployment中添加注解实现配置自动重载: ```yaml # 在helm/templates/deployment.yaml中添加 spec: template: metadata: annotations: config.reload/reload: "true" spec: containers: - name: app lifecycle: postStart: exec: command: ["/bin/sh", "-c", "touch /etc/config/reload"] ``` --- ### 四、版本控制与CI/CD集成 1. 将整个配置目录提交到Git仓库 2. 使用Helm版本管理: ```bash # 打包Chart helm package ./helm # 查看版本历史 helm history myapp-dev # 回滚到上一版本 helm rollback myapp-dev 1 ``` 3. 在CI/CD流水线中添加: ```yaml # GitLab CI示例 deploy_dev: stage: deploy script: - helm upgrade --install myapp-dev ./helm -f ./overlays/dev/values.yaml only: - dev deploy_prod: stage: deploy script: - helm upgrade --install myapp-prod ./helm -f ./overlays/prod/values.yaml only: - main ``` --- ### 五、安全最佳实践 1. **Secret加密**: ```bash # 使用Kubernetes加密Secret kubectl create secret generic prod-secret \ --from-literal=username=prod-user \ --from-literal=password=prod-password \ --dry-run=client -o yaml | \ kubeseal --format yaml > sealed-secret.yaml ``` 2. **RBAC权限控制**: ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: config-reader rules: - apiGroups: [""] resources: ["configmaps", "secrets"] verbs: ["get", "watch", "list"] ``` --- ### 六、常见问题解决 1. **ConfigMap未更新**: ```bash # 手动重启Pod kubectl rollout restart deployment/<deployment-name> ``` 2. **Secret解码**: ```bash echo <base64-string> | base64 --decode ``` 3. **环境变量注入**: ```yaml env: - name: DB_HOST valueFrom: configMapKeyRef: name: app-config key: db.host ``` --- ### 七、学习资源推荐 1. 官方文档:[ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) | [Secret](https://kubernetes.io/docs/concepts/configuration/secret/) 2. 入门书籍:《Kubernetes in Action》 3. 实践教程:[Kustomize 官方指南](https://kubectl.docs.kubernetes.io/guides/config_management/) ---按照以上步骤实现后,怎么去演示各个功能点
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值