如何在 Kubernetes 中启用 default-http-backend 以使 Ingress 正常工作?

Sas*_*ota 9 networking kubernetes kubernetes-ingress microk8s

我有一个来自microk8s 的单节点 Kubernetes 实例。它安装在运行 Raspberry Pi 4 的 Ubuntu Server 20.20 上。

我正在尝试设置一个无法工作的入口资源。

当我运行时kubectl describe ingress my-ingress我得到这个输出

Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Run Code Online (Sandbox Code Playgroud)

从我在互联网上找到的内容来看,default-http-backend默认情况下应该有一些东西,但是当我运行时kubectl get pods -n kube-system我看不到它。

问:如何default-http-backend在 mikrok8s 中启用?或者更一般地说,我如何使 Ingress 工作?

注意:Ingress 和 DNS 插件已启用。

Rob*_*ert 11

当入口控制器无法匹配任何规则时,默认后端是后备。

apiVersion: networking.k8s.io/v1

spec:
  defaultBackend:
    service:
      name: tea-svc
      port:
        number: 80
Run Code Online (Sandbox Code Playgroud)

这是一个完整的示例,使用v1

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
spec:
  defaultBackend:
    service:
      name: tea-svc
      port:
        number: 80
  rules:
    - host: cafe.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: tea-svc
                port:
                  number: 80
Run Code Online (Sandbox Code Playgroud)

apiVersion: networking.k8s.io/v1beta1

根据apiVersionyaml 文件的不同,默认后端以不同的格式指定。看起来您正在使用测试版格式。

spec:
    backend:
        serviceName: tea-svc
        servicePort: 80
Run Code Online (Sandbox Code Playgroud)

NGINX Ingress Controller 抱怨v1beta1,到目前为止它可以在 kubernetes 1.21.2 中运行,但正如警告所示,它不会很快运行:

networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Run Code Online (Sandbox Code Playgroud)


Pjo*_*erS 4

我已经在我的集群上测试了这种行为。当我尝试您提供的配置时,我得到以下信息Warning

\n
@microk8s:~$ microk8s kubectl get ing\nWarning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress\n
Run Code Online (Sandbox Code Playgroud)\n

另外,如果您描述它,您也会得到相同的结果Warning

\n
@microk8s:~$ kk describe ing\nWarning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress\nName:             hello-ing\nNamespace:        default\nAddress:          \n    Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)\nRules:\n  Host        Path  Backends\n  ----        ----  --------\n  *           \n              /hello   hello-svc:80   10.1.128.202:8080)\n
Run Code Online (Sandbox Code Playgroud)\n

关于此错误有类似的Github问题。

\n
\n

您看到的输出只是没有默认后端时的默认输出\n https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/kubectl/pkg/describe/describe.go #L2393

\n
\n

不过,它工作正常。

\n
$ curl 127.0.0.1/hello\nHello, world!\nVersion: 1.0.0\nHostname: hello-647c466dbc-99rml\n
Run Code Online (Sandbox Code Playgroud)\n

如果您添加默认后端,您将得到如下输出:

\n
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress\nName:             ingress\nNamespace:        default\nAddress:          127.0.0.1\nDefault backend:  test2:80   10.1.128.205:80)\nRules:\n  Host        Path  Backends\n  ----        ----  --------\n  *           \n              /hello   hello-svc:80   10.1.128.204:8080)\n
Run Code Online (Sandbox Code Playgroud)\n

看起来Ingress像:

\n
spec:\n  backend:\n    serviceName: test2\n    servicePort: 80\n  rules:\n  - http:\n      paths:\n      - path: /hello\n        backend:\n          serviceName: hello-svc\n          servicePort: 80\n
Run Code Online (Sandbox Code Playgroud)\n

虽然我不明白为什么半年前有效的东西现在不起作用了。

\n

由于新apiVersion版本更改了一些语法,添加了一些功能、参数等,因此可能会出现更新/升级后某些资源无法再通过Kubernetes. 正如本文所述。

\n
\n

Kubernetes 中的对象定义需要 apiVersion 字段。当 Kubernetes 有一个更新可供您使用的版本时\xe2\x80\x94更改其 API 中的某些内容\xe2\x80\x94,会创建新的 apiVersion。\n但是,官方 Kubernetes 文档几乎没有提供有关 apiVersion 的指导。本指南为您提供了有关使用哪个版本的备忘单,解释了每个版本,并提供了发布时间表。

\n
\n

如果您只更改 YAML 中的 apiVersion,则会收到错误消息:

\n
error: error validating "ingress.yaml": error validating data: [ValidationError(Ingress.spec.rules[0].http.paths[0].backend): unknown field "serviceName" in io.k8s.api.networking.v1.IngressBackend, ValidationError(Ingress.spec.rules[0].http.paths[0].backend): unknown field "servicePort" in io.k8s.api.networking.v1.IngressBackend]; if you choose to ignore these errors, turn validation off with --validate=false\n
Run Code Online (Sandbox Code Playgroud)\n

总而言之,你得到这个<error: endpoints "default-http-backend" not found>是因为没有default backend配置。

\n

有关更多详细信息,您可以查看Kubernetes Api 文档

\n