1. ホーム
  2. kubernetes

[解決済み] Kubernetes Ingressのv1beta1からv1への移行時に「io.k8s.api.networking.v1.IngressBackendのunknown field "serviceName"」というエラーになる。

2022-10-30 06:50:24

質問内容

私は以下のYAMLを自分のIngressに適用し、動作しました(現在も動作しています)。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  namespace: test-layer
annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: mylocalhost.com
      http:
        paths:
          - path: /
            backend:
              serviceName: test-app
              servicePort: 5000

しかし、非推奨であることを示すメッセージが表示されます。 networking.k8s.io/v1 . 私はそれを行うとき(下記参照)、それはエラーをスローします。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  namespace: test-layer
annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: mylocalhost.com
      http:
        paths:
          - path: /
            backend:
              serviceName: test-app
              servicePort: 5000

エラー

error: error validating "test-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

APIバージョンを変更した他は、特に変更はしていません。

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:"windows/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"}

どのように解決するのですか?

私は、この PR は、あなたが質問している変更を含んでいます。

`Ingress` and `IngressClass` resources have graduated to `networking.k8s.io/v1`. Ingress and IngressClass types in the `extensions/v1beta1` and `networking.k8s.io/v1beta1` API versions are deprecated and will no longer be served in 1.22+. Persisted objects can be accessed via the `networking.k8s.io/v1` API. Notable changes in v1 Ingress objects (v1beta1 field names are unchanged):
* `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
Other Ingress API updates:
* backends can now be resource or service backends
* `path` is no longer required to be a valid regular expression

の中を見ると 1.19 Ingress ドキュメント を見ると、新しい構文があるように見えます。

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

私は残念ながら自分でテストするための1.19クラスタを持っていませんが、これはあなたが遭遇しているものだと思います。