【问题标题】:Kustomize - "failed to find unique target for patch ..."Kustomize - “未能找到补丁的唯一目标......”
【发布时间】:2020-08-01 15:57:27
【问题描述】:

我刚开始使用 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

deployment.yaml 和 service.yaml 是用 jib 生成的文件,它们运行良好。而kustomization.yaml的内容如下:

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

resources:  
- service.yaml
- deployment.yaml  

在另一个目录中

ls -l ./kustomize/qa
133 Apr 18 21:33 kustomization.yaml
95 Apr 18 21:37 update-replicas.yaml

在哪里

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

resources:
- ../base

patchesStrategicMerge:
- update-replicas.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2

运行“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

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

这是 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: {}

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

如何解决这个问题?

【问题讨论】:

  • 它表示找不到要修补的对象my-app。请发布原始deployment.yaml,因为检查不一致至关重要。
  • @willrof 非常感谢您提供的信息。根据您的信息,我将 deployment.yaml 文件添加到我的原始帖子中。
  • 虽然下面的答案解决了这个特定问题,但failed to find unique target for patch 是一个非常弱且无用的错误消息。就我个人而言,我欢迎任何有关如何从 kustomize 获得更好的诊断信息以更有效地解决错误的见解。

标签: kubernetes


【解决方案1】:

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

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

  • 我以一个简单的 nginx 服务器为例,文件结构如下:
$ tree Kustomize/
Kustomize/
├── base
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── qa
    ├── kustomization.yaml
    └── update-replicas.yaml
2 directories, 5 files
  • 基础 Yamls:
$ cat Kustomize/base/kustomization.yaml 
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- deployment.yaml
- service.yaml
$ cat Kustomize/base/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-app
  name: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx
        ports:
        - containerPort: 80
$ cat Kustomize/base/service.yaml 
kind: Service
apiVersion: v1
metadata:
  name: nginx-svc
spec:
  selector:
    app: my-app
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  • Qa Yamls:
$ cat Kustomize/qa/kustomization.yaml 
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- ../base

patchesStrategicMerge:
- update-replicas.yaml
$ cat Kustomize/qa/update-replicas.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 2
  • 现在我将构建base 并应用:
$ kustomize build ./Kustomize/base | kubectl apply -f -
service/nginx-svc created
deployment.apps/my-app created

$ kubectl get all
NAME                          READY   STATUS    RESTARTS   AGE
pod/my-app-64778f875b-7gsg4   1/1     Running   0          52s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/nginx-svc    NodePort    10.96.114.118   <none>        80:31880/TCP   52s

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-app   1/1     1            1           52s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/my-app-64778f875b   1         1         1       52s

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

$ kustomize build ./Kustomize/qa/ | kubectl apply -f -
service/nginx-svc unchanged
deployment.apps/my-app configured

$ kubectl get all
NAME                          READY   STATUS    RESTARTS   AGE
pod/my-app-64778f875b-7gsg4   1/1     Running   0          3m26s
pod/my-app-64778f875b-zlvfm   1/1     Running   0          27s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/nginx-svc    NodePort    10.96.114.118   <none>        80:31880/TCP   3m26s

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-app   2/2     2            2           3m26s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/my-app-64778f875b   2         2         2       3m26s
  • 这是预期行为,副本数已缩放为 2。

建议:

  • 我注意到您在问题中添加了部署后的部署 (through kubectl get deploy &lt;name&gt; -o yaml),但问题可能出在原始文件中,并且在应用时有所更改。
  • 尝试使用我提供的示例文件重现它,看看是否得到相同的输出。

让我知道你的结果!

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的信息。
    • 这解决了我的问题。
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2020-05-16
    • 2020-05-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多