Kubernetes CRD-コード生成から使用へ

8036 ワード

CustomResourceDefinition(CRD)はv 1.7+コードを変更することなくKubernetes APIを拡張できる新しいメカニズムは、カスタムオブジェクトを管理するために使用されます.実際にはThirdPartyResources(TPR)のアップグレードバージョンであり、TPRはv 1にある.8から削除します.
いくつかの使用シーン:cloudSQL/RDSインスタンスなどの外部データストレージ/データベースの提供/管理k 8 sベースリソースのより高い抽象化(etcdクラスタの定義など)実際にcrdは、ingress-controllerや多くのoperatorなどの多くのk 8 s周辺のオープンソースプロジェクトで使用されています.
1.ディレクトリ構造
pkg
    |--apis
        |--samplecontroller
            |--v1alpha1
                |--doc.go
                |--register.go
                |--types.go
            |--register.go
    |--client

2.Gopkgを構成する.toml:
構成完了後にdep ensure-vダウンロード依存を実行
required = [
  "k8s.io/code-generator/cmd/client-gen"
]

[[constraint]]
  name = "k8s.io/client-go"
  version = "v6.0.0"

[[constraint]]
  name = "k8s.io/api"
  version = "kubernetes-1.10.4"

[[constraint]]
  name = "k8s.io/apimachinery"
  version = "kubernetes-1.10.4"

[[constraint]]
  name = "k8s.io/code-generator"
  version = "kubernetes-1.10.4"

[prune]
  non-go = true
  go-tests = true
  unused-packages = true

  [[prune.project]]
    name = "k8s.io/code-generator"
    unused-packages = false
    non-go = false
    go-tests = false

  [[prune.project]]
    name = "k8s.io/gengo"
    unused-packages = false
    non-go = false
    go-tests = false

3.crdクライアントコードの生成
1.1 docを先に作成する.go ,types.go ,register.goコード
doc.go
// +k8s:deepcopy-gen=package

// Package v1alpha1 is the v1alpha1 version of the API.
// +groupName=samplecontroller.k8s.io
package v1alpha1

types.go
package v1alpha1

import (
  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"  
)

// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// Foo is a specification for a Foo resource
type Foo struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   FooSpec   `json:"spec"`
    Status FooStatus `json:"status"`
}



// FooSpec is the spec for a Foo resource
type FooSpec struct {
    DeploymentName string `json:"deploymentName"`
    Replicas       *int32 `json:"replicas"`
}

// FooStatus is the status for a Foo resource
type FooStatus struct {
    AvailableReplicas int32 `json:"availableReplicas"`
}

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// FooList is a list of Foo resources
type FooList struct {
    metav1.TypeMeta `json:",inline"`
    metav1.ListMeta `json:"metadata"`

    Items []Foo `json:"items"`
}

register.go
package v1alpha1

import (
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/apimachinery/pkg/runtime/schema"

    samplecontroller "github.com/hidevopsio/hioak/pkg/apis/samplecontroller"
)

// SchemeGroupVersion is group version used to register these objects
var SchemeGroupVersion = schema.GroupVersion{Group: samplecontroller.GroupName, Version: "v1alpha1"}

// Kind takes an unqualified kind and returns back a Group qualified GroupKind
func Kind(kind string) schema.GroupKind {
    return SchemeGroupVersion.WithKind(kind).GroupKind()
}

// Resource takes an unqualified resource and returns a Group qualified GroupResource
func Resource(resource string) schema.GroupResource {
    return SchemeGroupVersion.WithResource(resource).GroupResource()
}

var (
    SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
    AddToScheme   = SchemeBuilder.AddToScheme
)

// Adds the list of known types to Scheme.
func addKnownTypes(scheme *runtime.Scheme) error {
    scheme.AddKnownTypes(SchemeGroupVersion,
        &Foo{},
        &FooList{},
    )
    metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
    return nil
}


register.go(このファイルはsamplecontrollerディレクトリの下にあります)
package samplecontroller

const (
    GroupName = "samplecontroller.k8s.io"
)

