Kustomize - “未能找到补丁的唯一目标......”

vic*_*vic 11 kubernetes

我刚刚开始使用 kustomize。我有以下用于 kustomize 的 yaml 文件:

ls -l ./kustomize/base/
816 Apr 18 21:25 deployment.yaml
110 Apr 18 21:31 kustomization.yaml
310 Apr 18 21:25 service.yaml
Run Code Online (Sandbox Code Playgroud)

其中,deployment.yaml 和 service.yaml 是使用 jib 生成的文件,并且运行良好。kustomization.yaml 的内容如下:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:  
- service.yaml
- deployment.yaml  
Run Code Online (Sandbox Code Playgroud)

并且在另一个目录中

ls -l ./kustomize/qa
133 Apr 18 21:33 kustomization.yaml
95 Apr 18 21:37 update-replicas.yaml
Run Code Online (Sandbox Code Playgroud)

在哪里

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ../base

patchesStrategicMerge:
- update-replicas.yaml
Run Code Online (Sandbox Code Playgroud)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
Run Code Online (Sandbox Code Playgroud)

运行“kustomize build ./kustomize/base”后,我运行

~/kustomize build ./kustomize/qa
Error: no matches for OriginalId ~G_~V_Deployment|~X|my-app; no matches for CurrentId ~G_~V_Deployment|~X|my-app; failed to find unique target for patch ~G_~V_Deployment|my-app
Run Code Online (Sandbox Code Playgroud)

我查看了相关文件,没有发现应用程序名称有任何拼写错误。

这是deployment.yaml 文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: my-app
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: my-app
    spec:
      containers:
        - image: docker.io/[my Docker ID]/my-app
        name: my-app
        resources: {}
        readinessProbe:
          httpGet:
            port: 8080
            path: /actuator/health/readiness
        livenessProbe:
          httpGet:
            port: 8080
            path: /actuator/health/liveness
        lifecycle:
          preStop:
            exec:
              command: ["sh", "-c", "sleep 10"]
status: {}
Run Code Online (Sandbox Code Playgroud)

同样,上述文件是使用 jib 生成的,并进行了一些修改。它直接运行在 Kubernetes 上。

如何解决这个问题?

小智 29

我遇到了同样的问题并已修复。\n此问题与安装的 Kustomize 版本有关。查看!kustomize version.\n从 Kustomize v3.0.x\xe2\x80\xa8 及更高版本开始,我们还需要在补丁中提及命名空间。在补丁 yaml 文件中添加命名空间后,问题得到解决。

\n

在您的示例中,在 update-replicas.yaml 补丁文件中的元数据下添加命名空间。

\n

有关 kustomize 版本相关问题的更多详细信息(例如“...无法找到补丁的唯一目标...”): https: //github.com/kubernetes-sigs/kustomize/issues/1351

\n


Wil*_*.F. 8

我能够重现您的场景并且没有收到任何错误。

\n\n

我将发布一个逐步示例,以便您可以仔细检查您的示例。

\n\n
    \n
  • 我将使用一个简单的 nginx 服务器作为示例,以下是文件结构:
  • \n
\n\n
$ tree Kustomize/\nKustomize/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 deployment.yaml\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 service.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 qa\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 update-replicas.yaml\n2 directories, 5 files\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 基础 Yaml:
  • \n
\n\n
$ cat Kustomize/base/kustomization.yaml \napiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\n\nresources:\n- deployment.yaml\n- service.yaml\n
Run Code Online (Sandbox Code Playgroud)\n\n
$ cat Kustomize/base/deployment.yaml \napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  labels:\n    app: my-app\n  name: my-app\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: my-app\n  template:\n    metadata:\n      labels:\n        app: my-app\n    spec:\n      containers:\n      - name: my-app\n        image: nginx\n        ports:\n        - containerPort: 80\n
Run Code Online (Sandbox Code Playgroud)\n\n
$ cat Kustomize/base/service.yaml \nkind: Service\napiVersion: v1\nmetadata:\n  name: nginx-svc\nspec:\n  selector:\n    app: my-app\n  type: NodePort\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 80\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 卡亚姆斯:
  • \n
\n\n
$ cat Kustomize/qa/kustomization.yaml \napiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\n\nresources:\n- ../base\n\npatchesStrategicMerge:\n- update-replicas.yaml\n
Run Code Online (Sandbox Code Playgroud)\n\n
$ cat Kustomize/qa/update-replicas.yaml \napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: my-app\nspec:\n  replicas: 2\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 现在我将构建base并应用:
  • \n
\n\n
$ kustomize build ./Kustomize/base | kubectl apply -f -\nservice/nginx-svc created\ndeployment.apps/my-app created\n\n$ kubectl get all\nNAME                          READY   STATUS    RESTARTS   AGE\npod/my-app-64778f875b-7gsg4   1/1     Running   0          52s\n\nNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE\nservice/nginx-svc    NodePort    10.96.114.118   <none>        80:31880/TCP   52s\n\nNAME                     READY   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps/my-app   1/1     1            1           52s\n\nNAME                                DESIRED   CURRENT   READY   AGE\nreplicaset.apps/my-app-64778f875b   1         1         1       52s\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切都按预期部署,Pod、部署、服务和副本集,有 1 个副本。\n- 现在让我们部署更新qa

\n\n
$ kustomize build ./Kustomize/qa/ | kubectl apply -f -\nservice/nginx-svc unchanged\ndeployment.apps/my-app configured\n\n$ kubectl get all\nNAME                          READY   STATUS    RESTARTS   AGE\npod/my-app-64778f875b-7gsg4   1/1     Running   0          3m26s\npod/my-app-64778f875b-zlvfm   1/1     Running   0          27s\n\nNAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE\nservice/nginx-svc    NodePort    10.96.114.118   <none>        80:31880/TCP   3m26s\n\nNAME                     READY   UP-TO-DATE   AVAILABLE   AGE\ndeployment.apps/my-app   2/2     2            2           3m26s\n\nNAME                                DESIRED   CURRENT   READY   AGE\nreplicaset.apps/my-app-64778f875b   2         2         2       3m26s\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 这是预期的行为,副本数量已缩减为 2。
  • \n
\n\n

建议:

\n\n
    \n
  • 我注意到您在部署后添加了部署问题(through kubectl get deploy <name> -o yaml),但问题可能出在原始文件中,并且在应用时它发生了一些变化。
  • \n
  • 尝试使用我提供的示例文件重现它,看看是否得到相同的输出。
  • \n
\n\n

让我知道你的结果!

\n