标签: kubernetes-operator

Kubernetes Operator(Operator SDK、Kubebuilder 与 Kubernetes 客户端库)

如果这个问题已经得到解答,我很抱歉,但在尝试了多种不同的谷歌搜索方式后,我未能得到明确的解释,所以我试图在这里寻求澄清。

我熟悉 Kubernetes 上下文中的操作员/控制器模式,并且正在尝试构建一个自定义 NodeJS 控制器,该控制器使用Kubernetes.io中的 NodeJS Kubernetes 客户端库之一来处理我自己的自定义资源 (CRD) 。

在网上研究时,我遇到了 OperatorSDK 和 Kubebuilder,它们似乎是可以引导操作员/控制器的工具,提供与 K8s Api 服务器接口的许多功能,就像 Kubernetes 客户端库一样。

OperatorSDK 和 Kubebuilder 似乎不仅仅是库所以这是我的问题

  1. OperatorSDK、KubebuilderKubernetes.ioKubernetes 客户端库之间有什么区别
  2. Kubernetes 客户端库是否实现了 OperatorSDK 和 Kubebuilder 之类的东西?
  3. 我是否需要使用 OperatorSDK 或 Kubebuilder 来实现我自己的控制器,因为据我所知,Kubernetes 客户端库似乎就足够了。

kubernetes kubernetes-operator operator-sdk

9
推荐指数
1
解决办法
1778
查看次数

如何为任意对象触发 Kubernetes 控制器协调器?

概述

我正在为 VerticalScaler CRD 编写一个 Kubernetes 控制器,它可以垂直扩展集群中的 Deployment。我的规范引用了集群中现有的 Deployment 对象。如果引用的部署被修改或删除,我想将 VerticalScaler 的协调请求排入队列。

// VerticalScalerSpec defines the desired state of VerticalScaler.
type VerticalScalerSpec struct {
    // Name of the Deployment object which will be auto-scaled.
    DeploymentName string `json:"deploymentName"`
}
Run Code Online (Sandbox Code Playgroud)

问题

当资源不属于控制器并且该资源不持有对其资源由控制器管理的对象的引用时,是否有一种好方法来监视该资源?

我发现了什么

我认为这应该在控制器的 Kubebuilder 标准SetupWithManager函数中进行配置,尽管手表可能可以在其他地方设置。

// SetupWithManager sets up the controller with the Manager.
func (r *VerticalScalerReconciler) SetupWithManager(mgr ctrl.Manager) error {
    return ctrl.NewControllerManagedBy(mgr).
        For(&v1beta1.VerticalScaler{}).
        Complete(r)
}
Run Code Online (Sandbox Code Playgroud)

我一直在controller-runtime/pkg/builder和 Kubebuilder 文档中寻找一种好的方法。我发现的最接近的例子是关于手表的 kubebuilder-v1 文档中的“观看任意资源”部分:

控制器可以监视任意资源并将它们映射到控制器管理的资源的键。控制器甚至可以将一个事件映射到多个键,从而触发每个键的协调。

示例:为了响应集群扩展事件(例如节点的删除或添加),控制器将监视节点并将监视事件映射到控制器管理的对象的键。

我的挑战是如何将部署映射到依赖的 VerticalScaler,因为部署上不存在此信息。我可以在 VerticalScaler …

kubernetes kubebuilder kubernetes-operator

9
推荐指数
2
解决办法
1万
查看次数

Elasticsearch 7.2.0:尚未发现或选举主节点,选举至少需要 X 个节点

我正在尝试自动化 kubernetes 集群中弹性搜索节点的水平扩展和缩减过程。

最初,我在 Kubernetes 集群上部署了一个 elasticsearch 集群(3 个主节点、3 个数据和 3 个摄取节点)。哪里,cluster.initial_master_nodes是:

cluster.initial_master_nodes:
  - master-a
  - master-b
  - master-c
Run Code Online (Sandbox Code Playgroud)

然后,我进行了缩减操作,将主节点 3 的数量减少到 1 个(意外,但出于测试目的)。虽然这样做,我删除master-cmaster-b节点和重新启动master-a的节点具有以下设置:

