在反向代理后面运行 goharbor
Posted
技术标签:
【中文标题】在反向代理后面运行 goharbor【英文标题】:running goharbor behind a reverse proxy 【发布时间】:2020-07-29 17:18:51 【问题描述】:您好,我有 harbor 使用 nginx ingress 在 http://harbor.domain 下完美运行,我使用 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
使用harbor-helm chart重新安装
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
docker 登录返回
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>
【问题讨论】:
【参考方案1】:我的第一个问题是 apache 如何处理到 https 后端的代理,这里解释了 how to configure apache server to talk to HTTPS backend server?。
我添加到我的虚拟主机/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>
【讨论】:
【参考方案2】:您似乎无法授权 docker 注册表。您可以将变量添加到默认服务帐户,或者我们可以创建 docker 注册表密钥并将其作为 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
【讨论】:
问题不是凭证,因为它在harbor.domain下工作。我最终想通了,我会发布更长的答案以上是关于在反向代理后面运行 goharbor的主要内容,如果未能解决你的问题,请参考以下文章
Angular App 在 nginx 上运行并在附加的 nginx 反向代理后面
Next js 和 google 分析在 nginx 反向代理后面不起作用
在带有协议升级的 nginx 反向代理后面运行 daphne 总是路由到 http 而不是 websocket
在安全的反向代理后面运行sonarqube时,“请求中的CSRF错误”