1.2コード生成命令の実行
  • 1.プロジェクトディレクトリGOPATH/src/githubに入ります.com/openshift-evangelists/crd-code-generation/vendor/k8s.io/code-generator
  • 2.generate-groups.sh実行権限$chmod+x generate-groupsを追加する.sh
  • 3.現在のディレクトリで次のコマンド
  • を実行します.
    ./generate-groups.sh all \
    github.com/hidevopsio/hioak/pkg/client \
    github.com/hidevopsio/hioak/pkg/apis \
    samplecontroller:v1alpha1
    

    4つのパラメータ:
  • の最初のパラメータ:allは、clientset、informers、listersなどの
  • のようなすべてのモジュールを生成するということです.
  • 第2パラメータ:github.com/hidevopsio/hioak/pkg/clientコードを生成するディレクトリです.ディレクトリの名前はclientです.generatedという
  • もあります.
  • 第3パラメータ:github.com/hidevopsio/hioak/pkg/apisこのディレクトリはあなた自身が作成したもので、少なくともtypesが含まれています.goそのディレクトリ
  • の4番目のパラメータ:“samplecontroller:v 1 alpha 1”:これがディレクトリで、samplecontrollerはapisの下のディレクトリで、v 1 beta 1はsamplecontrollerの下のディレクトリ
  • です
    generate-groupsを実行します.sh後、gopathディレクトリのbinディレクトリの下に、client-gen、deepcopy-genなどの5つのツールが生成されます.これらのツールを利用して、コードを生成します.
    生成コードで発生する可能性のある問題:
    1.   ./generate-groups.sh: line 65: /Users/mac/.gvm/pkgsets/go1.10/vpcloud:/Users/mac/.gvm/pkgsets/go1.10/global/bin/deepcopy-gen: No such file or directory
         GOPATH     ,       GOPATH         
        :export GOPATH=/Users/mac/.gvm/pkgsets/go1.10/vpcloud
                    deepcopy-gen    ,  deepcopy-gen       deepcopy-gen           
    

    1.3コード生成後のディレクトリ構造
    pkg
      |--apis
            |--samplecontroller
                |--v1alpha1
                    |--doc.go
                    |--register.go
                    |--types.go
                    |--zz_generated.deepcopy.go
                |--register.go
      |--client
            |--clientset
            |--informers
            |--listers
    

    4.生成されたコードを使用
    4.1 FOOタイプcrdの作成および使用
    kubectl create -f crd.yaml
    crd.yaml:
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: foos.samplecontroller.k8s.io
    spec:
      group: samplecontroller.k8s.io
      version: v1alpha1
      names:
        kind: Foo
        plural: foos
      scope: Namespaced
    

    kubectl create -f example-foo.yaml
    example-foo.yaml:
    apiVersion: samplecontroller.k8s.io/v1alpha1
    kind: Foo
    metadata:
      name: example-foo
    spec:
      deploymentName: example-foo
      replicas: 1
    

    4.2 mainを作成します.goファイルの直接使用
    main.go
    
    package main
    
    import (
        "flag"
        "fmt"
        "github.com/golang/glog"
        clientset "hidevops.io/sample-controller/pkg/client/clientset/versioned"
        "k8s.io/client-go/tools/clientcmd"
        metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    )
    
    var (
        masterURL  string
        kubeconfig string
    )
    
    func init() {
        flag.StringVar(&kubeconfig, "kubeconfig", "/Users/mac/.kube/config", "Path to a kubeconfig. Only required if out-of-cluster.")
        flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
    }
    
    func main() {
        flag.Parse()
    
        cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig)
        if err != nil {
            glog.Fatalf("Error building kubeconfig: %s", err.Error())
        }
    
        exampleClient, err := clientset.NewForConfig(cfg)
        if err != nil {
            glog.Fatalf("Error building example clientset: %s", err.Error())
        }
    
        fooList,err := exampleClient.SamplecontrollerV1alpha1().Foos("defaule").List(metav1.ListOptions{})
        if err != nil {
            fmt.Printf("Error %v",err)
            return
        }
        fmt.Println("fooList ",fooList)
    
    }
    
    

    参考資料:
  • https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/
  • https://cloud.tencent.com/info/b017df5e65dad32a161580fd1affe3d1.html
  • https://github.com/kubernetes/sample-controller