запуск goharbor через обратный прокси
Привет, у меня гавань отлично работает под http://harbor.domain/ с использованием nginx ingress, я устанавливаю с помощью диаграммы harbor -helm.
На терминале я могу отправить Helmcharts на http://harbor.domain/chartrepo/,
я могу войти
docker login harbor.domain:80
и нажимаем в реестр.
Моя проблема в том, что я хотел бы иметь доступ к гавани через прокси-сервер apache, например
- https://example.com/v2 для реестра
- https://example.com/chartrepo для Chartrepo
- https://example.com/harbor для доступа к интерфейсу гавани.
Я переустановил, используя диаграмму гавани, изменив 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>