入口对象不会重定向到服务

Ingress object doesn't redirect to service

我正在尝试在我的 kubernetes 集群中设置 Ingress,但没有成功。我遵循了指定的说明 here。基本上我应用了以下对象:

首先,设置 RBAC 基础设施:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
    - extensions
    resources:
    - ingresses/status
    verbs:
    - update
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  name: traefik-ingress-controller
  namespace: kube-system

**Versions**: <br>
Kubectl, kubeadm, kubelet: 1.21.00<br>
Traefik 1.17

然后,使用 Pods 运行ing 入口控制器创建了一个 DaemonSet:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
      name: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik:v1.7
        name: traefik-ingress-lb
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8080
          hostPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin

现在,我可以在我的一个节点上使用端口 8080 访问 Ingress Web UI,而且我还知道端口 80 将流量定向到 Ingress Controller,因为当我 运行

$ curl localhost:80
404 page not found

问题是,当尝试创建 Ingress 对象时,出于某种原因,Ingress Controller 没有将其重定向到后端服务。创建了以下对象:

apiVersion: v1
kind: Service
metadata:
  name: svc-myserver
spec:
  type: ClusterIP
  selector: 
    app: my-server
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000

这有效,当 运行ning:

$ curl 10.100.127.255
Hello world ! Version 1

现在,所有要做的就是创建一个将流量转发到服务的 Ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-server-ingress
  namespace: kube-system
spec:
  rules:
  - host: myapp.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc-myserver
            port:
                   number: 80

现在当我运行:

$ kubectl get ingress -A
NAMESPACE     NAME                CLASS    HOSTS                 ADDRESS   PORTS   AGE
kube-system   my-server-ingress   <none>   myapp.com                       80      13h

您可以看到 ADDRESS 字段是空的,事实上当我尝试浏览到这个 myapp.com(在 /etc/hosts 中更新)- 我得到 404。

我错过了什么?

版本
kubeadm、kubectl、kubelet - 1.21.00
Traefik 1.17

好的,我明白问题出在哪里了:我的 Ingress 对象与服务不在同一个命名空间中。在检查 Ingress Controller 的 Pod 的日志时,我得到:

time="2021-12-21T19:16:33Z" level=error msg="Service not found for kube-system/svc-myserver"
time="2021-12-21T19:16:33Z" level=error msg="Service not found for kube-system/traefik-web-ui"
time="2021-12-21T19:16:33Z" level=error msg="Service not found for kube-system/traefik-web-ui"
time="2021-12-21T19:16:33Z" level=error msg="Service not found for kube-system/svc-myserver"
time="2021-12-21T19:16:33Z" level=error msg="Service not found for kube-system/traefik-web-ui"

一旦我将它移动到正确的命名空间,它就非常有效。

谢谢!