这里有一个非常有趣的情况。我重新安装了我的Kubernetes集群(裸机)。我有1个主节点和2个工作节点。在worker no . 2上,在主机上,我有一个Apache http服务器监听端口80并提供web页面。
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定义中。即使它不在价值观中。Yaml,在任何地方都没有提到。所以,如果你手动删除它,那么Nginx不会从安装在Kubernetes之外的Apache窃取端口80。