Kubernetes / Minikube 入口错误(301 永久移动)

Kubernetes / Minikube Ingress error (301 Moved Permanently)

我正在学习 Kubernetes 教程并在我的 MacBook 上使用 Minikube 作为我的 Kubernetes 环境。本教程中的所有步骤都运行良好,除了让 Ingress 正常工作(我正在关注的 Ingress 教程位于:https://cloud.google.com/container-engine/docs/tutorials/http-balancer)。通过 Ingress 访问时出现“301 永久移动”错误。

我的环境:

我正在使用默认的 Ingress 控制器(用于 minikube 的 nginx)并且 成功启用入口:

minikube addons enable ingress

然后我按照教程中的步骤操作:

第 1 步:部署 nginx 服务器(成功)

kubectl run nginx --image=nginx --port=80

步骤 2a:将您的 nginx 部署公开为内部服务(成功)

kubectl expose deployment nginx --target-port=80  --type=NodePort

步骤 2b:验证服务是否可用:

kubectl get service nginx

输出:

NAME      CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
nginx     10.0.0.170   <nodes>       80:31635/TCP   7s

从上面,我知道服务创建正确...

第 3 步:创建 Ingress 资源(成功)

入口配置 YAML (basic-ingress.yaml):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  backend:
    serviceName: nginx
    servicePort: 80

现在应用 YAML:

kubectl apply -f basic-ingress.yaml

步骤 4a:验证入口

kubectl get ingress basic-ingress

输出:

NAME            HOSTS     ADDRESS         PORTS     AGE
basic-ingress   *         192.168.64.37   80        16s

步骤 4b:访问应用程序(* 不成功 *

教程指出我应该“将我的浏览器指向您应用程序的外部 IP 地址,然后看到标题为“欢迎使用 nginx!”的网页。

当我将浏览器指向站点 (http://192.168.64.37) 时,它试图转换为 https,这给出了错误 "secure connection failed"(来自 Firefox,但来自 Chrome 的类似错误)

但是,当我卷曲网站时,出现“301”错误:

curl 192.168.64.37

输出:

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.11.12</center>
</body>
</html>

我一直在尝试调试它,但到目前为止没有成功,但是,我在下面提供了更多信息...也许它对诊断问题很有用:

完整的 Ingress 描述:

kubectl describe ingress

输出:

Name:           basic-ingress
Namespace:      default
Address:        192.168.64.38
Default backend:    nginx:80 (172.17.0.3:80)
Rules:
  Host  Path     Backends
  ----  ----     --------
  *     *        nginx:80 (172.17.0.3:80)
Annotations:
Events:
  FirstSeen LastSeen    Count   From            SubObjectPath   Type        Reason  Message
  --------- --------    -----   ----            -------------   --------    ------  -------
  3m        3m      1   {ingress-controller }           Normal      CREATE  Ingress default/basic-ingress
  3m        3m      1   {ingress-controller }           Normal      UPDATE  Ingress default/basic-ingress

以下是 nginx Ingress pod 日志:

2017-05-26T16:08:27.142309346Z I0526 16:08:27.142156       1 launch.go:101] &{NGINX 0.9.0-beta.4 git-72bb2222 git@github.com:ixdy/kubernetes-ingress.git}
2017-05-26T16:08:27.142345769Z I0526 16:08:27.142218       1 launch.go:104] Watching for ingress class: nginx
2017-05-26T16:08:27.142350322Z I0526 16:08:27.141160       1 nginx.go:180] starting NGINX process...
2017-05-26T16:08:27.142834005Z I0526 16:08:27.142764       1 launch.go:257] Creating API server client for https://10.0.0.1:443
2017-05-26T16:08:27.166946862Z I0526 16:08:27.166808       1 launch.go:120] validated kube-system/default-http-backend as the default backend
2017-05-26T16:08:27.174640373Z I0526 16:08:27.174527       1 controller.go:1184] starting Ingress controller
2017-05-26T16:08:27.175954273Z I0526 16:08:27.175092       1 leaderelection.go:203] attempting to acquire leader lease...
2017-05-26T16:08:27.183187824Z I0526 16:08:27.183085       1 leaderelection.go:213] successfully acquired lease kube-system/ingress-controller-leader-nginx
2017-05-26T16:08:28.175881543Z W0526 16:08:28.175472       1 backend_ssl.go:42] deferring sync till endpoints controller has synced
2017-05-26T16:08:28.179906454Z W0526 16:08:28.179769       1 queue.go:94] requeuing kube-system/default-http-backend, err deferring sync till endpoints controller has synced
2017-05-26T16:08:31.207329775Z I0526 16:08:31.206860       1 event.go:217] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"basic-ingress", UID:"8fd367b9-422d-11e7-9dd4-d68827e778d4", APIVersion:"extensions", ResourceVersion:"278", FieldPath:""}): type: 'Normal' reason: 'CREATE' Ingress default/basic-ingress
2017-05-26T16:08:37.353651374Z I0526 16:08:37.353525       1 metrics.go:34] changing prometheus collector from  to default
2017-05-26T16:08:37.416440774Z I0526 16:08:37.416333       1 controller.go:421] ingress backend successfully reloaded...
2017-05-26T16:08:57.183350506Z I0526 16:08:57.183046       1 status.go:302] updating Ingress default/basic-ingress status to [{192.168.64.38 }]
2017-05-26T16:08:57.186454653Z I0526 16:08:57.186366       1 event.go:217] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"basic-ingress", UID:"8fd367b9-422d-11e7-9dd4-d68827e778d4", APIVersion:"extensions", ResourceVersion:"327", FieldPath:""}): type: 'Normal' reason: 'UPDATE' Ingress default/basic-ingress
2017-05-26T16:08:57.471160018Z W0526 16:08:57.471017       1 queue.go:94] requeuing kube-system/ingress-controller-leader-nginx, err 
2017-05-26T16:08:57.471182113Z -------------------------------------------------------------------------------
2017-05-26T16:08:57.471185648Z Error: exit status 1
2017-05-26T16:08:57.471188375Z nginx: the configuration file /tmp/nginx-cfg585054790 syntax is ok
2017-05-26T16:08:57.47119123Z 2017/05/26 16:08:57 [emerg] 164#164: no "events" section in configuration
2017-05-26T16:08:57.471194521Z nginx: [emerg] no "events" section in configuration
2017-05-26T16:08:57.471197512Z nginx: configuration file /tmp/nginx-cfg585054790 test failed
2017-05-26T16:08:57.471200655Z 
2017-05-26T16:08:57.471203144Z -------------------------------------------------------------------------------
2017-05-26T16:09:37.260238379Z E0526 16:09:37.260068       1 controller.go:417] unexpected failure restarting the backend: 
2017-05-26T16:09:37.260266173Z 2017/05/26 16:09:37 [emerg] 182#182: no "events" section in configuration
2017-05-26T16:09:37.260271749Z nginx: [emerg] no "events" section in configuration
2017-05-26T16:09:37.260276045Z W0526 16:09:37.260095       1 queue.go:94] requeuing kube-system/kube-dns, err exit status 1
2017-05-26T16:09:47.20646199Z I0526 16:09:47.206349       1 controller.go:421] ingress backend successfully reloaded...
2017-05-26T16:10:22.518854138Z 192.168.64.1 - [192.168.64.1] - - [26/May/2017:16:10:22 +0000] "GET / HTTP/1.1" 404 21 "-" "curl/7.51.0" 77 0.001 [upstream-default-backend] 172.17.0.4:8080 21 0.001 404
2017-05-26T16:10:30.797507654Z 192.168.64.1 - [192.168.64.1] - - [26/May/2017:16:10:30 +0000] "GET / HTTP/1.1" 404 21 "-" "curl/7.51.0" 77 0.000 [upstream-default-backend] 172.17.0.4:8080 21 0.000 404 

最后一点……当我在 basic-ingress.yaml 文件中添加一个 "host:" 标签,并将 basic-ingress.yaml 文件中使用的主机名映射到一个 IP /etc/hosts 中的地址 (192.168.64.37),然后我就能让它工作了。不确定为什么 Minikube 需要 "host" 标签,而 near-identical 教程在没有主机标签的情况下在 GCE 上运行。

如果您正在使用 minikube addons enable ingress,那么入口控制器将已经部署(无需部署您自己的)。可能与两个入口控制器发生冲突。我的建议是删除您创建的控制器并坚持使用已由 minikube ingress 插件部署的控制器。

经过一些实验,nginx 入口插件似乎错误地尝试重定向到 https 协议(端口 443),但如果未配置(我的情况),则“301 永久移动”发生错误...所以为了解决这个问题,我设置了 ssl-redirect 标志如下 (请参阅新注释标记 ingress.kubernetes.io/ssl-redirect 设置为 "false"),这似乎解决了问题。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  backend:
    serviceName: nginx
    servicePort: 80