Kubebuilder를 사용한 Kubernetes operator 개발 가이드
설치
Project 생성
Receivers
Go # Setup을 참고하여 Go 모듈을 초기화합니다.
kubebuilder init --domain <domain>
--domain <domain>- API 그룹의 도메인 이름을 지정합니다.
- apiVersion으로
<group>.<domain>/<version>형식이 사용됩니다.
API 생성
apiVersion: <group>.<domain>/<version>
kind: <kind>
metadata:
# ...
spec:
# ...
위와같은 형식의 Kubernetes API를 생성하려면 다음과 같이 진행하면 됩니다.
- Kubebuilder
- Manual
kubebuilder create api --group <group> --version <version> --kind <kind>
--resourceapi/<version>/<kind>_types.go파일을 생성합니다.
--controllerinternal/controller/<kind>_controller.go파일을 생성합니다.cmd/main.go파일에 컨트롤러를 등록합니다.
loliot.net domain, test group, v1alpha1 version, Test kind API를 수동으로 생성하는 예제입니다.
api/v1alpha1/test_types.go
package v1alpha1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// Test is the Schema for the test API
type Test struct {
metav1.TypeMeta `json:",inline"`
// metadata is a standard object metadata
// +optional
metav1.ObjectMeta `json:"metadata,omitzero"`
// spec defines the desired state of Test
// +required
Spec TestSpec `json:"spec"`
// status defines the observed state of Test
// +optional
Status TestStatus `json:"status,omitzero"`
}
// +kubebuilder:object:root=true
// TestList contains a list of Test
type TestList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitzero"`
Items []Test `json:"items"`
}
// TestSpec defines the desired state of Test
type TestSpec struct {}
// TestStatus defines the observed state of Test.
type TestStatus struct {
// Conditions represent the latest available observations of an object's state.
// +listType=map
// +listMapKey=type
// +optional
Conditions []metav1.Condition `json:"conditions,omitempty"`
}
func init() {
SchemeBuilder.Register(&Test{}, &TestList{})
}
internal/controller/test_controller.go
package controller
import (
"context"
"k8s.io/apimachinery/pkg/runtime"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
v1alpha1 "github.com/lol-iot/project/api/v1alpha1"
)
// TestReconciler reconciles a Test object
type TestReconciler struct {
client.Client
Scheme *runtime.Scheme
}
// +kubebuilder:rbac:groups=test.loliot.net,resources=tests,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=test.loliot.net,resources=tests/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=test.loliot.net,resources=tests/finalizers,verbs=update
// Reconcile is part of the main kubernetes reconciliation loop which aims to
// move the current state of the cluster closer to the desired state.
func (r *TestReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
return ctrl.Result{}, nil
}
// SetupWithManager sets up the controller with the Manager.
func (r *TestReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&v1alpha1.Test{}).
Named("test").
Complete(r)
}
cmd/main.go
if err := (&controller.TestReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Test")
os.Exit(1)
}