问题标签 [kubernetes-custom-resources]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
494 浏览

kubernetes - Kubernetes 自定义资源定义用例

通过阅读 hello world 类型的示例,我对 CRD 有了一些了解。我认为我的用例不需要 CRD。您能列出 CRD 解决的业务用例吗?

更新:通过业务用例,我指的是使用 CRD 实现的组织中的需求。

示例:部署在“prod”命名空间中的每个应用程序的最小 pod 副本数应为 2。定义一个 CRD 来存储最小副本数并在准入控制器中使用该 CRD(实例)来执行要求?我不确定这种方法是否有效。我想知道这样的要求。

0 投票
1 回答
108 浏览

kubernetes - 如何与同一 k8s 集群中的 pod 内的 Kubernetes CRD 服务通信?

我在我的 K8s 集群中安装了一个 Spark on K8s 算子,并且我在 k8s 集群中运行了一个应用程序。我想让这个应用程序与 sparkapplication CRD 服务通信。我可以知道我应该使用什么端点吗?(或者 K8s 集群中的 K8s 端点是什么)

0 投票
1 回答
428 浏览

kubernetes - 此编解码器不允许编码:*versioning.codec

我使用此框架https://github.com/operator-framework/operator-sdk创建了一个 kubernetes 运算符,其中定义了一个小的自定义资源定义并生成了一个客户端集。

我为此自定义资源创建了一个客户端:

因此,我只是使用 kubernetes 为 pod 提供的配置并创建了一个默认的 k8s REST 客户端集,并在我的自定义资源的客户端集中使用它(这甚至是一个好习惯吗?)。

