我正在为 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 …
我刚刚开始使用 kubebuilder 和 Golang 使用自定义资源扩展我们的 Kubernetes 集群。我很想根据实际调用它的事件在协调器功能中做不同的事情。
资源创建了吗?更新了吗?被删了吗?
这些事件中的每一个都会触发控制器,但是,我似乎无法找到查看哪些事件实际发生的可能性。我可以通过编写这样的协调器来解决这个问题:
func (r *ServiceDescriptorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
service := &batchv1.ServiceDescriptor{}
if err := r.Get(context.TODO(), req.NamespacedName, service); err != nil && errors.IsNotFound(err) {
fmt.Println("Resource was not found -> must have been deleted")
else {
fmt.Println("No errors found -> Resource must have been created or updated")
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这感觉奇怪地含蓄而且有点老套。
是否有一种干净的(可能是本机的)方法来获取协调器调用的事件类型?
我正在尝试创建一个验证网络钩子
kubebuilder create webhook batch \
--version v1 \
--kind Webhook \
--defaulting \
--programmatic-validation
Run Code Online (Sandbox Code Playgroud)
但它总是给我一个错误。
failed to create webhook: unable to inject the resource to.
"base.go.kubebuilder.io/v3": kubebuilder create webhook requires.
a previously created API
Run Code Online (Sandbox Code Playgroud)
我不确定在 kubebuilder 命令中添加额外的内容。任何帮助表示赞赏。
几个月前我们创建了一个控制器,它使用 kubebuilder 运行得很好。
\n几周前,我们将 \xe2\x80\x9clistener\xe2\x80\x9d 添加到秘密中,当秘密更改时(秘密属性)\n应该调用协调,问题是它有时有效,有时无效, (您更改秘密应用它并且协调不会发生\xe2\x80\x99t),我们正在为完全相同的秘密文件执行此操作。
\n我们尝试了几天来找到根本原因,但没有成功,(我们将k8s.io/client-go v0.23.4和 更改为v0.22.3,现在 v0.22.1这才起作用。\n知道问题可能是什么吗?任何提示都会有帮助。或者我们有任何其他方法可以做到这一点可以尝试一下。
func (r *vtsReconciler) SetupWithManager(mgr ctrl.Manager) error {\n manager := ctrl.NewControllerManagedBy(mgr).\n For(&vts.str).\n WithEventFilter(predicate.Or(predicate.AnnotationChangedPredicate{}))\n manager = manager.Watches(&source.Kind{Type: &v1.Secret{}}, handler.EnqueueRequestsFromMapFunc(func(a client.Object) []reconcile.Request {\n return r.SecretRequests.SecretFinder(a.GetName())\n }))\n return manager.Complete(r)\n}\n\n\n\nfunc (secm *SecretMapper) SecretFinder(name string) []reconcile.Request {\n v := cli.ObjectKey{Name: name}\n return secm.SecMap[v.String()]\n}\nRun Code Online (Sandbox Code Playgroud)\n 我们有一个 k8s 运算符(基于 kubebuilder),它按预期工作,现在我们需要支持侦听集群上的机密。
以下代码正在运行,但是我收到了集群中所有秘密的事件,但效率不高,
我只想获取特定秘密的事件,让我们说特定秘密的事件labels/annotation,我们该怎么做?
func (r *InvReconciler) SetupWithManager(mgr ctrl.Manager) error {
manager := ctrl.NewControllerManagedBy(mgr).
For(&corev1alpha1.Inv{}, builder.WithPredicates(predicate.Or(predicate.GenerationChangedPredicate{}, predicate.AnnotationChangedPredicate{}))).
WithOptions(controller.Options{
})
manager = manager.Watches(&source.Kind{Type: &v1.Secret{}}, handler.EnqueueRequestsFromMapFunc(func(a client.Object) []reconcile.Request {
return r.secretHandler.GetSecret(a.GetNamespace(), a.GetName())
}))
return manager.Complete(r)
}
Run Code Online (Sandbox Code Playgroud)
这是函数
func (secretReq secretHandler) GetSecret(namespace string, name string) []reconcile.Request {
fmt.Println("secret is: ", namespace, "--", name)
return nil
}
Run Code Online (Sandbox Code Playgroud)
让我们说像下面这样的秘密,并且仅对于这个秘密(带标签foo: bar)我会在创建或修改它时收到事件
apiVersion: v1
kind: Secret
metadata:
labels:
foo: bar
name: mysecret
namespace: dev
type: Opaque
data: …Run Code Online (Sandbox Code Playgroud) 我正在关注 KubeBuilder 书中的 CronJob 示例:https ://book.kubebuilder.io/cronjob-tutorial/cronjob-tutorial.html
我直接使用https://github.com/kubernetes-sigs/kubebuilder/tree/master/docs/book/src/cronjob-tutorial/testdata/project 中的代码
运行后make run,显示如下日志:
INFO controller-runtime.metrics metrics server is starting to listen {"addr": ":8080"}
INFO controller-runtime.builder Registering a mutating webhook {"GVK": "batch.tutorial.kubebuilder.io/v1, Kind=CronJob", "path": "/ilder-io-v1-cronjob"}
INFO controller-runtime.webhook registering webhook {"path": "/mutate-batch-tutorial-kubebuilder-io-v1-cronjob"}
INFO controller-runtime.builder Registering a validating webhook {"GVK": "batch.tutorial.kubebuilder.io/v1, Kind=CronJob", "path": "/builder-io-v1-cronjob"}
INFO controller-runtime.webhook registering webhook {"path": "/validate-batch-tutorial-kubebuilder-io-v1-cronjob"}
INFO setup starting manager
INFO controller-runtime.manager starting metrics server {"path": "/metrics"}
INFO controller-runtime.webhook.webhooks starting webhook server
INFO controller-runtime.controller Starting EventSource {"controller": …Run Code Online (Sandbox Code Playgroud) 从这段 Go 代码中,我生成了 CRD yaml。我在 Go 中使用以下结构。我想从枚举选项之一为参数“Size”和“Case”分配默认值。分配 // +kubebuilder:validation:default:=512 在生成的 yaml 文件中不会生效。在 kubebuilder 中有什么方法可以为枚举分配默认值吗?
type Options struct {
// +kubebuilder:validation:default:=512
// +kubebuilder:validation:Enum=64;128;256;512
Size int64 `json:"Size"`
// +kubebuilder:validation:Enum=caseA;caseB
// +kubebuilder:validation:default:=caseA
Case string `json:"case"`
}
Generated yaml without default value
---------------
case:
enum:
- caseA
- caseB
type: string
Size:
enum:
- 64
- 128
- 256
-512
format: int64
type: integer
Run Code Online (Sandbox Code Playgroud) 我们有一个 kubebuilder 控制器,它按预期工作,现在我们需要创建一个 webhooks ,
我按照教程 https://book.kubebuilder.io/reference/markers/webhook.html进行 操作,现在我想在本地运行和调试它,但是不确定如何处理证书,是否有一种简单的方法来创建它,任何例子都会非常有帮助。
顺便说一句,我已经安装了cert-manager并应用了以下示例 yaml,但不知道下一步该做什么...
我需要最简单的解决方案,我能够在本地webhook运行和调试s ,就像我已经使用控制器所做的那样(在使用 webhooks 之前),
https://book.kubebuilder.io/cronjob-tutorial/running.html
证书管理器
我在集群中创建了以下内容
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: test
spec:
# Secret names are always required.
secretName: example-com-tls
# secretTemplate is optional. If set, these annotations and labels will be
# copied to the Secret named example-com-tls. These labels and annotations will
# be re-reconciled if the Certificate's secretTemplate changes. secretTemplate
# is also enforced, …Run Code Online (Sandbox Code Playgroud) 假设我有以下代码片段,它设置了一个监视外部资源“外部”的协调器:
// SetupWithManager sets up the controller with the Manager.
func (r *SomethingReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&api.Something{}).
WithOptions(controller.Options{
MaxConcurrentReconciles: stdruntime.NumCPU(),
RecoverPanic: true,
}).
Watches(
&source.Kind{Type: &somev1.External{}},
handler.EnqueueRequestsFromMapFunc(r.findInternalObjectsForExternal),
builder.WithPredicates(predicate.Funcs{
UpdateFunc: func(ue event.UpdateEvent) bool { return true },
DeleteFunc: func(de event.DeleteEvent) bool { return true },
}),
).
Complete(r)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法将somev1.External类型导入到我的项目中,因为导入包含此类型的 go 模块会破坏我当前项目的依赖关系。
kubebuilder 中有没有一种方法可以监视外部资源,而无需显式导入其类型?比如GVK之类的?
在 Kubernetes 中,是否可以使用 CRD 的“additionalPrinterColumns”字段以分数格式(即 X/Y)显示列?
更准确地说,我想kubectl使用与下面的 READY 字段相同的格式显示 CR 字段的描述:
kubectl get statefulsets.apps <my-statefulset>
NAME READY AGE
<my-statefulset> 2/2 18m
Run Code Online (Sandbox Code Playgroud)
您能否提供“additionalPrinterColumns”部分的内容?
kubernetes kubernetes-custom-resources kubebuilder operator-sdk
我的问题是我正在尝试使用该unstructured.Unstructured类型来创建部署,如下所示:
// +kubebuilder:rbac:groups=stable.resource.operator.io,resources=resource,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=stable.resource.operator.io,resources=resource/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=apps,resources=deployments/status,verbs=get;list;watch;create;update;patch;delete
func (r *ResourceReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
ctx := context.Background()
log := r.Log.WithValues("resource", req.NamespacedName)
instance := &stablev1.Resource{}
// your logic here
if err := r.Get(ctx, req.NamespacedName, instance); err != nil {
log.Error(err, "unable to fetch Resource")
// we'll ignore not-found errors, since they can't be fixed by an immediate
// requeue (we'll need to wait for a new notification), and we can get them
// on deleted requests. …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 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) kubebuilder ×12
kubernetes ×11
go ×8
kubernetes-custom-resources ×2
azure ×1
certificate ×1
containers ×1
operator-sdk ×1
webhooks ×1