如何将所有 Kubernetes Ingress 的 YAML 文件转换为使用 API 版本 networking.k8s.io/v1?

16

Kubernetes Ingress API版本networking.k8s.io/v1相对于extensions/v1beta1有很多字段方面的变化,如下所示:

结果翻译为:

Kubernetes Ingress API版本networking.k8s.io/v1相对于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

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

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

Kubernetes 版本:

kubectl version
Client Version: version.Info{Major:"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.Info{Major:"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"

我的Ingress 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 convert 应该可以完成这项工作,你的 kubectl 是否是最新版本?如果这不起作用,你可以通过使用 kubectl create -o yaml --dry-run 生成 yaml 文件(以便输出最新的 yaml),并根据你的需要配置该文件。 - Popopame
是的,k8s版本为v1.19.0。kubectl create似乎不会为我生成迁移后的ingress yaml,它只会返回现有的ingress yaml。 - apoorva kamath
8个回答

8

你手工重写它并不难,例如:

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

2
我理解当只有几个文件时,这看起来很琐碎。 但在我的情况下,我们有25个以上的文件,我正在寻找是否已经有一些 kubectl 插件或自动化可以帮助我。谢谢。 - apoorva kamath
在生产集群设置中拥有数百个这样的情况并不罕见,因此这并不容易或可行... - Akito

3

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

字段 变更
spec.backend 名称更改为spec.defaultBackend。
backend serviceName 名称更改为service.name。
servicePort 数字后端servicePort字段更名为service.port.number。字符串后端servicePort字段更名为service.port.name。
pathType 现在需要为每个指定的路径指定。值可以是:Prefix、Exact或ImplementationSpecific。为了匹配未定义的v1beta1行为,请使用ImplementationSpecific。

0

也许你已经得到了答案,但这对未来的其他人可能有帮助。 以下配置适用于我。

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

0
我写了这个GIST来为我工作。下载它并根据需要进行调整。它非常简单,并且会根据PyYAML的默认设置进行一些意外格式化,但至少在这里它可以完成任务。

0

0

使用 kubectl convert --output-version networking.k8s.io/v1

单个 YAML 文件

kubectl convert -f app-ingress.yaml --output-version networking.k8s.io/v1 > app-ingress-new.yaml

批量转换文件

k8s-ingress-convert.ps1 (Powershell)

Push-Location .

# Without this variable I was seeing
#   Select-String would have file lock (read lock)
#  and rename to -old.yaml would fail.
$ingress_v1beta_list = @(
  Get-ChildItem -Recurse *.yml,*.yaml | 
  Where-Object name -NotLike *-old* | 
  Select-String Ingress -List | 
  ForEach-Object { Select-String -LP $_.Path v1beta } |
  ForEach-Object { $_.path } );

$ingress_v1beta_list

foreach ($ki in $ingress_v1beta_list) {
    Set-Location $ki/.. -Verbose
    $kold=$ki.Replace('.yaml','-old.yaml').Replace('.yml','-old.yml');
    Move-Item $ki $kold -Verbose;
    Write-Warning "k8s converting $ki";
    kubectl convert -f $kold --output-version networking.k8s.io/v1 > $ki
}
Pop-Location

在 Powershell 中,正斜杠/路径在Win10/Win11上可以正常工作。尚未测试,但也可能适用于 Linux 和 Mac,因为使用了正斜杠。

与git和.gitignore最匹配。

*-old.yaml
*-old.yml

0
我写了一个Python脚本,用来转换整个Ingress配置,以防还有人在寻找这方面的帮助。

import yaml
def transform_yaml(file_name):
        with open(file_name, "r") as f:
        data = yaml.safe_load(f)

    for item in data["items"]:
        if item["kind"] == "Ingress" and item["apiVersion"] == "extensions/v1beta1":

            item["apiVersion"] = "networking.k8s.io/v1"

            for rule in item["spec"]["rules"]:
                for path in rule["http"]["paths"]:
                    path["pathType"] = "ImplementationSpecific"

                    backend_data = path.pop("backend")
                    new_backend_data = {
                        "service": {
                            "name": backend_data["serviceName"],
                            "port": {"number": backend_data["servicePort"]},
                        }
                    }
                    path["backend"] = new_backend_data

    with open("transformed_" + file_name, "w") as f:
        yaml.dump(data, f)

-1

convert 包含不合适的依赖关系。convert 必须依赖于 internal 类型(以进行转换),但是 kubectl 不应该依赖于这些类型。实际上,除了 API 服务器外,没有任何软件应该依赖于内部类型。 弃用计划是将 convert 创建为插件或独立二进制文件。因此,功能仍将存在;只是不在 kubectl 中。

可能的选项:

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

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

  3. 使用 git 配置版本对 K8s API 服务器执行 GET,以执行转换。

请看一下:kubectl-convert, kubernetes-release-notes, convert-issues


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