단계별 설명과 함께 아래의 솔루션을 확인하세요.
설명:
해결책(단계별) :
1. 비밀 검증을 위한 CRD를 만듭니다.
- 배포에 필요한 비밀을 지정하기 위해 'SecretValidator'라는 사용자 정의 리소스 정의(CRD)를 정의합니다.
- 이 CRD에는 비밀 이름이 포함된 '사양' 섹션이 있습니다.

2. 유효성 검사 웹훅 구성을 만듭니다. - ValidatingWebhookConfiguration 리소스를 만듭니다. - 'SecretValidatoo CRD와 일치하도록 '규칙'을 정의하고 CRD의 모든 작업에 대해 웹훅이 트리거되는지 확인합니다. - 유효성 검사에 실패할 경우 포드 배포를 방지하려면 'failurePolicy'를 'Fail'로 지정합니다. - 지원되는 API 버전을 나타내려면 'admissionReviewVersions'를 제공합니다. - 웹훅은 유효성 검사만 수행하고 객체를 수정하지 않으므로 'sideEffects'를 '없음'으로 설정합니다.

3. 비밀 검증 서비스 만들기: - 검증 웹훅 요청을 처리할 서비스에 대한 배포를 만듭니다. - 서비스에는 네임스페이스에 필요한 비밀이 있는지 확인하는 코드가 있는 컨테이너가 있어야 합니다.

4. 서비스에서 검증 논리를 구현합니다. - 비밀 검증 서비스 컨테이너의 코드에서 다음을 수행해야 합니다. - Kubernetes API 서버에서 요청을 수신합니다. - 'SecretValidator' CRD에서 'secretName'을 검색합니다. - 네임스페이스에 해당 이름의 비밀이 있는지 확인합니다. - 비밀이 있으면 포드 배포를 허용합니다. - 비밀이 없으면 포드 배포를 거부하고 오류 메시지를 반환합니다. 패키지 메인 가져오기( "context" "encoding/json" "fmt" "io/ioutil" "net/http" metavl "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" func main() { // Kubernetes 클라이언트셋 구성을 생성합니다. err := rest.InClusterConfig() if err != nil { panic(err) 클라이언트셋, err := kubernetes.NewForConfig(config) if err != nil { panic(err) // CRD를 디코딩하기 위한 스키마를 생성합니다. scheme := runtime.NewScheme() codecs := serializer.NewCodecFactory(scheme) deserializer := codecs.UniversalDeserializer() // HTTP 서버 시작 http.HandleFunc("/validate", func(w http.ResponseWriter, r http.Request) { // 입학 심사 요청 본문 읽기 body, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, fmt.Sprintf("본문 읽기 오류: %v" err), http.StatuslnternalServerError) return } // 입학 심사 요청 언마샬링 var admissionReview metavl .AdmissionReview , err = deserializer.Decode(body, nil, &admissionReview) if err != nil { http.Error(w, fmt.Sprintf("입학 심사 디코딩 오류: %v", err), http.StatuslnternalServerError) return } // 입학 심사 요청 언마샬링 입학 심사 요청 var admissionReview metavl .AdmissionReview , err = deserializer.Decode(body, nil, &admissionReview) if err != nil { http.Error(w, fmt.Sprintf("입학 심사 디코딩 오류: %v", err), http.StatuslnternalServerError) return } // 비밀이 있는지 확인 , err = clientset.CoreV1 ().Secrets(admissionReview.Request.Namespace).Get(context.TODO(), secretValidator.Spec.SecretName, metavl .GetOptions{}) if err nil { // 비밀이 없으면 요청을 거부합니다 admissionReview.Response = &metavl .AdmissionResponse{ IJID: admissionReview.Request.UlD, Allowed: false, Result: &metavl .Status{ Status: metavl .StatusFailure, Message: fmt.Sprintf("비밀 %s를 네임스페이스 %s에서 찾을 수 없습니다", secretValidator.Spec.SecretName, admissionReview.Request.Namespace), } } } else { // 비밀이 존재합니다. 요청을 허용합니다. admissionReview.Response = &metavl .AdmissionResponse{ UID: admissionReview.Request.UlD, Allowed: true, Result: &metavl .Status{ Status: metavl .StatusSuccess, // 입학 심사 응답을 마샬링합니다. response, err := json.Marshal(admissionReview) if err nil { http.Error(w, fmt.Sprintf("입학 검토 마샬링 오류: %v", err), http.StatuslnternalServerError) return } // 클라이언트에 응답 쓰기 w.WriteHeader(http.StatusOK) w.Write(response) }) // 포트 8443에서 HTTP 서버 시작 http.ListenAndServeTLS(":8443", "/path/to/cert.pem", "/path/to/key.pem", nil) } // SecretValidator CRD 유형 정의 SecretValidator struct { metav1 .TypeMeta metav1 .ObjectMeta Spec SecretValidatorSpec } type SecretValidatorSpec struct {

} 5. SecretValidator 리소스 생성: - 배포와 동일한 네임스페이스에 'SecretValidator' 리소스를 생성합니다. - 'spec.secretName'을 필요한 비밀의 이름으로 설정합니다.

6. 검증을 통해 애플리케이션 배포: - 애플리케이션 배포가 'SecretValidator' 리소스와 동일한 네임스페이스에 있는지 확인합니다. - 배포는 검증 웹훅을 트리거하기 위해 주석에서 'SecretValidator' 리소스를 참조해야 합니다.

참고: 이 설정은 배포 생성에만 적용됩니다. 다른 작업(예: 업데이트)의 경우 'ValidatingWebhookConfiguration'의 '규칙'을 업데이트해야 합니다. 이 솔루션을 확장하여 다른 리소스의 유효성을 검사하거나 더욱 구체적인 유효성 검사 정책을 생성할 수도 있습니다.]