【问题标题】:Error 404 after deploying and exposing Nginx pod部署和暴露 Nginx pod 后出现错误 404
【发布时间】:2020-08-27 21:33:25
【问题描述】:

我已经使用以下命令部署并公开了 Nginx:

sudo kubectl create deployment mynginx1 --image=nginx
sudo kubectl expose deployment mynginx1 --type NodePort --port 8080

我使用 http://: 或 http://172.17.135.42:31788 访问

但我收到错误 404。感谢帮助。

gtan@master:~$ kubectl get pods -owide -A 命名空间名称就绪状态重新启动年龄 IP 节点提名节点就绪门 默认 mynginx1-f544c49cb-g92w2 1/1 运行 0 3m19s 172.168.10.2 slave1 kube-system coredns-66bff467f8-92r4n 1/1 Running 0 7m56s 172.168.10.2 master kube-system coredns-66bff467f8-gc7tc 1/1 Running 0 7m56s 172.168.10.3 master kube-system etcd-master 1/1 Running 0 8m6s 172.17.82.100 master kube-system kube-apiserver-master 1/1 Running 0 8m6s 172.17.82.100 master kube-system kube-controller-manager-master 1/1 Running 0 8m6s 172.17.82.100 master kube-system kube-flannel-ds-amd64-24pwc 1/1 运行 3 4m58s 172.17.82.110 slave1 kube-system kube-flannel-ds-amd64-q5qwg 1/1 运行 0 5m28s 172.17.82.100 master kube-system kube-proxy-hf59b 1/1 运行 0 4m58s 172.17.82.110 slave1 kube-system kube-proxy-r7pz6 1/1 运行 0 7m56s 172.17.82.100 master kube-system kube-scheduler-master 1/1 Running 0 8m5s 172.17.82.100 master gtan@master:~$

gtan@master:~$ curl -IL http://172.17.82.100:30131 curl: (7) 连接172.17.82.100 30131端口失败:连接被拒绝

其中“172.17.82.100”是主节点ip地址。

gtan@master:~$ kubectl get services -o wide -A 命名空间名称类型 CLUSTER-IP EXTERNAL-IP PORT(S) 年龄选择器 默认 kubernetes ClusterIP 10.96.0.1 443/TCP 15m 默认 mynginx1 NodePort 10.102.106.240 80:30131/TCP 10m app=mynginx1 kube-system kube-dns ClusterIP 10.96.0.10 53/UDP,53/TCP,9153/TCP 15m k8s-app=kube-dns

【问题讨论】:

    标签: nginx kubernetes


    【解决方案1】:

    您的设置架构是什么?你在同一台机器上有工作节点和主节点吗?

    检查 nginx pod 状态:

    kubectl get pods
    

    如果 pod 运行正常,则使用 NodePort http:/Workernode_IP:Nodeport 访问您的工作机器 IP

    【讨论】:

    • 您好,非常感谢您的帮助。我有一个主节点和两个从节点:分别为 172.17.135.42/34/35。我使用“curl --IL 172.17.135.34:32640”但连接被拒绝。 “mnginx1”服务在 172.17.135.34 (slave1) 上运行,因此 pod 就在那里。 Pod“mynginx1-f544c49cb-5d6vj”在 slave1 上。
    • 您能否分享以下输出: 您还可以在工作节点上卷曲 pod_IP:80。
    • 我在法兰绒中得到 CrashLoopBackoff:godfrey@master:~$ sudo kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-66bff467f8-tknhg 1/1 Running 0 4m54s kube-system coredns-66bff467f8-wnx2l 1/1 Running 0 4m53s ... kube-system kube-flannel-ds-amd64-kbmdb 0/1 CrashLoopBackOff 3 82s kube-system kube-flannel-ds-amd64-mtfbp 0/1错误 3 50s ...
    • flannel 在主节点上运行良好。然后当我将salve节点添加到集群时,slave中的flannel会产生错误。
    • 嗨,我已经解决了法兰绒问题:NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master Ready master 39m v1.18.2 192.168.152.99 Ubuntu 18.04.4 LTS 4.15.0-99-generic docker://19.3.6 slave3 Ready 34m v1.18.2 192.168.152.104 Ubuntu 18.04.4 LTS 4.15.0-99-generic docker:// 19.3.6 curl -IL 命令拒绝连接。
    【解决方案2】:

    默认的 nginx 容器端口是80,你可以看到here。只需在第二个命令中将容器端口从 8080 更改为 80

    sudo kubectl expose deployment mynginx1 --type NodePort --port 80

    并尝试使用命令输出中显示的 NodePort 访问服务,例如:

    $kubectl get svc
    
    NAME       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    mynginx1   NodePort   10.97.142.170   <none>        80:31591/TCP   8m9s
    

    或者,您可以使用此 yaml 规范来配置您的 pod 和服务:

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - name: http
              containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
    spec:
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: NodePort
    

    使用 curl 进行测试:

    $ curl -IL http://localhost:31591
    HTTP/1.1 200 OK
    Server: nginx/1.17.10
    Date: Tue, 12 May 2020 10:05:04 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Tue, 14 Apr 2020 14:19:26 GMT
    Connection: keep-alive
    ETag: "5e95c66e-264"
    Accept-Ranges: bytes
    

    另外,我建议您预留时间查看这些文档页面:

    Kuberentes Concepts

    Services

    【讨论】:

    • 您好,非常感谢您的帮助。端口 80 不起作用,因为我得到“连接被拒绝”,因此我不得不使用端口“8080”。这是 curl 的响应:godfrey@master:~$ curl -IL 172.17.135.42:32640 HTTP/1.1 404 Not Found Content-Type: text/plain; charset=utf-8 X-Content-Type-Options: nosniff 日期: Wed, 13 May 2020 04:32:34 GMT Content-Length: 19
    • 所有节点都建立在 Ubuntu 的“mini.iso”镜像之上,并在 Hyperv 中运行。一个主节点和从节点 1 和从节点 2。我还在 Hyperv 中运行了 minikube,并且 minikube 中的“mynginx1”没有问题。唯一不同的是我使用“kubectl create service nodeport mynginx1 --tcp=8080:80”在minikube中创建了“mynginx1”服务。输出为: $ minikube service mynginx1 |默认 |我的nginx1 | 8080-80 | 192.168.85.153:31706 |
    • 我已经在我的实验室中测试了确切的命令并且工作正常。因此,请在您的帖子中添加命令kubectl get svckubectl get pods 的输出。另外,你从哪里用 curl 测试?这是一种奇怪的行为,因为错误 404 表示您的应用程序已回答。确保您没有在同一端口上运行其他应用程序。但同样,在这种情况下,8080 端口将不起作用,因为 nginx 映像运行在 80 端口。
    • godfrey@master:~$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 43h mynginx1 NodePort 10.99.22.229 8080:32640/TCP 159m
    • 您好,非常感谢您的帮助。我已经解决了法兰绒和 nginx 的问题。你可以结案。您的 CLI 语句绝对正确。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多