【问题标题】:How to test if NGINX ingress controller of K8S cluster is working correctly?如何测试 K8S 集群的 NGINX 入口控制器是否正常工作?
【发布时间】:2020-08-18 18:09:01
【问题描述】:
  • 集群类型:基于 OpenNebula 的裸机集群
  • 规格:4 个工作节点,每个工作节点 8 个 CPU,每个工作节点 32GB 内存/RAM

我正在尝试使用以下命令为我的集群设置 NGINX 入口控制器:

[root@onekube-ip-193-144-35-177 ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml

这给了我这个输出

namespace/ingress-nginx unchanged serviceaccount/ingress-nginx unchanged configmap/ingress-nginx-controller configured clusterrole.rbac.authorization.k8s.io/ingress-nginx unchanged clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged role.rbac.authorization.k8s.io/ingress-nginx unchanged rolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged service/ingress-nginx-controller-admission unchanged service/ingress-nginx-controller unchanged deployment.apps/ingress-nginx-controller created validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission unchanged clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged job.batch/ingress-nginx-admission-create unchanged job.batch/ingress-nginx-admission-patch unchanged role.rbac.authorization.k8s.io/ingress-nginx-admission unchanged rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged serviceaccount/ingress-nginx-admission unchanged

然后我使用以下命令编辑 ingress-nginx-controller 服务:

kubectl edit svc -n ingress-nginx ingress-nginx-controller

我在externalIPs下添加K8S集群的外部IP,在spec下:

[...]
spec:
 clusterIP: 10.99.1.223
 externalIPs:
 - 193.144.35.177
 externalTrafficPolicy: Cluster
 ports:
[...]

为了测试 NGINX 入口控制器是否正常工作,我现在应该能够浏览指向 K8S 集群 IP 地址的子域(例如 prometheus.grapevine-project.eu)(由 DNS 查找确认) ),并且如果控制器确实已正确设置,则 URL 应包含 NGINX 入口控制器返回的 "404 Not Found page"。但是,我目前在我的 Internet 浏览器上获得了一个 "This site can’t be reached prometheus.grapevine-project.eu took too long to respond." 页面。

这是测试 NGINX 是否正常工作的正确/推荐方法吗?我的 NGINX 入口控制器设置有什么问题吗?

PS

[root@onekube-ip-193-144-35-177 ~]# kubectl get svc -n ingress-nginx ingress-nginx-controller -o wide
NAME                       TYPE       CLUSTER-IP       EXTERNAL-IP      PORT(S)                      AGE   SELECTOR
ingress-nginx-controller   NodePort   10.105.197.205   193.144.35.177   80:30498/TCP,443:30781/TCP   14d   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx

【问题讨论】:

  • 该 IP 地址上的 80 端口似乎未打开。您确定没有防火墙阻止传入请求吗?
  • 9100 端口上好像有东西在运行:prometheus.grapevine-project.eu:9100
  • 请添加kubectl get svc -n ingress-nginx ingress-nginx-controller -o wide... -o yaml的输出,这样我们可以清楚地看到规范、选择器和元数据部分。
  • @Nick:请参阅问题底部以获取您提到的命令的输出
  • @paolo-morangio ,我已经编辑了我的答案。请检查并告诉我

标签: nginx kubernetes kubernetes-ingress nginx-ingress bare-metal-server


【解决方案1】:

无法通过 cmets 对其进行故障排除,让我们通过 Answers 来解决吗?我会根据进度编辑这篇文章。

来自https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml

我们可以看到type: NodePort 服务name: ingress-nginx-controller

这意味着你会有类似的东西:

ubectl get svc ingress-nginx-controller -n ingress-nginx
NAME                       TYPE       CLUSTER-IP    EXTERNAL-IP      PORT(S)                      AGE
ingress-nginx-controller   NodePort   10.99.1.223   193.144.35.177   80:30498/TCP,443:30781/TCP   8m40s

我可以看到您主机的 NodePort 范围内正好打开了 2 个端口。

PORT      STATE    SERVICE
30498/tcp filtered unknown
30781/tcp filtered unknown

请检查您是否能够通过 CLUSTER-IP:80 和 CLUSTER-IP:443 从集群内部访问应用程序

更新

我刚刚复制了您的设置,就我而言,它运行良好。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml


$ kubectl get all -n ingress-nginx

NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-rh2b4        0/1     Completed   0          82m
pod/ingress-nginx-admission-patch-l7ttw         0/1     Completed   0          82m
pod/ingress-nginx-controller-547b58f6cb-whrck   1/1     Running     0          82m

NAME                                         TYPE        CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.0.12.124   <none>          80:31691/TCP,443:30114/TCP   82m
service/ingress-nginx-controller-admission   ClusterIP   10.0.1.61     <none>          443/TCP                      82m

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           82m

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-547b58f6cb   1         1         1       82m

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           6s         82m
job.batch/ingress-nginx-admission-patch    1/1           7s         82m

$ kubectl -n ingress-nginx get ep
NAME                                 ENDPOINTS                      AGE
ingress-nginx-controller             10.52.0.49:80,10.52.0.49:443   82m
ingress-nginx-controller-admission   10.52.0.49:8443                82m


即使没有编辑服务,我也能够将请求从本地电脑发送到 K8s 集群(我的防火墙允许我这样做)。

$ curl K8S_node_IP:31691
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.19.1</center>
</body>
</html>

$ curl K8S_node_IP:30114
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.19.1</center>
</body>
</html>

ingress-nginx-controllerNodePort 类型,所以在我的情况下,不需要编辑它,因为我已经知道我的 K8s_node_IP。

为了解决您描述的问题(服务器超时),可以执行以下操作:

  • 检查问题是否与 nginx-ingress 相关。为此,我已经有了可以通过kubectl cli 轻松部署的最小容器。
$ kubectl create deployment server-gog -n ingress-nginx --image=nkolchenko/enea:server_go_latest
deployment.apps/server-gog created

$ kubectl expose -n ingress-nginx deployment server-gog --type=NodePort --port=8180 --selector=app=server-gog

$ kubectl get svc -o wide -n ingress-nginx server-gog
NAME         TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE   SELECTOR
server-gog   NodePort   10.0.10.254   <none>        8180:32068/TCP   76s   app=server-gog

### our app is avaliable at K8S_node_IP:32068 and 10.0.10.254:8180

$ curl K8S_node_IP:32068/some_string
Hello from ServerGo. You requested: /some_string

如果上述方法确实有效,那么问题出在您的ingress-nginx 设置中。并且需要对每个组件进行检查。

【讨论】:

  • 如果我运行 curl CLUSTER-IP:443curl CLUSTER-IP:80 我没有得到回应。该命令甚至没有返回。
  • @paolo 你是从你的电脑/笔记本电脑还是从另一个 pod 运行它的?端口 80 和 443 不暴露在外部。
【解决方案2】:

我会尝试回答您的两个问题,但这可能会让您在入口控制器完全运行之前还有更多工作要做

  1. 您是否以正确的方式测试您的 Nginx 入口控制器?我会说不。测试控制器的最佳方法是创建一个入口对象,将流量路由到echoserver 等简单服务,并确保流量按预期路由到该入口。您执行的 http 请求应该返回 404 是正确的,但即使您实现了这一点,在完成整个循环之前您仍然可能会错过一些问题(像 SSL 终止之类的东西是最明显的陷阱,但是更多)
  2. 您的设置似乎确实存在一些问题。您用作外部 IP 的 IP 是什么?您为什么希望它将流量路由到您的集群中?

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多