1.16 알파/베타 올라오면서 CRD v1 승격 얘기가 나오는 중. 사내에 운영 반복되는 패턴(예: 환경별 secret rotation, 특정 ConfigMap 자동 동기화) 몇 개를 custom controller로 빼는 작업.
kubebuilder 2.0 써서 세팅.
kubebuilder init --domain example.com
kubebuilder create api --group ops --version v1alpha1 --kind SecretSync
Reconcile 함수 구조는 결국 이거다.
func (r *SecretSyncReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
ctx := context.Background()
var sync opsv1.SecretSync
if err := r.Get(ctx, req.NamespacedName, &sync); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
// 현재 상태 측정
// 목표 상태와 diff
// 적용
return ctrl.Result{RequeueAfter: 30 * time.Second}, nil
}
배운 점 두 개.
1) controller는 idempotent해야 한다. 같은 입력이 100번 와도 같은 결과. 절대 increment 같은 로직 넣지 말 것.
2) 에러 리턴하면 exponential backoff로 재시도된다. 재시도 원하는 거면 error, 아니면 RequeueAfter. 이거 헷갈리면 무한 재시도 또는 무반응.
CRD v1 정식은 1.16 GA에서. v1beta1은 deprecation 예정인데 우리처럼 지금 만들면 v1beta1로 생성해놓고 나중에 변환 웹훅으로 옮겨야 함. 귀찮.