我这里有一个非常有趣的情况。 :-) 我重新安装了我的 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 从主机窃取流量?
我发现了...当我使用 Helm 安装 Nginx 时,它默认将 hostPort:80 添加到 pod 定义中。即使它不在 values.yaml 中,也没有在任何地方提及。所以,如果你手动删除它,那么 Nginx 就不会从安装在 Kubernetes 之外的 Apache 窃取端口 80。