apigee-serving-cert를 찾을 수 없거나 만료되어 API 프록시 배포 실패

ApigeeApigee Hybrid 문서입니다.
Apigee Edge 문서 보기

증상

다음 오류 메시지가 표시되면서 API 프록시 배포가 실패합니다.

오류 메시지

apigee-webhook-service.apigee-system.svc 서비스의 TLS 인증서가 만료되었거나 아직 유효하지 않으면 apigee-watcher 로그에 다음 오류 메시지가 표시됩니다.

{"level":"error","ts":1687991930.7745812,"caller":"watcher/watcher.go:60",
"msg":"error during watch","name":"ingress","error":"INTERNAL: INTERNAL: failed
to update ApigeeRoute [org-env]-group-84a6bb5, namespace apigee:
Internal error occurred: failed calling webhook
\"mapigeeroute.apigee.cloud.google.com\": Post
\"https://apigee-webhook-service.apigee-system.svc:443/mutate-apigee-cloud-google-com-v1alpha1-apigeeroute?timeout=30s\":
x509:
certificate has expired or is not yet valid: current time
2023-06-28T22:38:50Z is after 2023-06-17T17:14:13Z, INTERNAL: failed to update
ApigeeRoute [org-env]-group-e7b3ff6, namespace apigee 

가능한 원인

원인 설명
apigee-serving-cert를 찾을 수 없음 apigee-system 네임스페이스에 apigee-serving-cert가 없으면 이 문제가 발생할 수 있습니다.
apigee-serving-cert를 갱신하기 위해 중복 인증서 요청이 생성됨 apigee-serving-cert 인증서를 갱신하기 위해 중복 인증서 요청이 생성된 경우 apigee-serving-cert 인증서가 갱신되지 않을 수 있습니다.
cert-manager가 비정상임 cert-manager가 정상이 아니면 apigee-serving-cert 인증서가 갱신되지 않을 수 있습니다.

원인: apigee-serving-cert를 찾을 수 없음

진단

  1. apigee-system 네임스페이스에서 apigee-serving-cert 인증서 사용 가능 여부를 확인합니다.

    kubectl -n apigee-system get certificates apigee-serving-cert
    

    이 인증서를 사용할 수 있으면 다음과 비슷한 출력이 표시됩니다.

    NAME                  READY   SECRET                AGE
    apigee-serving-cert   True    webhook-server-cert   2d10h
  2. apigee-system 네임스페이스에서 apigee-serving-cert 인증서를 찾을 수 없으면 이로 인해 이 문제가 발생할 수 있습니다.

해결 방법

  1. apigee-serving-cert는 Apigee Hybrid 설치 중에 apigeectl init 명령어로 생성됩니다. 따라서 관련 overrides.yaml 파일과 함께 명령어를 실행하여 다시 만듭니다.
    apigeectl init -f overrides/overrides.yaml
  2. apigee-serving-cert 인증서가 생성되었는지 확인합니다.
    kubectl -n apigee-system get certificates apigee-serving-cert

원인: apigee-serving-cert를 갱신하기 위해 중복 인증서 요청이 생성됨

진단

  1. cert-manager 컨트롤러 로그를 확인하고 다음과 유사한 오류 메시지가 반환되었는지 확인합니다.

    모든 cert-manager 포드를 나열합니다.

    kubectl -n cert-manager get pods

    출력 예시는 다음과 같습니다.

    NAME                                       READY   STATUS    RESTARTS        AGE
    cert-manager-66d9545484-772cr              1/1     Running   0               6d19h
    cert-manager-cainjector-7d8b6bd6fb-fpz6r   1/1     Running   0               6d19h
    cert-manager-webhook-669b96dcfd-6mnm2      1/1     Running   0               6d19h

    cert-manager 컨트롤러 로그를 확인합니다.

    kubectl -n cert-manager logs cert-manager-66d9545484-772cr | grep "issuance is skipped until there are no more duplicates"

    출력 예시는 다음과 같습니다.

    1 controller.go:163] cert-manager/certificates-readiness "msg"="re-queuing item due to error processing" "error"="multiple CertificateRequests were found for the 'next' revision 3, issuance is skipped until there are no more duplicates" "key"="apigee-system/apigee-serving-cert"

    다음과 유사한 오류 메시지가 표시되면 apigee-serving-cert 인증서가 갱신되지 않습니다.

  2. apigee-system 네임스페이스의 모든 인증서 요청을 나열하고 같은 apigee-serving-cert 인증서 버전을 갱신하기 위해 인증서 요청이 여러 개 생성되었는지 확인합니다.
    kubectl -n apigee-system get certificaterequests

