几个月前我们创建了一个控制器,它使用 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 我使用 helm SDK并且它工作得很好,对于我使用有效的假选项(对于 kubeconfig)的测试,
现在,当我更新kubeconfig到我的集群时,我注意到在安装过程中图表停留在状态挂起,并且它永远停留在这个状态直到我删除并再次安装它,(手动)我的问题是如何解决这个问题所述
头盔SDK(通过代码只)https://pkg.go.dev/helm.sh/helm/v3,
我的意思是稍等片刻,如果状态在 3 分钟后挂起,请删除并重新安装...或在此之前尝试升级
这是代码
kubeConfigPath, err := findKubeConfig()
if err != nil {
fmt.Println()
}
actionConfig := &action.Configuration{
}
cfg := cli.New()
clientGetter := genericclioptions.NewConfigFlags(false)
clientGetter.KubeConfig = &kubeConfigPath
actionConfig.Init(clientGetter, "def", "memory", log.Printf)
if err != nil {
fmt.Println(err)
}
chart, err := installation.InstallChart(cfg, "test", "chart1", "./charts/dns", nil, actionConfig)
if err != nil {
fmt.Println(err)
}
fmt.Println(chart)
}
func findKubeConfig() (string, error) { …Run Code Online (Sandbox Code Playgroud) 我需要从值中获取名称base64,我尝试了以下操作,但无法解析它并获取名称属性,知道我该怎么做吗?
extern crate base64;
use serde_json::Value;
fn main() {
let v = "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ";
let bytes = base64::decode(v).unwrap();
println!("{:?}", bytes);
let v: Value = serde_json::from_slice(bytes);
}
Run Code Online (Sandbox Code Playgroud)
该值代表 json,例如
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Run Code Online (Sandbox Code Playgroud)
最后我需要打印"name": "John Doe"
这是解码后的值
我需要为 yaml 文件做一些棘手的事情,这就是它之前的样子
前
apiVersion: v1
items:
- apiVersion: core.k8s.com/v1alpha1
kind: Test
metadata:
creationTimestamp: '2022-02-097T19:511:11Z'
finalizers:
- cuv.ssf.com
generation: 1
name: bar
namespace: foo
resourceVersion: '12236'
uid: 0117657e8
spec:
certificateIssuer:
acme:
email: myemail
provider:
credentials: dst
type: foo
domain: vst
type: bar
status:
conditions:
- lastTransitionTime: '2022-02-09T19:50:12Z'
message: test
observedGeneration: 1
reason: Ready
status: 'True'
type: Ready
lastOperation:
description: test
state: Succeeded
type: Reconcile
Run Code Online (Sandbox Code Playgroud)
https://codebeautify.org/yaml-validator/y22fe4943
我需要删除部分下的所有字段metadata,棘手的部分是仅保留name并且namespace
除了完全删除该status部分之外,它应该如下所示
后
apiVersion: v1
items:
- apiVersion: …Run Code Online (Sandbox Code Playgroud) 我们有以下类型,它是通用资源列表,该结构有 4 个通用参数(全部与对象列表指针类型相关),但我找不到减少它的方法。
import(
...
"sigs.k8s.io/controller-runtime/pkg/client"
)
type GenResourceLister[OBJ any, OBJPTR interface {
client.Object
*OBJ
}, LIST interface {
GetItems() []OBJ
}, LISTPTR interface {
client.ObjectList
*LIST
}] struct{}
Run Code Online (Sandbox Code Playgroud)
以下函数有 2 个泛型参数,其中一个是切片参数的元素类型,但我认为另一个(其指针类型)会阻止类型推断,因此必须在每次调用时指定参数。我找不到摆脱它们的方法。
// itemsToObjectList converts a list of objects whose pointer
// type implements client.Object to a list of client.Object
func itemsToObjectList[T any, TPTR interface {
client.Object
*T
}](items []T) []client.Object {
objs := make([]client.Object, 0, len(items))
for _, resource := range items {
resource := resource …Run Code Online (Sandbox Code Playgroud) 有什么方法可以传递到kubeconfig 的&genericclioptionsk8s 客户端吗?bytearray
https://pkg.go.dev/k8s.io/cli-runtime/pkg/genericclioptions
目前, genericclioptionsits默认情况下从环境/路径到文件,但我需要将其作为bytearray参数显式传递,而不是对文件或环境的引用,有没有办法做到这一点?
我尝试了以下方法,但它不起作用:
package main
import (
"bytes"
"github.com/spf13/pflag"
"k8s.io/cli-runtime/pkg/genericclioptions"
)
func main() {
kubeconfigData := []byte("my_kubeconfig")
// create a new flag set and bind the kubeconfig flag
flags := pflag.NewFlagSet("default", pflag.ExitOnError)
kubeconfigFlag := flags.String("kubeconfig", "", "absolute path to the kubeconfig file")
flags.Parse([]string{})
// set the kubeconfig flag to the data in the byte array
*kubeconfigFlag = "-"
configOverrides := &genericclioptions.ConfigOverrides{ClusterDefaults: genericclioptions.NewClusterDefaults()}
configLoader := genericclioptions.NewConfigFlags(false).WithOverrideFlags(configOverrides)
configLoader.KubeConfig = bytes.NewBuffer(kubeconfigData)
// ... …Run Code Online (Sandbox Code Playgroud) I\xe2\x80\x99ve 一个 go 程序,需要访问配置映射,当使用以下 clusterRole 时,我们得到错误禁止
\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: s-access\n labels:\n app.kubernetes.io/instance: te-mger\nrules:\n - verbs:\n - get\n - watch\n - list\n - update\n apiGroups:\n - dpt.com\n resources:\n - pods\nRun Code Online (Sandbox Code Playgroud)\n现在,当我将其更改为以下内容时,它就可以工作了(添加 apiGroups \'\')并configmaps添加到resources\n由于这是一种解决方法,我们应该为长期解决方案做什么
kind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: s-access\n labels:\n app.kubernetes.io/instance: te-mger\nrules:\n - verbs:\n - get\n - watch\n - list\n - update\n apiGroups:\n - dpt.com\n - \'\'\n resources:\n - pods\n - configmaps\nRun Code Online (Sandbox Code Playgroud)\n我阅读了以下内容,但没有帮助https://kubernetes.io/docs/reference/access-authn-authz/rbac/
\n我想避免使用apiGroups: \'\'
\n我想在特定的 ns 内有一个 cron 作业,它将能够删除所有命名空间 pod,我尝试如下
\napiVersion: batch/v1\nkind: CronJob\nmetadata:\n name: restart\n namespace: foo\nspec:\n concurrencyPolicy: Forbid\n schedule: "*/1 * * * *"\n jobTemplate:\n spec:\n backoffLimit: 2\n activeDeadlineSeconds: 600\n template:\n spec:\n restartPolicy: Never\n containers:\n - name: kubectl\n image: bitnami/kubectl:1.22.3\n command:\n - 'kubectl'\n - 'delete'\n - '--all'\n - 'pods'\n - '--namespace=foo'\nRun Code Online (Sandbox Code Playgroud)\n我收到一个错误,知道如何解决它吗?\n这是一个 deamonset 的 Pod(位于 ns foo 中),我想从这个命名空间中删除它foo,知道吗?
这是错误:
\n\n\n`来自服务器的错误(禁止):pod 被禁止:用户\n"system:serviceaccount:foo:default" 无法在命名空间 "foo \xe2\x94\x82\xe2\ 中的 API\ngroup "" 中列出资源 "pods" x94\x82 流已关闭 EOF for\nfoo/restart-27415740--1-495xg (kubectl)
\n
我有以下 cronjob,它删除特定命名空间中的 pod。
我按原样运行作业,但似乎作业不会每 20 分钟运行一次,而是每隔几(2-3)分钟运行一次,我需要的是,作业每 20 分钟就会开始删除 pod指定的命名空间然后终止,知道这里可能出了什么问题吗?
apiVersion: batch/v1
kind: CronJob
metadata:
name: restart
spec:
schedule: "*/20 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
jobTemplate:
spec:
backoffLimit: 0
template:
spec:
serviceAccountName: sa
restartPolicy: Never
containers:
- name: kubectl
image: bitnami/kubectl:1.22.3
command:
- /bin/sh
- -c
- kubectl get pods -o name | while read -r POD; do kubectl delete "$POD"; sleep 30; done
Run Code Online (Sandbox Code Playgroud)
我真的不知道为什么会发生这种情况......
也许删除 pod 会崩溃
更新
我尝试了以下操作,但没有删除任何 Pod,知道吗?
apiVersion: batch/v1
kind: CronJob
metadata: …Run Code Online (Sandbox Code Playgroud) kubernetes ×6
go ×4
azure ×2
azure-aks ×1
bash ×1
byte ×1
cron ×1
generics ×1
json ×1
kubebuilder ×1
polymorphism ×1
rust ×1
shell ×1
yaml ×1
yq ×1