CKAD 문제 101
쿠버네티스 클러스터에 배포된 마이크로서비스가 있고, Prometheus와 Grafana를 사용하여 성능과 상태를 모니터링하고 싶습니다. Prometneus를 구성하여 마이크로서비스에서 메트릭을 스크래핑하고 Grafana에서 대시보드를 생성하려면 어떻게 해야 할까요?
정답:
단계별 설명과 함께 아래의 솔루션을 확인하세요.
설명:
해결책(단계별) :
1. 마이크로서비스에서 메트릭 활성화:
- Prometheus Client(Java용), Go metrics 또는 StatsD와 같은 라이브러리를 사용하여 HTTP 엔드포인트를 통해 메트릭을 노출하는지 확인하세요.
- 요청 수, 지연 시간, 오류율 및 기타 관련 성과 지표와 같은 측정 항목을 정의합니다.
2. Prometheus 배포:
- '배포' 및 '서비스'를 사용하여 Prometheus 배포
- 'prometheus.yaml' 파일의 'scrape_configs'에 엔드포인트를 추가하여 마이크로서비스에서 메트릭을 스크래핑하도록 Prometheus를 구성합니다.

3. Prometheus가 마이크로서비스에 액세스하도록 서비스 만들기: - 마이크로서비스의 메트릭 엔드포인트(일반적으로 포트 9100)를 노출하는 'ClusterIP' 유형의 '서비스'를 만듭니다. - Prometheus가 이 서비스에 액세스할 수 있는지 확인합니다. 4. Grafana 배포: - '배포' 및 '서비스'를 사용하여 Grafana 배포 - Grafana가 Prometheus에 데이터 소스로 연결되도록 구성합니다. 5. Grafana에서 대시보드 만들기: - Grafana의 대시보드 빌더를 사용하여 Prometheus에서 수집한 메트릭을 시각화하는 사용자 지정 대시보드를 만듭니다. - 마이크로서비스의 성능과 상태를 보여주는 그래프, 차트 및 표를 표시하는 패널을 추가합니다. 6. Grafana에서 알림 구성: - 특정 메트릭 및 임계값을 기반으로 Grafana에서 알림을 구성합니다. - 마이크로서비스에 중요한 문제가 발생할 때 경고하도록 알림을 설정합니다. 참고: 이 방법은 마이크로서비스에 대한 포괄적인 모니터링을 제공합니다. Prometheus는 마이크로서비스에서 메트릭을 스크래핑하여 시계열 데이터베이스에 저장하고, Grafana는 이러한 메트릭을 시각화하여 잠재적 문제에 대한 알림을 제공합니다. Prometheus 스크래핑 구성 예시:

Grafana 대시보드 예시: - 다음 메트릭을 표시하는 패널이 있는 대시보드를 만듭니다. - 분당 요청 수 - 평균 요청 대기 시간 - 오류율 - 마이크로서비스 컨테이너의 CPU 및 메모리 사용량 - 다음을 알리는 알림을 설정합니다. - 요청 수가 특정 임계값을 초과하는 경우 - 평균 대기 시간이 특정 임계값을 초과하는 경우 - 오류율이 특정 임계값을 초과하는 경우 - CPU 또는 메모리 사용량이 특정 임계값을 초과하는 경우
설명:
해결책(단계별) :
1. 마이크로서비스에서 메트릭 활성화:
- Prometheus Client(Java용), Go metrics 또는 StatsD와 같은 라이브러리를 사용하여 HTTP 엔드포인트를 통해 메트릭을 노출하는지 확인하세요.
- 요청 수, 지연 시간, 오류율 및 기타 관련 성과 지표와 같은 측정 항목을 정의합니다.
2. Prometheus 배포:
- '배포' 및 '서비스'를 사용하여 Prometheus 배포
- 'prometheus.yaml' 파일의 'scrape_configs'에 엔드포인트를 추가하여 마이크로서비스에서 메트릭을 스크래핑하도록 Prometheus를 구성합니다.

