为什么 Nginx 入口控制器“窃取”主机上运行的 Apache 的流量?

问题描述 投票:0回答:1

我这里有一个非常有趣的情况。 :-) 我重新安装了我的 Kubernetes 集群(裸机)。我有 1 个主节点和 2 个工作节点。在主机上的 2 号工人上,我有一个 Apache http 服务器侦听端口 80 并提供网页。

NAME         STATUS   ROLES           AGE   VERSION
kubemaster   Ready    control-plane   22h   v1.26.3
kubenode-1   Ready    <none>          21h   v1.26.3
kubenode-2   Ready    <none>          21h   v1.26.3

我在我的集群上安装了 Nginx 入口控制器作为守护进程集。所以有 2 个控制器在我的 2 个工作节点上运行。

NAME                READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
bkk-ingress-5p7b8   1/1     Running   0          31m   192.168.29.136   kubenode-1   <none>           <none>
bkk-ingress-rxjw4   1/1     Running   0          31m   192.168.77.72    kubenode-2   <none>           <none>

这是有趣的部分。当我想访问主机上 Apache 提供的网页时,流量由 Nginx 占用,我看到 Nginx 入口控制器未找到页面而不是我的网页。但是只有 apache 在监听 80 端口:

[root@kubenode-2 ~]$ netstat -tulpn | grep --color :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1099870/httpd
[root@kubenode-2 ~]$ netstat -tulpn | grep --color :443
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      1099870/httpd

入口服务是一个 NodePort,它不应该使用端口 80 或 443:

apiVersion: v1
kind: Service
metadata:
  annotations:
    meta.helm.sh/release-name: bkk
    meta.helm.sh/release-namespace: nginx
  creationTimestamp: "2023-03-30T21:00:17Z"
  labels:
    app.kubernetes.io/instance: bkk
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: bkk-nginx-ingress
    helm.sh/chart: nginx-ingress-0.16.2
  name: bkk-nginx-ingress
  namespace: nginx
  resourceVersion: "159007"
  uid: 1f45c592-80e0-4fb5-acbd-a04c76772e6a
spec:
  clusterIP: 10.104.170.119
  clusterIPs:
  - 10.104.170.119
  externalTrafficPolicy: Local
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http
    nodePort: 31902
    port: 801
    protocol: TCP
    targetPort: 801
  - name: https
    nodePort: 31903
    port: 4431
    protocol: TCP
    targetPort: 4431
  selector:
    app: bkk-ingress
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

而且我的系统中没有任何地方定义一个入口:

[root@kubemaster helm-chart]$ kubectl get ingresses --all-namespaces
No resources found

有人知道这里发生了什么吗?为什么作为 Kubernetes pod 生活和运行的 Nginx 从主机窃取流量?

kubernetes nginx kubernetes-ingress nginx-ingress
1个回答
1
投票

我发现了...当我使用 Helm 安装 Nginx 时,它默认将 hostPort:80 添加到 pod 定义中。即使它不在 values.yaml 中,也没有在任何地方提及。所以,如果你手动删除它,那么 Nginx 就不会从安装在 Kubernetes 之外的 Apache 窃取端口 80。

© www.soinside.com 2019 - 2024. All rights reserved.