cert-manager에서 같은 certificate-revision을 사용하여 CertificateRequest 객체를 여러 개 생성함에서 이 문제와 관련된 cert-manager 문제를 참조하세요.

해결 방법

  1. apigee-system 네임스페이스에서 모든 인증서 요청을 삭제합니다.
    kubectl -n apigee-system delete certificaterequests --all
  2. 중복 인증서 요청이 삭제되었고 apigee-system 네임스페이스의 apigee-serving-cert 인증서에 인증서 요청 하나만 사용할 수 있는지 확인합니다.
    kubectl -n apigee-system get certificaterequests
  3. apigee-serving-cert 인증서가 갱신되었는지 확인합니다.
    kubectl -n apigee-system get certificates apigee-serving-cert -o yaml

    출력 예시는 다음과 같습니다.

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      creationTimestamp: "2023-06-26T13:25:10Z"
      generation: 1
      name: apigee-serving-cert
      namespace: apigee-system
      resourceVersion: "11053"
      uid: e7718341-b3ca-4c93-a6d4-30cf70a33e2b
    spec:
      dnsNames:
      - apigee-webhook-service.apigee-system.svc
      - apigee-webhook-service.apigee-system.svc.cluster.local
      issuerRef:
        kind: Issuer
        name: apigee-selfsigned-issuer
      secretName: webhook-server-cert
    status:
      conditions:
      - lastTransitionTime: "2023-06-26T13:25:11Z"
        message: Certificate is up to date and has not expired
        observedGeneration: 1
        reason: Ready
        status: "True"
        type: Ready
      notAfter: "2023-09-24T13:25:11Z"
      notBefore: "2023-06-26T13:25:11Z"
      renewalTime: "2023-08-25T13:25:11Z"
      revision: 1

원인: cert-manager가 비정상임

진단

  1. cert-manager 네임스페이스의 cert-manager 포드 상태를 확인합니다.
    kubectl -n cert-manager get pods

    cert-manager 포드가 정상이면 모든 cert-manager 포드의 ready가 (1/1)이고 상태는 Running이므로 그렇지 않으면 이 문제가 발생할 수 있습니다.

    NAME                                       READY   STATUS    RESTARTS   AGE
    cert-manager-59cf78f685-mlkvx              1/1     Running   0          15d
    cert-manager-cainjector-78cc865768-krjcp   1/1     Running   0          15d
    cert-manager-webhook-77c4fb46b6-7g9g6      1/1     Running   0          15d
  2. cert-manager는 여러 가지 이유로 실패할 수 있습니다. cert-manager 로그를 확인하여 실패 원인을 확인하고 그에 따라 해결하세요.

    한 가지 알려진 이유는 cert-manager가 Kubernetes API와 통신할 수 없으면 실패한다는 것입니다. 이 경우 다음과 유사한 오류 메시지가 표시됩니다.

    E0601 00:10:27.841516       1 leaderelection.go:330] error retrieving
    resource lock kube-system/cert-manager-controller: Get
    "https://192.168.0.1:443/api/v1/namespaces/kube-system/configmaps/cert-manager-controller":
    dial tcp 192.168.0.1:443: i/o timeout

해결 방법

  1. Kubernetes 클러스터 상태를 확인하고 발견된 문제를 해결합니다. 클러스터 문제 해결을 참조하세요.
  2. 추가 cert-manager 문제 해결 정보는 문제 해결을 참조하세요.

진단 정보 수집 필요

위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Google Cloud Customer Care에 문의하세요.

  1. Google Cloud 프로젝트 ID
  2. Apigee Hybrid 조직
  3. 민감한 정보를 마스킹하는 Apigee Hybrid overrides.yaml 파일
  4. 모든 네임스페이스의 Kubernetes 포드 상태:
    kubectl get pods -A > kubectl-pod-status`date +%Y.%m.%d_%H.%M.%S`.txt
  5. Kubernetes cluster-info 덤프:
    # generate kubernetes cluster-info dump
    kubectl cluster-info dump -A --output-directory=/tmp/kubectl-cluster-info-dump
    # zip kubernetes cluster-info dump
    zip -r kubectl-cluster-info-dump`date +%Y.%m.%d_%H.%M.%S`.zip /tmp/kubectl-cluster-info-dump/*