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を初期化します. helmデプロイメントコードをダウンロードしharbor helmディレクトリに入ります. 更新helm dependency harborのhelm配置postgresqlのhelmに依存し、公式のインストールドキュメントでは明確に説明されていません.私も初めて使用したので、直接公式のドキュメントの説明に従ってインストールすると、postgresqlの配置が欠け、サービス全体が を起動できません. harborのインストールここでは公式に2つの方法を提供しています.InsecureとSecureです.ここではSecureの安全な配置方法を選んで、harbor自身にCAとSSLを生成させます.簡単で便利です.harborをインストールするには、次のコマンドを実行します. traefik-ingressを追加するドメイン名解析: 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
ふろく
リファレンス 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
harborはvmwareからオープンソースのエンタープライズクラスdocker repositoryで、プライベートウェアハウス、セキュリティ認証、権限管理、脆弱性スキャン、ウェアハウスレプリケーションなど多くの機能を提供しています.これまで構築されたharborのオンライン環境には様々な問題があったためです(これまで構築された方法は現在、公式に廃棄されています).https://github.com/vmware/harbor/blob/master/docs/kubernetes_deployment.md例えばuiが正常ではなく、権限認証が正常ではない)ので、最近は公式推奨のhelm方式でharborを再配置し、オフラインのharborを置き換えます.
の準備を
配備プロセス
:初期化には、次のコマンドを使用してcanaryミラーを使用する必要があります.そうしないと、正常にインストールできません.helmデプロイメントファイルのフォーマットが正しくありません.これは既知のissueです.https://github.com/vmware/harbor/issues/4484
helm init --canary-image
私と同じように、これまで公式チュートリアルでhelmをインストールしていた場合は、次のコマンドを使用してhelm serverを更新できます.
helm init --canary-image --upgrade
git clone https://github.com/vmware/harbor
cd harbor/contrib/helm/harbor
この接続を使用して指定したフォルダをダウンロードすることをお勧めします.そうしないと、ネットワークが悪い場合は、すべてのコードをドロップダウンするのに時間がかかります.
https://minhaskamal.github.io/DownGit/#/home
helm dependency update
helm install . --debug --name hub --set externalDomain=harbor.my.domain
externalDomainは外部からharborにアクセスできるドメイン名です.これまで、ローカル/etc/hostsにドメイン名解析を追加し、ローカルアクセスからテストを行い、テストが完了したら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
注意:私はここですべてのカスタマイズの配置を后の付録の中に置いて、みんなの参考にして、同时にクリックすることができますhttps://github.com/Anteoy/harbor-helm/commit/226b296d130b4f956f8463eecf2aa473bc1e844c、githubにアップロードしたカスタム構成を確認し、githubからもっとはっきり読みます.
ふろく
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
リファレンス