Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的裸机kubernetes nginx Ingress控制器返回308?_Nginx_Kubernetes_Nginx Ingress - Fatal编程技术网

为什么我的裸机kubernetes nginx Ingress控制器返回308?

为什么我的裸机kubernetes nginx Ingress控制器返回308?,nginx,kubernetes,nginx-ingress,Nginx,Kubernetes,Nginx Ingress,我正在尝试创建并将nginx入口控制器添加到我的kubernetes集群。我当前的集群有3个节点,它们之间都有开放式防火墙规则。(注意:这是用于教育目的的裸机群集) 我已经用以下配置创建了一个部署 apiVersion: apps/v1 kind: Deployment metadata: name: nodejs-test labels: app: nodejs spec: replicas: 5 selector: matchLabels: app

我正在尝试创建并将nginx入口控制器添加到我的kubernetes集群。我当前的集群有3个节点,它们之间都有开放式防火墙规则。(注意:这是用于教育目的的裸机群集)

我已经用以下配置创建了一个部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs-test
  labels:
    app: nodejs
spec:
  replicas: 5
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
    spec:
      containers:
      - name: nodejs-container
        image: gcr.io/infrastructure/test-nodejs-server
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: test-deployment-service
spec:
  selector:
    app: nodejs
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
运行kubectl后,创建-f file.yaml

我看到所有的播客和服务都在运行。在集群中,我可以卷曲服务ip并从POD获得响应

现在我要创建一个入口

我首先遵循了在中找到的安装步骤

我可以看到入口控制器正在运行

    NAMESPACE       NAME                                         READY     STATUS    RESTARTS   AGE
default         my-test-6445d9bb7b-blm7t                     1/1       Running   0          3h
default         nodejs-test-5657f7bb74-7hwqk                 1/1       Running   0          23h
default         nodejs-test-5657f7bb74-bh44x                 1/1       Running   0          23h
default         nodejs-test-5657f7bb74-dw4g4                 1/1       Running   0          23h
default         nodejs-test-5657f7bb74-k7bf4                 1/1       Running   0          23h
default         nodejs-test-5657f7bb74-xdthl                 1/1       Running   0          23h
ingress-nginx   default-http-backend-55c6c69b88-4d5bf        1/1       Running   0          26m
ingress-nginx   nginx-ingress-controller-5c6698dfbf-gs9zd    1/1       Running   0          25m
kube-system     etcd-yoda.me.com                      1/1       Running   1          1d
kube-system     kube-apiserver-yoda.me.com            1/1       Running   1          1d
kube-system     kube-controller-manager-yoda.me.com   1/1       Running   1          1d
kube-system     kube-dns-6f4fd4bdf-62bxg                     3/3       Running   3          1d
kube-system     kube-flannel-ds-jbmwg                        1/1       Running   1          1d
kube-system     kube-flannel-ds-r8nfb                        1/1       Running   2          1d
kube-system     kube-flannel-ds-rczbx                        1/1       Running   0          1d
kube-system     kube-proxy-brm2g                             1/1       Running   0          1d
kube-system     kube-proxy-qjgcv                             1/1       Running   1          1d
kube-system     kube-proxy-sz6rw                             1/1       Running   1          1d
kube-system     kube-scheduler-yoda.me.com            1/1       Running   1          1d
kube-system     kubernetes-dashboard-5bd6f767c7-stscl        1/1       Running   1          23h
kube-system     tiller-deploy-59d854595c-tngg6               1/1       Running   0          23h
然后使用以下文件创建入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - http:
      paths:
      - path: /whoop
        backend:
          serviceName: test-deployment-service
          servicePort: 80
然后运行kubectl get services——所有名称空间来查找入口控制器端口

NAMESPACE       NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
default         kubernetes                ClusterIP   10.96.0.1        <none>        443/TCP                      1d
default         my-test                   ClusterIP   10.110.102.5     <none>        80/TCP                       4h
default         test-deployment-service   ClusterIP   10.104.239.37    <none>        80/TCP                       23h
ingress-nginx   default-http-backend      ClusterIP   10.105.218.87    <none>        80/TCP                       29m
ingress-nginx   ingress-nginx             NodePort    10.110.39.104    <none>        80:30652/TCP,443:31624/TCP   27m
kube-system     kube-dns                  ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP                1d
kube-system     kubernetes-dashboard      ClusterIP   10.100.219.110   <none>        443/TCP                      23h
kube-system     tiller-deploy             ClusterIP   10.101.179.202   <none>        44134/TCP                    23h
结果是:

*   Trying myip...
* TCP_NODELAY set
* Connected to myserver (myip) port 30652 (#0)
> GET /whoop/ HTTP/1.1
> Host: myserver:30652
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 308 Permanent Redirect
< Server: nginx/1.13.9
< Date: Fri, 02 Mar 2018 14:38:21 GMT
< Content-Type: text/html
< Content-Length: 187
< Connection: keep-alive
< Location: https://myserver:30652/whoop/
< Strict-Transport-Security: max-age=15724800; includeSubDomains;
< 
<html>
<head><title>308 Permanent Redirect</title></head>
<body bgcolor="white">
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.13.9</center>
</body>
</html>
* Connection #0 to host myserver left intact

如何连接入口和入口控制器以使路由正常工作?

此处的关键是命名主机,否则入口规则将应用于默认服务器,默认服务器配置为将HTTP重定向到HTTPS

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /whoop
        backend:
          serviceName: test-deployment-service
          servicePort: 80

您应该能够禁用默认服务器的重定向行为,但我没有尝试过。

我也遇到了同样的问题,但我不想添加
主机
值。 为了防止像前面提到的默认服务器将HTTP重定向到HTTPS,我将此注释添加到入口,并为我修复了它:
nginx.ingres.kubernetes.io/ssl-redirect:“false”

我现在的工作入口如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: "internal-nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: app1
          servicePort: 80
      - path: /app2/*
        backend:
          serviceName: app2
          servicePort: 80

我遇到了HTTP呼叫重定向到HTTPS的问题 (通过fiddler日志验证)

将此添加到我的yml文件中,使其对我有效

注释:

nginx.ingress.kubernetes.io/ssl-redirect: "false"

当它重定向时,响应的位置头是什么(使用curl-v)。如果您尝试curl myserver:30652/whoop/(带尾随斜杠),会发生什么?308是nginx现在的默认重定向状态代码。308和301之间的区别在于,用户代理在301上不保留方法,而在308上保留方法。@JonahBenton我试过并编辑了原始问题。简而言之,斜杠没有什么区别。好吧,如果308是默认的重定向状态代码,我想问题应该是为什么我得到的是重定向而不是我的应用程序?啊,看看位置:header-它说https:。服务器告诉浏览器它需要从http重定向到https。还有一个严格的传输安全标头-这是对浏览器的指示,它应该始终使用https访问此域(包括子域,标头中有附加注释)。我不相信这是入口中的默认值-那是来自你的应用程序吗?就是这样!!非常感谢。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: "internal-nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: app1
          servicePort: 80
      - path: /app2/*
        backend:
          serviceName: app2
          servicePort: 80
nginx.ingress.kubernetes.io/ssl-redirect: "false"