如何在 Kubernetes 中启用 default-http-backend 以使 Ingress 工作?
How to enable default-http-backend in Kubernetes in order to make Ingress work?
我有一个来自 microk8s 的单节点 Kubernetes 实例。它安装在 Ubuntu Server 20.20 运行ning on Raspberry Pi 4.
我正在尝试设置无法正常工作的入口资源。
当我 运行 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 和 DNS 插件已启用。
我已经在我的集群上测试了这个行为。当我尝试你提供的配置时,我得到了以下 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 问题。
The output you see is just a default for when there is no default backend
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
更改了一些语法,添加了一些功能、参数等,可能会出现 update/upgrade 之后某些资源无法再被 Kubernetes
验证的情况。如 this article.
所述
An object definition in Kubernetes requires an apiVersion field. When Kubernetes has a release that updates what is available for you to use—changes something in its API—a new apiVersion is created.
However, the official Kubernetes documentation provides little guidance on apiVersion. This guide gives you a cheat sheet on which version to use, explains each version, and gives you the timeline of releases.
如果您只更改 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
总而言之,您得到了这个 <error: endpoints "default-http-backend" not found>
,因为没有配置 default backend
。
更多详情请查看Kubernetes Api Docs。
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
,默认后端以不同的格式指定。您似乎使用的是测试版格式。
spec:
backend:
serviceName: tea-svc
servicePort: 80
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
我有一个来自 microk8s 的单节点 Kubernetes 实例。它安装在 Ubuntu Server 20.20 运行ning on Raspberry Pi 4.
我正在尝试设置无法正常工作的入口资源。
当我 运行 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 和 DNS 插件已启用。
我已经在我的集群上测试了这个行为。当我尝试你提供的配置时,我得到了以下 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 问题。
The output you see is just a default for when there is no default backend 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
更改了一些语法,添加了一些功能、参数等,可能会出现 update/upgrade 之后某些资源无法再被 Kubernetes
验证的情况。如 this article.
An object definition in Kubernetes requires an apiVersion field. When Kubernetes has a release that updates what is available for you to use—changes something in its API—a new apiVersion is created. However, the official Kubernetes documentation provides little guidance on apiVersion. This guide gives you a cheat sheet on which version to use, explains each version, and gives you the timeline of releases.
如果您只更改 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
总而言之,您得到了这个 <error: endpoints "default-http-backend" not found>
,因为没有配置 default backend
。
更多详情请查看Kubernetes Api Docs。
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
,默认后端以不同的格式指定。您似乎使用的是测试版格式。
spec:
backend:
serviceName: tea-svc
servicePort: 80
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