Microk8s仪表板使用nginx-ingress通过http无法工作(错误:`在版本“extensions/v1beta1”中没有匹配的种类“Ingress”`)

35

我在Ubuntu 20.04.3 LTS上运行microk8s v1.22.2。

/etc/hosts的输出:

127.0.0.1 localhost
127.0.1.1 main

microk8s status 的摘录:

addons:
  enabled:
    dashboard            # The Kubernetes dashboard
    ha-cluster           # Configure high availability on the current node
    ingress              # Ingress controller for external access
    metrics-server       # K8s Metrics Server for API access to service metrics

我检查了运行中的仪表板(kubectl get all --all-namespaces):

NAMESPACE     NAME                                             READY   STATUS    RESTARTS   AGE
kube-system   pod/calico-node-2jltr                            1/1     Running   0          23m
kube-system   pod/calico-kube-controllers-f744bf684-d77hv      1/1     Running   0          23m
kube-system   pod/metrics-server-85df567dd8-jd6gj              1/1     Running   0          22m
kube-system   pod/kubernetes-dashboard-59699458b-pb5jb         1/1     Running   0          21m
kube-system   pod/dashboard-metrics-scraper-58d4977855-94nsp   1/1     Running   0          21m
ingress       pod/nginx-ingress-microk8s-controller-qf5pm      1/1     Running   0          21m

NAMESPACE     NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
default       service/kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP    23m
kube-system   service/metrics-server              ClusterIP   10.152.183.81    <none>        443/TCP    22m
kube-system   service/kubernetes-dashboard        ClusterIP   10.152.183.103   <none>        443/TCP    22m
kube-system   service/dashboard-metrics-scraper   ClusterIP   10.152.183.197   <none>        8000/TCP   22m

NAMESPACE     NAME                                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   daemonset.apps/calico-node                         1         1         1       1            1           kubernetes.io/os=linux   23m
ingress       daemonset.apps/nginx-ingress-microk8s-controller   1         1         1       1            1           <none>                   22m

NAMESPACE     NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/calico-kube-controllers     1/1     1            1           23m
kube-system   deployment.apps/metrics-server              1/1     1            1           22m
kube-system   deployment.apps/kubernetes-dashboard        1/1     1            1           22m
kube-system   deployment.apps/dashboard-metrics-scraper   1/1     1            1           22m

NAMESPACE     NAME                                                   DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/calico-kube-controllers-69d7f794d9     0         0         0       23m
kube-system   replicaset.apps/calico-kube-controllers-f744bf684      1         1         1       23m
kube-system   replicaset.apps/metrics-server-85df567dd8              1         1         1       22m
kube-system   replicaset.apps/kubernetes-dashboard-59699458b         1         1         1       21m
kube-system   replicaset.apps/dashboard-metrics-scraper-58d4977855   1         1         1       21m

我想将microk8s仪表板暴露在本地网络中,以便通过http://main/dashboard/访问它。

为此,我执行了以下操作:nano ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: public
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: dashboard
  namespace: kube-system
spec:
  rules:
  - host: main
    http:
      paths:
      - backend:
          serviceName: kubernetes-dashboard
          servicePort: 443
        path: /

通过kubectl apply -f ingress.yaml启用ingress-config时出现以下错误:

error: unable to recognize "ingress.yaml": no matches for kind "Ingress" in version "extensions/v1beta1"

非常感谢您的帮助!

更新: @harsh-manvar 指出配置版本不匹配。我已经重写了 ingress.yaml,将其简化到最基本的版本:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashboard
  namespace: kube-system
spec:
  rules:
  - http:
      paths:
      - path: /dashboard
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443

应用这个可以起作用。同时,入口规则也会被创建。

NAMESPACE     NAME        CLASS    HOSTS   ADDRESS     PORTS   AGE
kube-system   dashboard   public   *       127.0.0.1   80      11m

然而,当我通过http://<ip-of-kubernetes-master>/dashboard访问仪表板时,我会遇到400错误。

来自入口控制器的日志:

192.168.0.123 - - [10/Oct/2021:21:38:47 +0000] "GET /dashboard HTTP/1.1" 400 54 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36" 466 0.002 [kube-system-kubernetes-dashboard-443] [] 10.1.76.3:8443 48 0.000 400 ca0946230759edfbaaf9d94f3d5c959a

仪表板是否也需要使用microk8s proxy进行公开?我以为入口控制器会处理这个问题,或者是我对此有误解吗?
3个回答

38
为解决错误error: unable to recognize "ingress.yaml": no matches for kind "Ingress" in version "extensions/v1beta1,您需要将apiVersion设置为 networking.k8s.io/v1,如Kubernetes v1.16文章中关于弃用API的说明所述:
  • 不再支持使用 extensions/v1beta1 API版本中的NetworkPolicy - 迁移到使用自v1.8以来可用的 networking.k8s.io/v1 API版本。 通过新版本可以检索/更新现有的持久化数据。
现在转向第二个问题。 您需要添加一些注释并对Ingress定义进行几个更改,以使控制面板在microk8s群集上正确公开: 我们需要它们才能将请求正确转发到后端Pod,详见该文章中的良好说明:

注意:"nginx.ingress.kubernetes.io/rewrite-target"注释在将请求转发到后端Pod之前重写URL。 对于"路径(path)"中的/dashboard(/ | $)(.*)(.*)存储访问Kubernetes Dashboard时生成的动态URL。 "nginx.ingress.kubernetes.io/rewrite-target"注释替换URL中捕获的数据,然后将请求转发到服务。 "nginx.ingress.kubernetes.io/configuration-snippet"注释重写URL,仅在访问ALB-URL/dashboard时添加尾随斜杠("/")。

另外我们还需要进行另外两个更改:实施以上所有内容后,最终的YAML文件如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^(/dashboard)$ $1/ redirect;
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    kubernetes.io/ingress.class: public
  name: dashboard
  namespace: kube-system
spec:
  rules:
  - http:
      paths:
      - path: /dashboard(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443

它应该可以正常工作,无需运行microk8s proxy命令。


8
error: unable to recognize "ingress.yaml": no matches for kind "Ingress" in version "extensions/v1beta1"

这是由于入口 API 版本不匹配造成的。

您正在运行 v1.22.2,而 YAML 中的 API 版本已经过时。

好的示例:https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/

您在 YAML 中使用的是旧的入口 API 版本 extensions/v1beta1

根据您正在运行的入口版本和 K8s 版本,您需要进行更改。

这适用于 K8s 的版本 1.19,也适用于 1.22

示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

参考:https://kubernetes.io/docs/concepts/services-networking/ingress/


4
如果您在尝试安装 AWS ALB 控制器 <2.0 时遇到此错误!以下是发生的情况: ALB 控制器 v1.x.x 使用的是 networking.k8s.io/v1beta1 API,该 API 在新版本的 k8s 中被删除了(https://kubernetes.io/blog/2021/07/14/upcoming-changes-in-kubernetes-1-22/#api-changes)。

所有 beta Ingress API(extensions/v1beta1 和 networking.k8s.io/v1beta1 API 版本)

  • 推荐的解决方案是升级您的 ALB 版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接