3. Prometheus가 마이크로서비스에 액세스하도록 서비스 만들기: - 마이크로서비스의 메트릭 엔드포인트(일반적으로 포트 9100)를 노출하는 'ClusterIP' 유형의 '서비스'를 만듭니다. - Prometheus가 이 서비스에 액세스할 수 있는지 확인합니다. 4. Grafana 배포: - '배포' 및 '서비스'를 사용하여 Grafana 배포 - Grafana가 Prometheus에 데이터 소스로 연결되도록 구성합니다. 5. Grafana에서 대시보드 만들기: - Grafana의 대시보드 빌더를 사용하여 Prometheus에서 수집한 메트릭을 시각화하는 사용자 지정 대시보드를 만듭니다. - 마이크로서비스의 성능과 상태를 보여주는 그래프, 차트 및 표를 표시하는 패널을 추가합니다. 6. Grafana에서 알림 구성: - 특정 메트릭 및 임계값을 기반으로 Grafana에서 알림을 구성합니다. - 마이크로서비스에 중요한 문제가 발생할 때 경고하도록 알림을 설정합니다. 참고: 이 방법은 마이크로서비스에 대한 포괄적인 모니터링을 제공합니다. Prometheus는 마이크로서비스에서 메트릭을 스크래핑하여 시계열 데이터베이스에 저장하고, Grafana는 이러한 메트릭을 시각화하여 잠재적 문제에 대한 알림을 제공합니다. Prometheus 스크래핑 구성 예시:

Grafana 대시보드 예시: - 다음 메트릭을 표시하는 패널이 있는 대시보드를 만듭니다. - 분당 요청 수 - 평균 요청 대기 시간 - 오류율 - 마이크로서비스 컨테이너의 CPU 및 메모리 사용량 - 다음을 알리는 알림을 설정합니다. - 요청 수가 특정 임계값을 초과하는 경우 - 평균 대기 시간이 특정 임계값을 초과하는 경우 - 오류율이 특정 임계값을 초과하는 경우 - CPU 또는 메모리 사용량이 특정 임계값을 초과하는 경우
CKAD 문제 102
중요 애플리케이션에 대한 배포를 통해 쿠버네티스 클러스터를 실행하고 있습니다. 이 애플리케이션은 비밀에 저장된 민감한 데이터를 사용합니다. 보안을 위해 민감한 데이터가 포함된 비밀이 누락된 경우 이 애플리케이션에 대한 파드 배포를 방지하는 정책을 구현해야 합니다. 사용자 지정 리소스 정의(CRD)와 승인 웹훅을 사용하여 이를 어떻게 구현하시겠습니까?
정답:
단계별 설명과 함께 아래의 솔루션을 확인하세요.
설명:
해결책(단계별) :
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'의 '규칙'을 업데이트해야 합니다. 이 솔루션을 확장하여 다른 리소스의 유효성을 검사하거나 더욱 구체적인 유효성 검사 정책을 생성할 수도 있습니다.
설명:
해결책(단계별) :
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'의 '규칙'을 업데이트해야 합니다. 이 솔루션을 확장하여 다른 리소스의 유효성을 검사하거나 더욱 구체적인 유효성 검사 정책을 생성할 수도 있습니다.
- 다른 버전
- 1114LinuxFoundation.CKAD.v2024-06-01.q33
- 989LinuxFoundation.CKAD.v2024-03-04.q32
- 518LinuxFoundation.CKAD.v2023-01-09.q7
- 592LinuxFoundation.CKAD.v2022-07-11.q7
- 645LinuxFoundation.CKAD.v2022-01-13.q7
- 최근 업로드
- 124Juniper.JN0-750.v2025-10-16.q27
- 155LinuxFoundation.CKAD.v2025-10-16.q102
- 142EXIN.CDCP.v2025-10-15.q41
- 116Oracle.1Z0-1163-1.v2025-10-15.q18
- 127McAfee.CCII.v2025-10-15.q46
- 335GARP.2016-FRR.v2025-10-14.q272
- 398CompTIA.SY0-601.v2025-10-14.q871
- 143SAP.C-THR86-2505.v2025-10-14.q42
- 202SHRM.SHRM-SCP.v2025-10-14.q110
- 255HashiCorp.Terraform-Associate-003.v2025-10-14.q198
[×]
PDF 파일 다운로드
메일 주소를 입력하시고 다운로드 하세요. LinuxFoundation.CKAD.v2025-10-16.q102 모의시험 시험자료를 다운 받으세요.