微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ConfigMap

如何解决使用 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 举报,一经查实,本站将立刻删除。