cluster.initial_master_nodes:
  - master-a
Run Code Online (Sandbox Code Playgroud)

由于elasticsearch节点(即pods)使用persistant volume,重启节点后,会master-a出现如下日志:

"message": "master not discovered or elected yet, an election requires at least 2 nodes with ids from [TxdOAdryQ8GAeirXQHQL-g, VmtilfRIT6KDVv1R6MHGlw, KAJclUD2SM6rt9PxCGACSA], have discovered [] which is not a quorum; discovery will continue using [] from hosts providers and [{master-a}{VmtilfRIT6KDVv1R6MHGlw}{g29haPBLRha89dZJmclkrg}{10.244.0.95}{10.244.0.95:9300}{ml.machine_memory=12447109120, xpack.installed=true, ml.max_open_jobs=20}] from …
Run Code Online (Sandbox Code Playgroud)

elasticsearch kubernetes kubernetes-operator

8
推荐指数
2
解决办法
9276
查看次数

如何在 GCP Cloud Composer 上的 Apache Airflow 上使用带有“KubernetesPodOperator”的连接钩子作为环境变量

我想使用保存在airflow使用 KubernetesPodOperator.

在开发映像时,我使用环境变量将数据库连接信息传递给容器,但生产环境将数据库保存为连接挂钩。

提取数据库连接信息并将其传递给容器的最佳方法是什么?

env_vars = {'database_usr': 'xxx', 'database_pas': 'xxx'}
Run Code Online (Sandbox Code Playgroud)
KubernetesPodOperator(
        dag=dag,
        task_id="example-task",
        name="example-task",
        namespace="default",
        image="eu.gcr.io/repo/image:tag",
        image_pull_policy="Always",
        arguments=["-v", "image-command", "image-arg"],
        env_vars=env_vars,
    )
Run Code Online (Sandbox Code Playgroud)

kubernetes airflow google-cloud-composer kubernetes-operator

7
推荐指数
1
解决办法
1113
查看次数

有没有办法强制删除 webhook 失败的 crd?

在这种情况下,kubedb操作符已经崩溃并且没有响应——但是我需要清理这些资源。

 k delete redis r1 redis-queue --namespace cts --force --grace-period=0
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
Error from server (InternalError): Internal error occurred: failed calling webhook "redis.validators.kubedb.com": the server is currently unable to handle the request
Error from server (InternalError): Internal error occurred: failed calling webhook "redis.validators.kubedb.com": the server is currently unable to handle the request

Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-operator kubedb

5
推荐指数
1
解决办法
3055
查看次数

两个K8S控制器同时修改同一个资源可以吗?

我有一些 CRD,每个 CRD 都应该Container.Spec在整个集群中进行 edit 。如 ENV、标签等...

如果资源由多个控制器管理,可以吗?

这种方法可能存在哪些缺陷?

kubernetes kubernetes-custom-resources kubernetes-operator operator-sdk

5
推荐指数
1
解决办法
1208
查看次数

Kubernetes 操作员:通知者与协调循环

我最近开始构建Kubernetes Operator。我正在使用Fabric8 Java Kubernetes 客户端,但我认为我的问题更普遍,也适用于其他编程语言和库。

当阅读解释运算符模式的博客文章、文档或教科书时,我发现设计运算符似乎有两种选择:

  1. 使用无限协调循环,从 API 检索所有相应的 Kubernetes 对象,然后执行某些操作。
  2. 使用informers,每当观察到的 Kubernetes 资源发生变化时就会调用 informers 。

但是,我没有找到任何源讨论在哪种情况下应该使用哪个选项。有没有最佳实践?

fabric8 kubernetes kubernetes-custom-resources kubernetes-operator

5
推荐指数
1
解决办法
1755
查看次数

强制 Kubernetes 自定义资源规范字段的不变性

我正在使用 Kubernetes golang operator sdk 来实现一个管理 RabbitMQ 队列的 operator。我想知道 k8s 是否有办法在我的自定义资源上强制执行特定规范字段的不变性。我有以下 golang 结构,它代表一个 rabbitMQ 队列和一些参数,让它绑定到一个 rabbitMQ 交换:

