go - 创建/获取自定义 kubernetes 资源

标签 go kubernetes

我想用 go 创建一个自定义的 kubernetes 资源。该应用程序部署在 Kubernetes 集群中。我想创建例如以下资源:

    apiVersion: configuration.konghq.com/v1
    kind: KongPlugin
    metadata:
      name: add-response-header
    config:
      add:
        headers:
        - "demo: injected-by-kong"
    plugin: response-transformer
到目前为止,我总是创建“标准”资源,例如具有以下代码的 secret :
     CreateSecret(name string, data map[string]string) error {
 confs, err := rest.InClusterConfig()
        if err != nil {
            panic(err)
        }
        clientset, err = kubernetes.NewForConfig(confs)
        i := clientset.CoreV1()
        if _, err := i.Secrets(namespace).Create(&v1.Secret{
            TypeMeta:   metav1.TypeMeta{
                Kind:       "Secret",
                APIVersion: "v1",
            },
            ObjectMeta: metav1.ObjectMeta{
                Name:   name,
            },
            StringData: data,
            Type:       "Opaque",
        }); err != nil {
            return err
        }
}
此外,我尝试使用以下代码获取资源:
b, err := clientset.RESTClient().Get().Namespace(namespace).Resource("KongPlugin").DoRaw()
我得到以下错误:
the server could not find the requested resource (get KongPlugin)
如果我在命令行发出请求 k get KongPlugin我可以看到所有资源。
NAME                PLUGIN-TYPE           AGE
add-proxy-headers   request-transformer   3h34m
那么如何查看自定义资源呢?

最佳答案

对于 RESTClient 👇🏼

Get:


您必须完全指定自定义资源的路径。
使用fluent界面
data, err := clientset.RESTClient().
        Get().
        AbsPath("/apis/<api>/<version>").
        Namespace("<namespace>").
        Resource("kongplugins").
        Name("kongplugin-sample").
        DoRaw(context.TODO())
或手动指定
data, err := clientset.RESTClient().
        Get().
        AbsPath("/apis/<api>/<version>/namespaces/<namespace>/kongplugins/kongplugin-sample").
        DoRaw(context.TODO())
您可以找到AbsPathselfLink自定义资源。

Create:


例如,您可以 post编码(marshal)数据使用 AbsPath
kongPlugin := &KongPlugin{
        TypeMeta: metav1.TypeMeta{
            APIVersion: "<api>/<version>",
            Kind:       "KongPlugin",
        },
        ObjectMeta: metav1.ObjectMeta{
            Name:      "kongplugin-sample",
            Namespace: "<namespace>",
        },
        ...}}

body, err := json.Marshal(kongPlugin)

data, err := clientset.RESTClient().
        Post().
        AbsPath("/apis/<api>/<version>/namespaces/<namespace>/kongplugins").
        Body(body).
        DoRaw(context.TODO())
因为arg方法Body(obj interface{})是一个空接口(interface),您可以根据文档使用不同类型的参数:
k8s.io/client-go/rest - func (*Request) Body

关于go - 创建/获取自定义 kubernetes 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63408493/

相关文章:

kubernetes - 如何设置 kubernetes RBAC 资源以便 pod 可以通过客户端访问 API?

docker - 在 Kubernetes 设置期间保持我的服务器 O/S 的静态 IP 地址

kubernetes - 在 Kubernetes 集群中运行 Nodebb

docker - Kubectl 随机返回 "TLS handshake timeout"(在 localhost K8s 上运行)

go - 在 Go 中对字符串进行分区

html - 按程序生成分页

arrays - 从 golang 中的 redash 解码 json 原始数据

bash - 如何执行到K8s pods 中,但从外部使用bash_profile?

html - 如何将文件从 html 选择器发送到 golang apis?

curl - 将curl转换为GOlang代码