작년에 저는 kubebuilder로 다양한 것들을 위한 오퍼레이터를 구축하기 시작했습니다. 운영자 전체에서 조건을 광범위하게 사용하여 맞춤형 리소스에 대한 조정 프로세스의 각 단계를 관리했습니다.
안타깝게도 sigs.k8s.io의 조건으로 인해 더 많은 것을 원하게 되었습니다. 충돌, 손상된 상태 등과 관련된 몇 가지 문제가 있었습니다. 그리고 문제를 더 자세히 조사하면서 조건 사용에 대한 일종의 프레임워크를 만들기 시작했습니다.
최근에 마침내 다른 사람들이 사용할 수 있도록 이러한 결과를 라이브러리에 패키지하는 데 시간이 걸렸습니다. 나는 그것을 컨디셔너(Conditionner)라고 부른다. Konditionner의 핵심 목표는 다음을 제공하는 것입니다.
import "github.com/pier-oliviert/konditionner/pkg/konditions" BuildCondition konditions.ConditionType = "Builds" NetworkCondition konditions.ConditionType = "Network" PodCondition konditions.ConditionType = "Pod" DependenciesCondition konditions.ConditionType = "Dependency" VariablesCondition konditions.ConditionType = "Variables" type MyCRD struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec MySpec `json:"spec,omitempty"` Status MyStatus `json:"status,omitempty"` } // ConditionalResource interface, more about it in the Advisory Lock // section func (m MyCRD) *konditions.Conditions { return &m.Status.Conditions } type MySpec struct { // ... My Fields ... } type MyStatus struct { // ... My Fields ... Conditions konditions.Conditions `json:"conditions,omitempty"` }
MyCRD 사용자 정의 리소스는 거의 없지만 사용할 준비가 되었습니다! Konditionner에는 모든 용도에 따라 정의된 유형이 제공되지 않습니다. 여기서는 5개를 만들었는데, 이는 조정 루프에서 5개의 조건으로 작업한다는 의미입니다.
포드를 생성하려는 조정 루프가 있다고 가정해 보겠습니다. 조건의 목표는 초기화됨에서 두 가지 결과 중 하나로 진행하는 것입니다. 성공하면 생성되고, 프로세스에 오류가 있으면 오류가 발생합니다.
조정 루프는 분산 데이터베이스(etcd)와 캐시 레이어 위에서 작동하기 때문에 작업을 실행하기 전에 조건에 "잠금"을 생성하는 것이 훨씬 더 안정적이라는 것을 알았습니다.
func (r Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { var record MyCRD if err := r.Get(ctx, req, &record); err != nil { return ctrl.Result{}, err } lock := konditions.NewLock(record, r.Client, PodCondition) if lock.Condition().Status == konditions.ConditionError { // Nothing to do return ctrl.Result{}, err } if lock.Condition().Status == konditions.ConditionInitialized { lock.Execute(ctx, func(condition konditions.Condition) error { pod, err := createPod() if err != nil { return err } condition.Status = konditions.ConditionCreated condition.Reason = fmt.Sprintf("Pod created: %s", pod.Name) record.Conditions().setCondition(condition) return nil }) } }
잠금이 작동하려면 레코드가 konditions.ConditionalResource 인터페이스를 준수해야 합니다. 이것이 바로 사용자 정의 리소스 상단에 Conditions() 메서드가 정의되어 있는 이유입니다.
func (m MyCRD) *konditions.Conditions { return &m.Status.Conditions }
문서는 pkg.go.dev에서 볼 수 있으며 소스는 Github에서 볼 수 있습니다.
위 내용은 Konditionner: kcustom 리소스의 조건 관리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!