Kustomize和Kubectl无法找到CRD

7

我正在使用kustomize将一个清单传输到一个新的k8s集群(v1.17.2)上,在其中包括CRDs,但其他对象无法找到它们。例如:

unable to recognize "STDIN": no matches for kind "Certificate" in version "cert-manager.io/v1alpha2"
unable to recognize "STDIN": no matches for kind "IngressRoute" in version "traefik.containo.us/v1alpha1"

CRD定义在我的kubectl的resources部分中,在我将其管道传输到kubectl的输出中显示。我确定上次采用把所有内容都放在同一个文件中的方法是行得通的。

如果我先应用CRD,然后再单独应用主清单,那么一切都可以正常通过。我能否同时完成所有操作?如果可以,那么我做错了什么;如果不行,那么为什么以前可以行得通?

有人能指出问题可能出在哪里吗?

示例CRD定义:

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingressroutetcps.traefik.containo.us
spec:
  group: traefik.containo.us
  names:
    kind: IngressRouteTCP
    plural: ingressroutetcps
    singular: ingressroutetcp
  scope: Namespaced
  version: v1alpha1
4个回答

1
Kustomize目前还没有控制对象创建顺序的方法。如果您直接将其传输到kubectl,则必须将CRD分离到它们自己的应用程序中,以便您可以应用CRD,等待它们完成,然后再应用依赖于它们的资源。或者您可以运行两次应用程序。

当使用GitOps工具时,使用kustomize通常会有一种自定义的方式来设置资源创建顺序,例如Argo-CD的sync-waves或Flux中的kustomization depends-on

1

我在处理在Kubernetes上使用Kustomize启动Traefik时遇到的问题时遇到了你的问题...我的问题是通过确保kustomization.yml文件中的命名空间准确无误来解决的。在我的情况下,我不得不将其更改为与部署中其他yml文件中的内容匹配。不确定您最终是否解决了问题,但我想回应一下,以防万一...


嘿,我进行了更多的测试,发现需要将命名空间设置为默认值才能让它对我起作用。 - Magbas

0

我遇到了同样的问题,我猜测是因为 kubetcl 在尝试在集群上安装 crd 时找不到资源,为了验证这一点,可以运行命令 kubectl api-resources,新的 crd 不会在列表中,但如果你首先 apply crd,然后 kustomize build . | kubectl apply -f - 就可以正常工作了。但我真的不知道如何首先添加这个资源。


0

我通过使用Skaffold并使用kubectl部署所有的CRDs来解决了这个问题:

deploy:
  kubectl:
    manifests: 
    - custom_resources.yaml
  kustomize:
    paths:
    - kustomize_directory

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