type RmqQueueSpec struct {
    VHost string `json:"vhost,required"`
    Exchange string `json:"exchange,required"`
    RoutingKey string `json:"routingKey"`
    SecretConfig map[string]string `json:"secretConfig"`
}
Run Code Online (Sandbox Code Playgroud)

我之所以想要不变性,特别是对于该VHost领域,是因为它是一个参数,用于在 rabbitMQ 中为队列命名。如果为现有的已部署队列更改了它,k8s 协调器将无法为预期队列查询 rabbitMQ,因为它将使用不同的 vhost(实际上是不同的命名空间)进行查询,这可能会导致创建新队列或更新错误的队列。

我正在考虑一些替代方案,例如使用必需的 ObjectMeta.Name 字段来包含连接的虚拟主机和队列名称,以确保它们对于已部署的队列是不可变的。或者以某种方式在操作员中缓存旧规范(还没有弄清楚如何做到这一点)并在协调器中比较旧规范和当前规范,如果VHost发生变化则返回错误。然而,这两种方法似乎都不理想。理想情况下,如果操作符框架可以在VHost现场强制执行不变性,那将是一种简单的处理方法。

rabbitmq kubernetes kubernetes-operator

3
推荐指数
2
解决办法
842
查看次数

Kubernetes CRD 中状态的最大大小?

Kubernetes 中的 Kubernetes 规范大小和状态大小是否有限制?

我有一个用例,其中运算符规范是正则表达式,并且正则表达式扩展为许多我必须存储其状态的实际项目。

例子:

type RedshiftSinkSpec struct {
    TopicRegexes string `json:"topicRegexes"`
}

type Topic string

type RedshiftSinkStatus struct {
    // +optional
    CurrentMaskStatus map[Topic]MaskStatus `json:"currentMaskStatus,omitempty"`

    // +optional
    DesiredMaskStatus map[Topic]MaskStatus `json:"desiredMaskStatus,omitempty"`
}
Run Code Online (Sandbox Code Playgroud)

由于主题数量是根据正则表达式计算的。我不知道对于其他人来说数据结构可以增长到多大。所以希望在某种程度上限制它。因此需要有关 Kubernetes 允许的最大限制的帮助。

此外,有必要这样做以节省 Redshift 连接数。无法真正将问题分解为一个主题的多个crd。

请建议。

design-patterns kubernetes kubernetes-custom-resources kubernetes-operator

3
推荐指数
1
解决办法
2891
查看次数

使用 Kubebuilder 生成控制器 Gen

我正在尝试在 Kubebuilder 中构建我的自定义资源项目,但每当我构建它时,我似乎都缺少我的控制器生成。我不断收到错误:

/Users/*****/Kubernetes/postgres-writer-operator/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
bash: /Users/****/Kubernetes/postgres-writer-operator/bin/controller-gen: No such file or directory
make: *** [generate] Error 127
Error: failed to create API: unable to run post-scaffold tasks of "base.go.kubebuilder.io/v3": exit status 2
Usage:
  kubebuilder create api [flags]
Run Code Online (Sandbox Code Playgroud)

我是 Kubernetes 新手,正在遵循以下教程: https://yash-kukreja-98.medium.com/develop-on-kubernetes-series-operator-dev-understanding-and-dissecting-kubebuilder-4321d3ecd7d6

首先,我运行以下命令来引导我的项目:

kubebuilder init \
--domain yash.com \
--repo github.com/yashvardhan-kukreja/postgres-writer-operator \
--project-name postgres-writer-operator \
--license apache2 \
--skip-go-version-check
Run Code Online (Sandbox Code Playgroud)

运行命令后,我进入目录并找到以下文件和文件夹: 在此输入图像描述

然后下一步是为我的自定义资源 PostgresWriter 运行引导程序并将其附加到运算符。

kubebuilder create api \
--group demo \
--version v1 \
--kind PostgresWriter \
--resource true \
--controller …
Run Code Online (Sandbox Code Playgroud)

containers kubernetes kubebuilder kubernetes-operator

1
推荐指数
1
解决办法
5818
查看次数