【问题标题】:How to enable default-http-backend in Kubernetes in order to make Ingress work?如何在 Kubernetes 中启用 default-http-backend 以使 Ingress 正常工作?
【发布时间】:2021-01-08 13:53:30
【问题描述】:

我有一个来自 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>)

根据我在互联网上的发现,default-http-backend 是默认情况下应该存在的,但是当我运行kubectl get pods -n kube-system 时,我没有看到它。

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

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

【问题讨论】:

  • 您是如何创建deploymentservice 的?使用选择器或headless?你能分享你的 YAML(部署、svc、入口)吗?
  • @PjoterS 我的配置看起来和这个完全一样(只是占位符被填充):raw.githubusercontent.com/Shpota/cde/master/k8s/resources.yml
  • 您似乎在使用selectors,但是您也在使用nginx.ingress.kubernetes.io/rewrite-target: /,仅当您使用Nginx Ingress 时才支持。另外我不确定 MicroK8s 是否支持 rewrite。您是否尝试删除此注释并使用 docs 中的示例?
  • @PjoterS 谢谢。配置 100% 正常工作(至少是 6 个月前)。那时,我在安装在 Ubuntu 笔记本电脑上的 mikrok8s 上对其进行了测试。这次我尝试在 Raspberry Pi 上运行它。当然,现在 mikrok8s 的版本可能有所不同,但理论上它应该以相同的方式工作。奇怪的是文档中的配置显示了相同的错误但运行良好。我不明白为什么。同时,如果我尝试将路径设置为除根路径之外的其他路径,它会给我 404(我正在检查 curl 127.0.0.1:80/new-path)。有什么想法吗?
  • @PjoterS 我猜问题出在使用v1beta1 API 版本上。在我将 Ingress 配置更改为 this one 后,它起作用了。虽然我不明白为什么半年前有效的东西现在不起作用。

标签: networking kubernetes kubernetes-ingress microk8s


【解决方案1】:

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

@microk8s:~$ microk8s kubectl get ing
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress

另外,如果你描述它,你会得到相同的Warning

@microk8s:~$ kk describe ing
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Name:             hello-ing
Namespace:        default
Address:          
    Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host        Path  Backends
  ----        ----  --------
  *           
              /hello   hello-svc:80   10.1.128.202:8080)

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

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

但是,它工作正常。

$ curl 127.0.0.1/hello
Hello, world!
Version: 1.0.0
Hostname: hello-647c466dbc-99rml

如果你添加default backend,你会得到如下输出:

Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Name:             ingress
Namespace:        default
Address:          127.0.0.1
Default backend:  test2:80   10.1.128.205:80)
Rules:
  Host        Path  Backends
  ----        ----  --------
  *           
              /hello   hello-svc:80   10.1.128.204:8080)

Ingress 看起来像:

spec:
  backend:
    serviceName: test2
    servicePort: 80
  rules:
  - http:
      paths:
      - path: /hello
        backend:
          serviceName: hello-svc
          servicePort: 80

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

由于新的apiVersion 更改了一些语法,添加了一些功能、参数等,在更新/升级后可能会出现Kubernetes 无法再验证某些资源的情况。如this article 所述。

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

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

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

总而言之,你得到了这个&lt;error: endpoints "default-http-backend" not found&gt;,因为没有配置default backend

更多详情可以查看Kubernetes Api Docs

【讨论】:

    【解决方案2】:

    default backend 是入口控制器无法匹配任何规则时的后备。

    apiVersion: networking.k8s.io/v1

    spec:
      defaultBackend:
        service:
          name: tea-svc
          port:
            number: 80
    

    这是一个使用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
    

    apiVersion: networking.k8s.io/v1beta1

    根据您的 yaml 文件的 apiVersion,以不同的格式指定默认后端。看起来您正在使用 beta 格式。

    spec:
        backend:
            serviceName: tea-svc
            servicePort: 80
    

    NGINX 入口控制器抱怨 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
    

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 2019-09-27
      • 2021-06-07
      • 2020-05-06
      • 2014-08-01
      • 2021-08-23
      • 2021-09-02
      • 2021-08-24
      • 1970-01-01
      相关资源
      最近更新 更多