kubernetesの下にharborエンタープライズクラスdocker倉庫を構築


前言
harborはvmwareからオープンソースのエンタープライズクラスdocker repositoryで、プライベートウェアハウス、セキュリティ認証、権限管理、脆弱性スキャン、ウェアハウスレプリケーションなど多くの機能を提供しています.これまで構築されたharborのオンライン環境には様々な問題があったためです(これまで構築された方法は現在、公式に廃棄されています).https://github.com/vmware/harbor/blob/master/docs/kubernetes_deployment.md例えばuiが正常ではなく、権限認証が正常ではない)ので、最近は公式推奨のhelm方式でharborを再配置し、オフラインのharborを置き換えます.
の準備を
  • Kubernetesクラスタ1.8+
  • Kubernetes Ingress Controlが有効(ここではtraefik-ingressを選択)
  • kubectlクライアント1.8+
  • オプションの永続化機能は、PVまたはSC(ここではnfsで作成したPVとPVCを使用し、SCを使用する条件があればより便利)
  • を用意する必要があります.
    配備プロセス
  • まず、公式チュートリアルに従ってHelmをインストールし、Helmを初期化します. :初期化には、次のコマンドを使用してcanaryミラーを使用する必要があります.そうしないと、正常にインストールできません.helmデプロイメントファイルのフォーマットが正しくありません.これは既知のissueです.https://github.com/vmware/harbor/issues/4484
    helm init --canary-image
    私と同じように、これまで公式チュートリアルでhelmをインストールしていた場合は、次のコマンドを使用してhelm serverを更新できます.
    helm init --canary-image --upgrade
  • helmデプロイメントコードをダウンロードしharbor helmディレクトリに入ります.
    git clone https://github.com/vmware/harbor
    cd harbor/contrib/helm/harbor
    この接続を使用して指定したフォルダをダウンロードすることをお勧めします.そうしないと、ネットワークが悪い場合は、すべてのコードをドロップダウンするのに時間がかかります.
    https://minhaskamal.github.io/DownGit/#/home
  • 更新helm dependency harborのhelm配置postgresqlのhelmに依存し、公式のインストールドキュメントでは明確に説明されていません.私も初めて使用したので、直接公式のドキュメントの説明に従ってインストールすると、postgresqlの配置が欠け、サービス全体が
    helm dependency update
  • を起動できません.
  • harborのインストールここでは公式に2つの方法を提供しています.InsecureとSecureです.ここではSecureの安全な配置方法を選んで、harbor自身にCAとSSLを生成させます.簡単で便利です.harborをインストールするには、次のコマンドを実行します.
    helm install . --debug --name hub --set externalDomain=harbor.my.domain
    externalDomainは外部からharborにアクセスできるドメイン名です.これまで、ローカル/etc/hostsにドメイン名解析を追加し、ローカルアクセスからテストを行い、テストが完了したらtraefik-ingressに追加することができます.もちろん、traefik-ingressに直接ドメイン名解析を追加することもできます.
  • traefik-ingressを追加するドメイン名解析:
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: traefik-default-ingress
    namespace: default
    annotations:
    kubernetes.io/ingress.class: "traefik"
    spec:
    rules:
    • host: harbor.my.domain
      http:
      paths:
      • path: /
        backend:
        serviceName: my-release-harbor-ui
        servicePort: 80
  • helm harborカスタム構成
    注意:私はここですべてのカスタマイズの配置を后の付録の中に置いて、みんなの参考にして、同时にクリックすることができますhttps://github.com/Anteoy/harbor-helm/commit/226b296d130b4f956f8463eecf2aa473bc1e844c、githubにアップロードしたカスタム構成を確認し、githubからもっとはっきり読みます.
  • は重要です.生産環境でデータストレージを永続化する必要があります.そうしないとpodの再起動や再構築によってデータが失われます.作成したstorageClassがあればvaluesで直接yaml構成は、SCがないか一時的に使用できない場合、例えば私のところにnfsしかない場合は、私のように多くの構成を変更する必要があります.また、nfsは実はコミュニティにもstorageClassのドライバライブラリがありますが、私は使用が煩雑であることを見て、ここではnfsを使用するように変更しました.
  • templatesデフォルトのnamespaceを変更します.依存するchartフォルダのpostgresql-0.9-1を変更する必要があります.tgz圧縮ファイルの配置yamlテンプレート、そうでないとharborのui、register、mysql、postgresqlは1つのnamespaceの下になく、
  • を正常にインストールできません.
  • postgresqlの永続化データボリュームの変更に注意してください.参照してください.https://github.com/kubernetes/charts/tree/master/stable/postgresql

  • ふろく
     templates/adminserver/adminserver-cm.yaml
    @@ -1,6 +1,7 @@
     apiVersion: v1
     kind: ConfigMap
     metadata:
    +  namespace: class100-ops
       name: "{{ template "harbor.fullname" . }}-adminserver"
       labels:
     {{ include "harbor.labels" . | indent 4 }}
    
    1  templates/adminserver/adminserver-secrets.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Secret
     metadata:
       name: "{{ template "harbor.fullname" . }}-adminserver"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
         component: adminserver
    
    5  templates/adminserver/adminserver-ss.yaml
    @@ -2,6 +2,7 @@ apiVersion: apps/v1beta2
     kind: StatefulSet
     metadata:
       name: "{{ template "harbor.fullname" . }}-adminserver"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
         component: adminserver
    @@ -42,13 +43,15 @@ spec:
             volumeMounts:
             - name: adminserver-config
               mountPath: /etc/adminserver/config
    +          subPath: harbor-v1/adminserver/
             - name: adminserver-key
               mountPath: /etc/adminserver/key
               subPath: key
           volumes:
           {{- if not .Values.persistence.enabled }}
           - name: adminserver-config
    -        emptyDir: {}
    +        persistentVolumeClaim:
    +          claimName: harbor-pvc
           {{- end }}
           - name: adminserver-key
             secret:
    
    1  templates/adminserver/adminserver-svc.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Service
     metadata:
       name: "{{ template "harbor.fullname" . }}-adminserver"
    +  namespace: class100-ops
     spec:
       ports:
         - port: 80
    
    1  templates/clair/clair-cm.yaml
    @@ -3,6 +3,7 @@ apiVersion: v1
     kind: ConfigMap
     metadata:
       name: {{ template "harbor.fullname" . }}-clair
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
         component: clair
    
    1  templates/clair/clair-dpl.yaml
    @@ -3,6 +3,7 @@ apiVersion: extensions/v1beta1
     kind: Deployment
     metadata:
       name: {{ template "harbor.fullname" . }}-clair
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
         component: clair
    
    1  templates/clair/clair-svc.yaml
    @@ -6,6 +6,7 @@ apiVersion: v1
     kind: Service
     metadata:
       name: clair
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     spec:
    
    1  templates/ingress/ingress.yaml
    @@ -2,6 +2,7 @@ apiVersion: extensions/v1beta1
     kind: Ingress
     metadata:
       name: "{{ template "harbor.fullname" . }}-ingress"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
       annotations:
    
    1  templates/ingress/secret.yaml
    @@ -5,6 +5,7 @@ apiVersion: v1
     kind: Secret
     metadata:
       name: "{{ template "harbor.fullname" . }}-ingress"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     type: kubernetes.io/tls
    
    1  templates/jobservice/jobservice-cm.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: ConfigMap
     metadata:
       name: "{{ template "harbor.fullname" . }}-jobservice"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     data:
    
    1  templates/jobservice/jobservice-dpl.yaml
    @@ -2,6 +2,7 @@ apiVersion: extensions/v1beta1
     kind: Deployment
     metadata:
       name: "{{ template "harbor.fullname" . }}-jobservice"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
         component: jobservice
    
    1  templates/jobservice/jobservice-secrets.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Secret
     metadata:
       name: "{{ template "harbor.fullname" . }}-jobservice"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     type: Opaque
    
    1  templates/jobservice/jobservice-svc.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Service
     metadata:
       name: "{{ template "harbor.fullname" . }}-jobservice"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     spec:
    
    1  templates/mysql/mysql-secret.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Secret
     metadata:
       name: "{{ template "harbor.fullname" . }}-mysql"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     type: Opaque
    
    7  templates/mysql/mysql-ss.yaml
    @@ -2,6 +2,7 @@ apiVersion: apps/v1beta2
     kind: StatefulSet
     metadata:
       name: "{{ template "harbor.fullname" . }}-mysql"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
         component: mysql
    @@ -33,10 +34,12 @@ spec:
             volumeMounts:
             - name: mysql-data
               mountPath: /var/lib/mysql
    +          subPath: harbor-v1/mysql-data/
           {{- if not .Values.persistence.enabled }}
           volumes:
    -      - name: "mysql-data"
    -        emptyDir: {}
    +      - name: mysql-data
    +        persistentVolumeClaim:
    +          claimName: harbor-pvc
           {{- end -}}
       {{- if .Values.persistence.enabled }}
       volumeClaimTemplates:
    
    1  templates/mysql/mysql-svc.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Service
     metadata:
       name: "{{ template "harbor.fullname" . }}-mysql"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     spec:
    
    1  templates/registry/registry-cm.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: ConfigMap
     metadata:
       name: "{{ template "harbor.fullname" . }}-registry"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     data:
    
    1  templates/registry/registry-secret.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Secret
     metadata:
       name: "{{ template "harbor.fullname" . }}-registry"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     type: Opaque
    
    5  templates/registry/registry-ss.yaml
    @@ -2,6 +2,7 @@ apiVersion: apps/v1beta2
     kind: StatefulSet
     metadata:
       name: "{{ template "harbor.fullname" . }}-registry"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
         component: registry
    @@ -37,6 +38,7 @@ spec:
             volumeMounts:
             - name: registry-data
               mountPath: /var/lib/registry
    +          subPath: harbor-v1/registry-data/
             - name: registry-root-certificate
               mountPath: /etc/registry/root.crt
               subPath: root.crt
    @@ -47,7 +49,8 @@ spec:
     {{- if not .Values.registry.objectStorage }}
     {{- if not .Values.persistence.enabled }}
           - name: registry-data
    -        emptyDir: {}
    +        persistentVolumeClaim:
    +          claimName: harbor-pvc
     {{- end }}
     {{- end }}
           - name: registry-root-certificate
    
    1  templates/registry/registry-svc.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Service
     metadata:
       name: "{{ template "harbor.fullname" . }}-registry"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     spec:
    
    1  templates/ui/ui-cm.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: ConfigMap
     metadata:
       name: "{{ template "harbor.fullname" . }}-ui"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     data:
    
    3  templates/ui/ui-dpl.yaml
    @@ -2,6 +2,7 @@ apiVersion: extensions/v1beta1
     kind: Deployment
     metadata:
       name: "{{ template "harbor.fullname" . }}-ui"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
         component: ui
    @@ -54,8 +55,10 @@ spec:
               subPath: private_key.pem
             - name: ca-download
               mountPath: /etc/ui/ca
    +          subPath: harbor-v1/ui-ca/
             - name: psc
               mountPath: /etc/ui/token
    +          subPath: harbor-v1/ui-psc/
           volumes:
           - name: ui-config
             configMap:
    
    1  templates/ui/ui-secrets.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Secret
     metadata:
       name: "{{ template "harbor.fullname" . }}-ui"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     type: Opaque
    
    1  templates/ui/ui-svc.yaml
    @@ -2,6 +2,7 @@ apiVersion: v1
     kind: Service
     metadata:
       name: "{{ template "harbor.fullname" . }}-ui"
    +  namespace: class100-ops
       labels:
     {{ include "harbor.labels" . | indent 4 }}
     spec:
    
    3  values.yaml
    @@ -287,4 +287,5 @@ postgresql:
       postgresPassword: not-a-secure-password
       postgresDatabase: clair
       persistence:
    -    enabled: false
    +    enabled: true
    +    existingClaim: harbor-pvc 

    リファレンス
  • https://github.com/vmware/harbor/issues/4484
  • https://github.com/vmware/harbor/tree/master/contrib/helm/harbor
  • https://github.com/vmware/harbor/issues/4481
  • https://kubernetes.io/docs/concepts/storage/storage-classes/#introduction