如何将所有 kubernetes 入口 yamls 转换为使用 API 版本networking.k8s.io/v1

Posted

技术标签:

【中文标题】如何将所有 kubernetes 入口 yamls 转换为使用 API 版本networking.k8s.io/v1【英文标题】:how to convert all kubernetes ingress yamls to use API version networking.k8s.io/v1 【发布时间】:2020-12-25 14:41:39 【问题描述】:

Kubernetes Ingress API 版本networking.k8s.io/v1 在字段 wrt extensions/v1beta1 中有很多变化,如下所示:

* `spec.backend` -> `spec.defaultBackend`
* `serviceName` -> `service.name`
* `servicePort` -> `service.port.name` (for string values)
* `servicePort` -> `service.port.number` (for numeric values)
* `pathType` no longer has a default value in v1; "Exact", "Prefix", or "ImplementationSpecific" must be specified

将所有入口 yaml 文件从 extensions/v1beta1 转换为networking.k8s.io/v1 的最简单方法是什么。

看起来 kubectl convert 在 v1.19 中已被弃用。

Kubernetes 版本:

kubectl version
Client Version: version.InfoMajor:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:30:33Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"
Server Version: version.InfoMajor:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:23:04Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"

使用 kubectl convert 时出错:

kubectl convert -f ingress_4_10_1.yaml --output-version  networking.k8s.io/v1
kubectl convert is DEPRECATED and will be removed in a future version.
In order to convert, kubectl apply the object to the cluster, then kubectl get at the desired version.
error: networking.Ingress is not suitable for converting to "networking.k8s.io/v1" in scheme "k8s.io/kubernetes/pkg/api/legacyscheme/scheme.go:30"

我的入口 yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  annotations:
   kubernetes.io/ingress.class: "ing-class1"
spec:
  rules:
  - host:  frontend.com
    http:
      paths:
      - path: /web-frontend/frontend.php
        backend:
          serviceName: frontend
          servicePort: 80

【问题讨论】:

kubectl convet 应该做的工作,你 kubectl 是最新的吗?如果这不起作用,您可以通过kubectl create -o yaml --dry-run 生成 yaml 手动完成(因此它输出最新的 yaml)并根据需要配置 yaml。 是的,k8s 版本是 v1.19.0。 kubectl create 似乎没有为我生成迁移的入口 yaml,它只是返回现有的入口 yaml 【参考方案1】:

convert 包含不适当的依赖项。 convert 必然依赖于 internal 类型(为了转换),但 kubectl 不应该依赖于这些。实际上,api server 之外的任何软件都不应该依赖于内部类型。 弃用计划是将convert 创建为插件或单独的二进制文件。所以功能仍然存在;只是不在kubectl

可能的选择:

    开始在缓存中存储所有版本。可能意味着回到使用 disco.ServerResources() 而不是 disco.ServerPreferredResources() - 查找仍然很快。保证工作,因为我们有所有版本的对象供查找。

    找到使用 k8s 库而不是 kubectl convert 转换对象的正确方法

    使用 git config 版本对 K8s API 服务器执行 GET,以执行转换。

看一看:kubectl-convert、kubernetes-release-notes、convert-issues。

【讨论】:

【参考方案2】:

使用https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource 中的新模式,从头开始编写它可能更容易,而不是转换。 我重写了我的,它有效。 希望对您有所帮助。

【讨论】:

【参考方案3】:

手工重写并不难,例如:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend
  annotations:
   kubernetes.io/ingress.class: "ing-class1"
spec:
  rules:
  - host: frontend.com
    http:
      paths:
      - backend:
          service:
            name: frontend
            port:
              number: 80
        path: /web-frontend/frontend.php
        pathType: Exact

【讨论】:

我知道它只有几个文件时看起来微不足道。但就我而言,我们有 25 个以上的文件,我一直在寻找是否已经有一些 kubectl 插件或自动化可以帮助我。谢谢。【参考方案4】:

也许您得到了答案,但将来可能对其他人有所帮助。 以下配置对我有用。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-srv
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
    - host: addtest.com
      http:
        paths:
          - path: /add
            pathType: Prefix
            backend:
              service:
                name: add-srv
                port:
                  number: 4000

【讨论】:

【参考方案5】:

在https://cloud.google.com/kubernetes-engine/docs/deprecations/apis-1-22#ingress-v122 中找到了所需更改的精彩摘要

Field Change
spec.backend Renamed to spec.defaultBackend.
backend serviceName Renamed to service.name.
servicePort Numeric backend servicePort fields are renamed to service.port.number. String backend servicePort fields are renamed to service.port.name.
pathType Now required for each specified path. The value can be: Prefix, Exact, or ImplementationSpecific. To match the undefined v1beta1 behavior, use ImplementationSpecific.

【讨论】:

以上是关于如何将所有 kubernetes 入口 yamls 转换为使用 API 版本networking.k8s.io/v1的主要内容,如果未能解决你的问题,请参考以下文章

如何不编写 YAML 管理 Kubernetes 应用?

如何在 GKE 中通过入口启用 Cors

如何通过yaml将秘密文件设置为kubernetes秘密?

如何将 gitlab ci/cd 变量传递给 kubernetes(AKS) deployment.yaml

Nginx 入口控制器返回 404 Kubernetes

如何在 kubernetes 中使用 yaml 文件删除和重新创建 pod