为什么 NodePort 服务在 Kubernetes Master 节点上无法访问?

为什么 NodePort 服务在 Kubernetes Master 节点上无法访问?

我在裸机虚拟机上安装了 Kubernetes (1.28.2) 集群。一个主节点和两个工作节点。我正在使用 Calico pod 网络。

我已经部署了具有 NodePort 可访问性的 Traefik 入口。还部署了一个非常简单的whoami服务,只有一个副本。我添加了必要的入口,并且我相信还添加了所有其他配置。

当我尝试whoami使用分配给 Traefik 的 nodePort 访问服务时,它无法从 master 访问。但只能从 Master 访问,因为当我使用相同的 nodeport 访问任何工作节点时,它都可以正常工作并且我会得到响应whoami

我使用firewalld服务,并且所有必要的端口都已打开。但这并不重要,因为如果我禁用防火墙,呼叫仍然会超时,就像打开防火墙一样。

首先,我尝试检查 Traefik 部署访问日志,但当我访问主节点时,那里什么都没有写。(当我访问工作节点时,日志按预期显示“路由”)。所以,我想,处理包时一定存在一些问题。因此,我尝试使用所述方法跟踪 iptables这里但基本上,日志没有移动,当我瞄准 master 上的 nodeport 时,看起来没有任何包触及 master 上的任何规则/链/任何东西。

告诉我您想查看什么配置,以便了解发生了什么,我会更新这篇文章!

以下是我的一些预先配置:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-account
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: traefik-role

rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
      - networking.k8s.io
    resources:
      - ingresses
      - ingressclasses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
      - networking.k8s.io
    resources:
      - ingresses/status
    verbs:
      - update
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: traefik-role-binding

roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-role
subjects:
  - kind: ServiceAccount
    name: traefik-account
    namespace: default # Using "default" because we did not specify a namespace when creating the ClusterAccount.
---
apiVersion: v1
kind: Service
metadata:
  name: traefik-dashboard-service

spec:
  type: NodePort
  ports:
    - nodePort: 32001
      port: 8080
      targetPort: dashboard
  selector:
    app: traefik
---
apiVersion: v1
kind: Service
metadata:
  name: traefik-web-service

spec:
  type: NodePort
  ports:
    - nodePort: 32000
      targetPort: web
      port: 80
  selector:
    app: traefik
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: traefik-deployment
  labels:
    app: traefik

spec:
  replicas: 1
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-account
      containers:
        - name: traefik
          image: traefik:v2.10
          args:
            - --api.insecure
            - --providers.kubernetesingress
            - --accesslog
          ports:
            - name: web
              containerPort: 80
            - name: dashboard
              containerPort: 8080

我的主服务器上打开的端口(我想在 por 32000 上使用该应用程序):

  ports: 1903/tcp 6443/tcp 8080/tcp 10250/tcp 10251/tcp 10252/tcp 10255/tcp 2379-2380/tcp 5473/tcp 179/tcp 4789/udp 8285/udp 8472/udp 30000-32767/tcp

并且whoami入口定义应该在整个集群中起作用:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami-ingress-test
spec:
  rules:
  - http:
      paths:
      - path: /whoamitest
        pathType: Prefix
        backend:
          service:
            name: whoami
            port:
              name: web

任何帮助都将不胜感激!

相关内容