如何解决使用 ConfigMap
软件版本如下。
在 DigitalOcean 的托管 Kubernetes 中,我有一个正在运行的 nginx-ingress,其中两个容器使用我的 DNS 和一个 jetstack 证书管理器正确路由。一个容器运行测试应用程序,另一个容器运行我的 API。他们工作得很好。我正在尝试将我的 Angular 客户端连接到第三个容器中,但 Ingress 路由不起作用。它返回 502 Bad Gateway。在尝试了很多事情之后,我现在认为问题与 SPA(单页应用程序)所需的特定 nginx-ingress 配置有关。
NanoDano 对 DevDungeon 的评论,“在 /etc/Nginx/conf.d/ 中创建一个配置......尤其是 Angular 最重要的部分是包含 try_files 行,这将确保即使有人直接访问 URL,服务器将正确重写它,以便 Angular 应用程序正常运行。” Andre dublin 在他的 GitHub 页面和 Niklas Heidloff 在他的 website 页面上也提到了这种“try_files”配置。
在我找到的有关如何执行此操作的示例中,从您正在进行多阶段构建以通过 Dockerfile 将应用程序、入口和入口配置组合到一个 docker 容器中的角度给出了解释,例如Lukas Marx 在 Malcoded 上的例子。或者你在ingress启动后手动编辑配置,建议在这个未解决的Stackflow中。
在我的情况下,我已经有了 nginx-ingress,我只需要动态添加一个配置来正确路由 Angular SPA。使用 kubectl port-forward,我已经确认 Angular 应用程序是从它的 pod 和它的集群 IP 服务提供的。这是工作。当我尝试通过 Ingress 连接到应用程序时,我收到 502 Bad Gateway 错误,我已在此 StackOverflow 中讨论过。
可以使用此 StackOverflow 中所述的 ConfigMap 将配置添加到现有的 nginx-ingress。我的 nginx-ingress 是按照此 DigitalOcean tutorial 中的示例创建和配置的,请参阅第 2 步,其中安装了以下内容:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-Nginx/controller-v0.34.1/deploy/static/provider/do/deploy.yaml
我尝试添加“try_files”配置。首先,我创建了这个 ConfigMap:
apiVersion: v1
kind: ConfigMap
Metadata:
name: Nginx-config
data:
Nginx.conf: |
server {
listen 80;
server_name pvgd.markwilx.tech;
index index.html index.htm;
root /home/node/app;
location / {
try_files $uri $uri/ /index.html =404;
}
include /etc/Nginx/extra-conf.d/*.conf;
}
其次,我从上面kubectl命令的deploy.yaml file中提取Ingress Deployment并修改(向底部添加六行,并用注释标记):
apiVersion: apps/v1
kind: Deployment
Metadata:
labels:
helm.sh/chart: ingress-Nginx-3.27.0
app.kubernetes.io/name: ingress-Nginx
app.kubernetes.io/instance: ingress-Nginx
app.kubernetes.io/version: 0.45.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-Nginx-controller
namespace: ingress-Nginx
spec:
selector:
matchLabels:
app.kubernetes.io/name: ingress-Nginx
app.kubernetes.io/instance: ingress-Nginx
app.kubernetes.io/component: controller
revisionHistoryLimit: 10
minReadySeconds: 0
template:
Metadata:
labels:
app.kubernetes.io/name: ingress-Nginx
app.kubernetes.io/instance: ingress-Nginx
app.kubernetes.io/component: controller
spec:
dnsPolicy: ClusterFirst
containers:
- name: controller
image: k8s.gcr.io/ingress-Nginx/controller:v0.45.0@sha256:c4390c53f348c3bd4e60a5dd6a11c35799ae78c49388090140b9d72ccede1755
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
exec:
command:
- /wait-shutdown
args:
- /nginx-ingress-controller
- --publish-service=$(POD_NAMESPACE)/ingress-Nginx-controller
- --election-id=ingress-controller-leader
- --ingress-class=Nginx
- --configmap=$(POD_NAMESPACE)/ingress-Nginx-controller
- --validating-webhook=:8443
- --validating-webhook-certificate=/usr/local/certificates/cert
- --validating-webhook-key=/usr/local/certificates/key
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
runAsUser: 101
allowPrivilegeEscalation: true
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldpath: Metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldpath: Metadata.namespace
- name: LD_PRELOAD
value: /usr/local/lib/libmimalloc.so
livenessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 1
successthreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 1
successthreshold: 1
failureThreshold: 3
ports:
- name: http
containerPort: 80
protocol: TCP
- name: https
containerPort: 443
protocol: TCP
- name: webhook
containerPort: 8443
protocol: TCP
volumeMounts:
- name: webhook-cert
mountPath: /usr/local/certificates/
readOnly: true
- name: Nginx-config # ADDED THIS CONfigURATION
mountPath: /etc/Nginx/Nginx.conf # ADDED THIS CONfigURATION
subPath: Nginx.conf # ADDED THIS CONfigURATION
resources:
requests:
cpu: 100m
memory: 90Mi
nodeselector:
kubernetes.io/os: linux
serviceAccountName: ingress-Nginx
terminationGracePeriodSeconds: 300
volumes:
- name: webhook-cert
secret:
secretName: ingress-Nginx-admission
- name: Nginx-config # ADDED THIS CONfigURATION
configMap: # ADDED THIS CONfigURATION
name: Nginx-config # ADDED THIS CONfigURATION
第三,我重新应用了执行它的代码:
kubectl apply -f ingress-deployment-mod.yaml
这似乎不起作用。事实上,它似乎已经打破了其他一切。如果您对我通过 nginx-ingress 在 Internet 和我的 Angular 应用程序之间创建路由可能做错了什么有任何建议,我很感激您的见解。
谢谢, 标记
版本
- node.js 10.19.0
- npm 7.7.6
- 纱线 1.22.10
- ng 11.2.2
- docker 19.03.8
- kubectl 1.20.1
- doctl 1.57.0
- kubernetes 1.20.2-do.0
- 掌舵 3.5.3
- Nginx 控制器 0.45.0
- jetstack 1.3.0
解决方法
您不能使用 ingress-nginx 来提供这样的实际文件。这些文件位于您构建的其他容器中,其中包含您的应用程序代码。 Kubernetes 中的 Ingress 系统仅用于代理和路由 HTTP 连接。实际的 Web 服务,即使碰巧也使用 Nginx,也必须单独部署。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。