簡體   English   中英

kubernetes client-go 將 yaml 轉換為 go 代碼

[英]kubernetes client-go convert yaml to go code

是否有關於在 go-client 某處構建k8s 作業的文檔? 特別是我正在嘗試將工作 yaml 轉換為 go 代碼,並且在我的一生中找不到說明字段如何轉換的參考文檔

k8s.io/api is a package of Kubernetes which kubectl and other components use it to implement Kubernetes API s. 在這個 package 中,有一個實現Job API 的結構,您可以使用它將 Job manifest 轉換為 go 結構。

我認為這段代碼可以提供幫助:

package main

import (
    "fmt"
    "io/ioutil"
    "os"

    "gopkg.in/yaml.v2"
    v1 "k8s.io/api/batch/v1"
)

func main() {
    file, err := os.Open("/path/to/job.yaml")
    if err != nil {
        panic(err)
    }

    b, err := ioutil.ReadAll(file)
    if err != nil {
        panic(err)
    }

    job := &v1.Job{}
    err = yaml.Unmarshal(b, job)
    if err != nil {
        panic(err)
    }

    fmt.Println(job)
}

將 YAML 轉換為 Golang 可能很困難,並且經常缺少帶有示例的文檔。

我編寫了一個名為naml的工具,它能夠將任何 Kubernetes YAML 轉換為原始 Go。 它很方便,因為它使用您運行它的 Kubernetes 版本工作,並使用最新版本的 Kubernetes 代碼庫編譯。

如果您想創建一個作業,並查看該作業的有效 Go,它看起來像這樣。 使用容器圖像boops創建作業beeps

[nova@emma ~]$ kubectl create job beeps --image boops
job.batch/beeps created
[nova@emma ~]$ 

Naml 將設計出一個工作程序,但您也將獲得您正在尋找的 output。

[nova@emma naml]$ kubectl get job beeps -o yaml | naml codify
// Copyright © 2021 Kris Nóva <kris@nivenly.com>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//   ███╗   ██╗ █████╗ ███╗   ███╗██╗
//   ████╗  ██║██╔══██╗████╗ ████║██║
//   ██╔██╗ ██║███████║██╔████╔██║██║
//   ██║╚██╗██║██╔══██║██║╚██╔╝██║██║
//   ██║ ╚████║██║  ██║██║ ╚═╝ ██║███████╗
//   ╚═╝  ╚═══╝╚═╝  ╚═╝╚═╝     ╚═╝╚══════╝
//

package main

import (
        "context"
        "fmt"
        "os"

        "github.com/hexops/valast"
        batchv1 "k8s.io/api/batch/v1"
        corev1 "k8s.io/api/core/v1"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
        "k8s.io/apimachinery/pkg/types"

        "github.com/kris-nova/naml"
        "k8s.io/apimachinery/pkg/runtime"
        "k8s.io/client-go/kubernetes"
)

// Version is the current release of your application.
var Version string = "0.0.1"

func main() {
        // Load the application into the NAML registery
        // Note: naml.Register() can be used multiple times.
        naml.Register(NewApp("App", "Application autogenerated from NAML v0.3.1"))

        // Run the generic naml command line program with
        // the application loaded.
        err := naml.RunCommandLine()
        if err != nil {
                fmt.Println(err.Error())
                os.Exit(1)
        }
}

// App is a very important grown up business application.
type App struct {
        metav1.ObjectMeta
        description string
        objects     []runtime.Object
        // ----------------------------------
        // Add your configuration fields here
        // ----------------------------------
}

// NewApp will create a new instance of App.
//
// See https://github.com/naml-examples for more examples.
//
// This is where you pass in fields to your application (similar to Values.yaml)
// Example: func NewApp(name string, example string, something int) *App
func NewApp(name, description string) *App {
        return &App{
                description: description,
                ObjectMeta: metav1.ObjectMeta{
                        Name:            name,
                        ResourceVersion: Version,
                },
                // ----------------------------------
                // Add your configuration fields here
                // ----------------------------------
        }
}

func (a *App) Install(client *kubernetes.Clientset) error {
        var err error

        beepsJob := &batchv1.Job{
                TypeMeta: metav1.TypeMeta{
                        Kind:       "Job",
                        APIVersion: "batch/batchv1",
                },
                ObjectMeta: metav1.ObjectMeta{
                        Name:            "beeps",
                        Namespace:       "default",
                        UID:             types.UID("650e4f36-3316-4506-bbe0-1e34c13742cf"),
                        ResourceVersion: "3231200",
                        Generation:      1,
                        Labels: map[string]string{
                                "controller-uid": "650e4f36-3316-4506-bbe0-1e34c13742cf",
                                "job-name":       "beeps",
                        },
                },
                Spec: batchv1.JobSpec{
                        Parallelism:  valast.Addr(int32(1)).(*int32),
                        Completions:  valast.Addr(int32(1)).(*int32),
                        BackoffLimit: valast.Addr(int32(6)).(*int32),
                        Selector: &metav1.LabelSelector{MatchLabels: map[string]string{
                                "controller-uid": "650e4f36-3316-4506-bbe0-1e34c13742cf",
                        }},
                        Template: corev1.PodTemplateSpec{
                                ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{
                                        "controller-uid": "650e4f36-3316-4506-bbe0-1e34c13742cf",
                                        "job-name":       "beeps",
                                }},
                                Spec: corev1.PodSpec{
                                        Containers: []corev1.Container{corev1.Container{
                                                Name:                     "beeps",
                                                Image:                    "boops",
                                                TerminationMessagePath:   "/dev/termination-log",
                                                TerminationMessagePolicy: corev1.TerminationMessagePolicy("File"),
                                                ImagePullPolicy:          corev1.PullPolicy("Always"),
                                        }},
                                        RestartPolicy:                 corev1.RestartPolicy("Never"),
                                        TerminationGracePeriodSeconds: valast.Addr(int64(30)).(*int64),
                                        DNSPolicy:                     corev1.DNSPolicy("ClusterFirst"),
                                        SecurityContext:               &corev1.PodSecurityContext{},
                                        SchedulerName:                 "default-scheduler",
                                },
                        },
                        CompletionMode: valast.Addr(batchv1.CompletionMode("NonIndexed")).(*batchv1.CompletionMode),
                        Suspend:        valast.Addr(false).(*bool),
                },
        }
        a.objects = append(a.objects, beepsJob)

        if client != nil {
                _, err = client.BatchV1().Jobs("default").Create(context.TODO(), beepsJob, metav1.CreateOptions{})
                if err != nil {
                        return err
                }
        }

        return err
}

func (a *App) Uninstall(client *kubernetes.Clientset) error {
        var err error

        if client != nil {
                err = client.BatchV1().Jobs("default").Delete(context.TODO(), "beeps", metav1.DeleteOptions{})
                if err != nil {
                        return err
                }
        }

        return err
}

func (a *App) Description() string {
        return a.description
}

func (a *App) Meta() *metav1.ObjectMeta {
        return &a.ObjectMeta
}

func (a *App) Objects() []runtime.Object {
        return a.objects
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM