【问题标题】:Nginx 403 error while using kubernetes volumes使用 kubernetes 卷时出现 Nginx 403 错误
【发布时间】:2022-01-11 22:03:55
【问题描述】:

我正在尝试将 Kubernetes 卷用于 Nginx,但遇到了问题。设置卷后,Nginx 无法提供 HTML 页面。也尝试了PV和PVS,这次也得到了同样的错误。

nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels: 
    app: nginx 

spec: 
  replicas: 2
  selector: 
    matchLabels: 
      app: nginx
  template:
    metadata: 
      labels:
        app: nginx
    spec: 
      volumes:
        - name: nginxhtml
          # persistentVolumeClaim: 
          #   claimName: pvc
          hostPath:
            path: /home/amjed/Documents/SPS/k8s/mongo/mnt
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - name: nginxhtml 
              mountPath: /usr/share/nginx/html
              
          ports: 
            - containerPort: 80



---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector: 
    app: nginx
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

【问题讨论】:

  • 你在使用 minikube 吗? k8s事件有错误吗?
  • 是的,我正在使用 minikube
  • 对,看看这些解决方案是否能解决您的问题stackoverflow.com/questions/45484366/… -- 以及关于挂载本地文件夹的 minikube 文档minikube.sigs.k8s.io/docs/handbook/mount
  • 现在尝试另一种方式。我使用 ssh 登录到 minikube。然后创建了一个名为“sample-vol”的文件夹。该文件夹路径已添加到 hostPath。仍然遇到同样的错误。主机路径:/home/docker/sample-vol
  • nginx 日志中是否有任何错误?

标签: docker nginx kubernetes persistent-volumes


【解决方案1】:

首先,创建要挂载到 minikube 中的文件夹:

dobrucki@minikube:~$ minikube ssh
Last login: Tue Jan 11 13:54:50 2022 from 192.168.49.1
docker@minikube:~$ ls -l 
total 4
drwxr-xr-x 2 docker docker 4096 Jan 11 13:56 nginx-mount

这个文件夹是映射到 Pods 内的/usr/share/nginx/html 的,所以当你连接到你的服务时,你粘贴到这里的文件会显示出来。 确保您在该文件夹中有一些 .html 文件,否则您将收到 403 错误。对我来说,例如index.html 是这样的:

<html>
 <head>
 </head>
 <body>
   <h1>Hello World<h1>
 </body>
</html>

您还需要在 Deployment 清单中添加 securityContext fsGroup,以便 /usr/share/nginx/html 归 nginx 用户 (101 uid) 所有。

然后,使用以下方法应用 Deployment 和 LoadBalancer 资源:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels: 
    app: nginx 
spec:
  replicas: 2
  selector: 
    matchLabels: 
      app: nginx
  template:
    metadata: 
      labels:
        app: nginx
    spec:
      securityContext:
        fsGroup: 101
      volumes:
        - name: nginxhtml
          hostPath:
            path: /home/docker/nginx-mount
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
            - name: nginxhtml 
              mountPath: /usr/share/nginx/html       
          ports: 
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector: 
    app: nginx
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

之后您可以检查内容是否正确提供

dobrucki@minikube:~$ curl $(minikube service nginx-service --url)
<html>
 <head>
 </head>
 <body>
   <h1>Hello World<h1>
 </body>
</html>

如果您还有其他问题,请告诉我。

【讨论】:

  • 我做了这些改变。但 HTML 内容并未添加到 hostPath。所以还是同样的错误。是否需要手动将这些 HTML 文件添加到 hostPath 中?
  • 你必须有一些内容需要nginx服务,如果文件夹是空的,每次都会报403错误。
  • “但是没有将 HTML 内容添加到 hostPath。”是什么意思?
  • 如果您需要逐步说明我是如何工作的,请告诉我。
  • 是的,请逐步指导。
【解决方案2】:
  1. 将副本数减少到 1
  2. 验证 /home/amjed/Documents/SPS/k8s/mongo/mnt 位置是否有效并且可以从 pod 访问

【讨论】:

  • 我做了这些更改,但仍然是同样的错误
  • 路径小写 /home/amjed/Documents/SPS/k8s/mongo/mnt
猜你喜欢
  • 2021-08-24
  • 2015-11-13
  • 2013-07-19
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
相关资源
最近更新 更多