但是,当我尝试使用我的自定义资源客户端并尝试创建自定义资源的实例时,客户端会出错encoding is not allowed for this codec: *versioning.codec(我猜它来自这里https://github.com/kubernetes/apimachinery/blob/master/pkg/runtime /codec.go#L104)。

这到底是什么意思?我认为生成的客户端知道自定义资源?

感谢帮助...

0 投票
2 回答
160 浏览

kubernetes - Kubernetes:使用 CustomResourceDefinition + 运算符创建数据库访问机密

我计划在 k8s 上创建一个特殊的“部署者”部署(每个集群一个“部署者”)。它的作用是从一个中心位置提取规范,创建 k8s 清单并应用它们。最终结果应该是多个部署,每个部署都在它自己的命名空间中,带有服务和入口,以及包含数据库凭据的秘密。

我不想直接传输和管理数据库详细信息。相反,我正在考虑创建一个 CustomResourceDefinition 'dbservice',其中包含一个 DB 服务名称。然后配置一个 k8s 操作符,它将:

  1. 获取(监控)这样的“dbservice”资源。
  2. 如果此类服务已经存在,请与数据库托管服务联系。如果不是,它将使用自定义资源中的一些规范创建它。
  3. 获取主机名、密码、用户、数据库名称和端口,并将它们存储在部署 (envvar) 将使用的密钥中。

那样:

  1. 每个部署都会等待它的数据库密码,并且在密码存在之前不会启动,这意味着数据库已准备好。
  2. 我不必手动管理数据库服务。
  3. 我不必通过电线传输密码。

为此需要发生什么(根据我的计划):

  1. 操作员需要有权限与数据库托管提供商交谈(可能会使用 API 密钥访问另一个 k8s 存储的秘密)。
  2. 操作员需要具有在所有命名空间中创建机密的权限。

由于我对 k8s 和 devops 还很陌生,所以我想验证这种方法是否合理而不是反模式。

0 投票
1 回答
227 浏览

kubernetes - Kubernetes:自定义资源的 RBAC 授权失败

我创建了一个自定义资源定义以及一个操作员来控制该资源,但操作员在运行时收到“禁止”错误。

自定义资源定义yamlrole.yamlrole_bidning.yaml是:

  • 请注意,我试图通过复数名称、名称与组以及种类来引用自定义资源。

从角色定义中可以看出,其他资源的权限似乎有效。

然而,操作员总是出错:

知道可能是什么原因造成的吗?

0 投票
2 回答
444 浏览

kubernetes - 即使命名空间被删除,CRD 也不会被删除

我在某些命名空间中有附加的 CRD。我的问题是 CRD 仍然存在,即使它所在的命名空间被删除了!

请注意,CRD 上没有细化器:

有没有人遇到过这个问题?任何帮助都感激不尽。

0 投票
1 回答
1328 浏览

kubernetes - 删除命名空间挂起自定义资源终结器

我已经定义了一个控制器(操作员)来处理我的 K8S 命名空间中的一些自定义资源。每个自定义资源都有一个终结器,因此控制器可以在删除它之前对其进行处理:

例如

这很好用,直到我删除命名空间(“kubectl delete ns”)。如果 k8s 垃圾首先收集控制器 pod - “mycustomResourceInstance” 仍然停留在删除状态,并阻止成功删除命名空间。

解决方法是编辑 mycustomResourceInstance 并删除终结器。

有没有办法确保控制器不会被删除,而自定义资源的任何实例都存在于命名空间中?

0 投票
2 回答
6215 浏览

kubernetes - 如何 kubectl 等待 crd 创建?

kubectl在运行脚本之前,仅使用命令行检查自定义资源定义是否存在的最佳方法是什么?

我们有一个 yaml 文件,其中包含 NATS 集群ServiceAccountRole和. 中使用的图像创建,第二个脚本使用它来部署一组. 目前,我们的 CI 管道需要运行几次第二个脚本,只有在完全创建后才能成功完成。我尝试使用但无法弄清楚使用什么条件来完成 a 。ClusterRoleBindingDeploymentDeploymentcrdcrdpodscrdkubectl waitcrd

下面是我最近的尝试,尽管完全错误,但这说明了我们想要的一般顺序。

kubectl wait --for=condition=complete kubectl apply -f 1.nats-cluster-operator.yaml kubectl apply -f 2.nats-cluster.yaml

0 投票
1 回答
8126 浏览

kubernetes - 将 JSON 补丁应用到 Kubernetes 自定义资源时出错

我有一个 Kubernetes自定义资源实例,我想使用 JSON 补丁通过 Kubernetes API 对其进行修补。

这是我的补丁请求:

我相当确定我的请求正文是有效的JSON 补丁,并且我之前已经使用类似的 API 调用成功更新了核心(非 CRD)API 资源。CRD 有一个openAPIV3Schema明确允许.status.foo存在和类型的定义string

上面的请求被 Kubernetes API 服务器拒绝,响应如下:

根据CRD 文档,CRD 应该支持带有内容类型PATCH的请求。application/json-patch+json但是由于某种原因,请求似乎是无效的,而 Kubernetes 没有费心告诉我为什么。API 服务器 pod 在其日志流中也没有任何相关消息。

kubectl patch在命令行上使用时也会出现同样的错误:

发生此错误的可能原因是什么?我有哪些选项可以进一步调试?

0 投票
1 回答
271 浏览

kubernetes - 为什么 client.Update(...) 会忽略非原始值?

我正在尝试将非拥有对象的规范修改为Reconcile我的自定义资源的一部分,但它似乎忽略了任何不是原语的字段。我正在使用控制器运行时。

我想既然它只适用于原语,也许这是与 DeepCopy 相关的问题。但是,删除它并没有解决问题,我读到对象上的任何更新都必须在深层副本上,以避免弄乱缓存。

我也尝试了设置client.FieldOwner(...),因为它说这是在服务器端完成的更新所必需的。我不确定将它设置为什么,所以我做到了req.NamespacedName.String()。那也没有用。

这是我的控制器的协调循环:

我的 CRD 的规范如下所示:

我希望当我kubectl apply对 Port 和 CustomEnv 字段进行更改的新 CR 时,它会修改部署,如Reconcile. 但是,只有端口被更新,而对容器的更改Env被忽略。