天天看點

2022-03-11 快速編寫k8s的operator

目錄

​​摘要:​​

​​編寫pkg/apis:​​

​​pkg/apis/example/register.go​​

​​pkg/apis/v1/doc.go:​​

​​pkg/apis/v1/register.go:​​

​​pkg/apis/v1/types.go​​

​​hack/boilerplate.go.txt​​

​​代碼自動生成腳本:​​

​​代碼生成執行結果:​​

摘要:

編寫pkg/apis:

[root@ccos-autodeploy-14-67 sample]# tree
.
├── gene.sh
├── hack
│   ├── boilerplate.go.txt
│   ├── custom-boilerplate.go.txt
│   ├── tools.go
│   ├── update-codegen.sh
│   └── verify-codegen.sh
└── pkg
    ├── apis
    │   ├── example
    │   │   └── register.go
    │   └── v1
    │       ├── doc.go
    │       ├── register.go
    │       └── types.go      

pkg/apis/example/register.go

package example
  
const (
        GroupName = "example.k8s.io"
        Version   = "v1"
)      

pkg/apis/v1/doc.go:

// +k8s:deepcopy-gen=package

// +groupName=example.k8s.io
package v1      

pkg/apis/v1/register.go:

package v1

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

        "crd_controller/pkg/apis/example"
)

var SchemeGroupVersion = schema.GroupVersion{
        Group:   example.GroupName,
        Version: example.Version,
}

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

func Resource(resource string) schema.GroupResource {
        return SchemeGroupVersion.WithResource(resource).GroupResource()
}

func Kind(kind string) schema.GroupKind {
        return SchemeGroupVersion.WithKind(kind).GroupKind()
}

func addKnownTypes(scheme *runtime.Scheme) error {
        scheme.AddKnownTypes(
                SchemeGroupVersion,
                &Student{},
                &StudentList{},
        )

        // register the type in the scheme
        metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
        return nil
}      

pkg/apis/v1/types.go

package v1

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

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

type Student struct {
        metav1.TypeMeta   `json:",inline"`
        metav1.ObjectMeta `json:"metadata,omitempty"`
        Spec              StudentSpec `json:"spec"`
}

type StudentSpec struct {
        name   string `json:"name"`
        school string `json:"school"`
}

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

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

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

hack/boilerplate.go.txt

/*
Copyright The Kubernetes Authors.

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.
*/
      

代碼自動生成腳本:

#!/bin/bash

go env -w GOPROXY=https://goproxy.cn,direct

generate-groups.sh all \
    ./pkg/client \
    ./pkg/apis \
    example:v1 \
    --go-header-file ./hack/boilerplate.go.txt      

代碼生成執行結果:

[root@ccos-autodeploy-14-67 sample]# bash gene.sh 
Generating deepcopy funcs
Generating clientset for example:v1 at ./pkg/client/clientset
Generating listers for example:v1 at ./pkg/client/listers
Generating informers for example:v1 at ./pkg/client/informers      

代碼生成後所有檔案的目錄結構:

[root@ccos-autodeploy-14-67 sample]# tree
.
├── gene.sh
├── hack
│   ├── boilerplate.go.txt
│   ├── custom-boilerplate.go.txt
│   ├── tools.go
│   ├── update-codegen.sh
│   └── verify-codegen.sh
└── pkg
    ├── apis
    │   ├── example
    │   │   └── register.go
    │   └── v1
    │       ├── doc.go
    │       ├── register.go
    │       └── types.go
    └── client
        └── clientset
            └── versioned
                ├── clientset.go
                ├── doc.go
                ├── fake
                │   ├── clientset_generated.go
                │   ├── doc.go
                │   └── register.go
                ├── scheme
                │   ├── doc.go
                │   └── register.go
                └── typed
                    └── example
                        └── v1
                            ├── doc.go
                            ├── example_client.go
                            ├── fake
                            │   ├── doc.go
                            │   └── fake_example_client.go
                            └── generated_expansion.go

14 directories, 22 files