запуск goharbor через обратный прокси

Привет, у меня гавань отлично работает под http://harbor.domain/ с использованием nginx ingress, я устанавливаю с помощью диаграммы harbor -helm.

На терминале я могу отправить Helmcharts на http://harbor.domain/chartrepo/,

я могу войти

docker login harbor.domain:80

и нажимаем в реестр.

Моя проблема в том, что я хотел бы иметь доступ к гавани через прокси-сервер apache, например

Я переустановил, используя диаграмму гавани, изменив values.yaml

externalURL: https://example.com

Так что я тогда на /etc/apache2/sites-available/example-le-ssl.conf я добавил следующее

    # helmcharts 
    <Location "/chartrepo/"> 
          ProxyPass "http://harbor.domain/chartrepo/"
          ProxyPassReverse "http://harbor.domain/chartrepo/"
    </Location>

    # harbor 
    <Location "/harbor"> 
          ProxyPass "http://harbor.domain/harbor"
          ProxyPassReverse "http://harbor.domain/harbor"
    </Location>

    # registry 
    <Location "/v2"> 
          ProxyPass "http://harbor.domain/v2"
          ProxyPassReverse "http://harbor.domain/v2"
    </Location>

К сожалению, если я это сделаю docker login example.com вход в докер возвращается

Error response from daemon: login attempt to https://example.com/v2/ failed with status: 503 Service Unavailable

я получаю следующую ошибку в журналах реестра

error authorizing context: authorization token required

Любые идеи о том, что мне не хватает?

Попытка протолкнуть график также не удалась.

helm push --username='username' --password='password' demo-chart.tgz https://example.com/chartrepo/

Ошибка в том, что

Error: 404: could not properly parse response JSON: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr>
<address>Apache/2.4.41 (Ubuntu) Server at example.com Port 443</address>
</body></html>

2 ответа

Похоже, вы не можете авторизоваться в реестре докеров. Либо вы можете добавить переменную в учетную запись службы по умолчанию, либо мы можем создать секрет реестра докеров и добавить его в развертывание как imagepullsecret.

Если вы хотите сделать это из imagepullsecret, вы можете создать вспомогательный шаблон, например

/* image pull secret */
{{- define "imagePullSecret" }}
{{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.imageCredentials.registry (printf "%s:%s" .Values.imageCredentials.username .Values.imageCredentials.password | b64enc) | b64enc }}
{{- end }}

Затем вы можете использовать это в файле развертывания, например

imagePullSecrets:
      - name: {{.Values.imageCredentials.secretName}}

Весь файл может выглядеть как

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.appName }}
  namespace: {{ .Values.namespace }}
spec:
  selector:
    matchLabels:
      app: {{ .Values.appName }}
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels:
        app: {{ .Values.appName }}
    spec:
      containers:
      - name: {{ .Values.appName }}
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        {{- if .Values.hasSecretVolume }}
        volumeMounts:
        - name: {{ .Values.appName }}-volume-sec
          mountPath: {{ .Values.secretVolumeMountPath }}
        {{- end}}
        {{- if or .Values.env.configMap .Values.env.secrets }}
        envFrom:
        {{- if .Values.env.configMap }}
        - configMapRef:
            name: {{ .Values.appName }}-env-configmap
        {{- end }}
        {{- if .Values.env.secrets }}
        - secretRef:
            name: {{ .Values.appName }}-env-secret
        {{- end }}
        {{- end }}
        ports:
        - containerPort: {{ .Values.containerPort }}
          protocol: TCP
{{- if .Values.springContainerHealthChecks}}
{{ toYaml .Values.springContainerHealthChecks | indent 8 }}
{{- end}}
      {{- if .Values.hasSecretVolume }}
      volumes:
      - name: {{ .Values.appName }}-volume-sec
        secret:
          secretName: {{ .Values.appName }}-volume-sec
      {{- end}}
      {{- if .Values.imageCredentials}}
      imagePullSecrets:
      - name: {{.Values.imageCredentials.secretName}}
      {{- end}}

Моя первая проблема заключалась в том, как apache обрабатывает проксирование на бэкэнд https, здесь объясняется, как настроить сервер Apache для связи с внутренним сервером HTTPS?.

Я добавил на свой виртуальный хост /etc/apache2/sites-available/example-le-ssl.conf

    SSLProxyEngine on
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    <Location "/v2"> 
          ProxyPass "http://harbor.domain/v2"
          ProxyPassReverse "http://harbor.domain/v2"
    </Location>
    <Location "/service/">
          # RequestHeader set X-Forwarded-Proto "https"
          ProxyPass "http://harbor.domain/service/"
          ProxyPassReverse "http://harbor.domain/service/"
    </Location>
Другие вопросы по тегам