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.ディレクトリ構造
2.Gopkgを構成する.toml:
構成完了後にdep ensure-vダウンロード依存を実行
3.crdクライアントコードの生成
1.1 docを先に作成する.go ,types.go ,register.goコード
doc.go
types.go
register.go
register.go(このファイルはsamplecontrollerディレクトリの下にあります)
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.現在のディレクトリで次のコマンド を実行します.
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.3コード生成後のディレクトリ構造
4.生成されたコードを使用
4.1 FOOタイプcrdの作成および使用
kubectl create -f crd.yaml
crd.yaml:
kubectl create -f example-foo.yaml
example-foo.yaml:
4.2 mainを作成します.goファイルの直接使用
main.go
参考資料: https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/ https://cloud.tencent.com/info/b017df5e65dad32a161580fd1affe3d1.html https://github.com/kubernetes/sample-controller
いくつかの使用シーン: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コード生成命令の実行
./generate-groups.sh all \
github.com/hidevopsio/hioak/pkg/client \
github.com/hidevopsio/hioak/pkg/apis \
samplecontroller:v1alpha1
4つのパラメータ:
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)
}
参考資料: