구성 검증 문제

구성 검증 문제 (Configuration Validation Problems)

Istio 구성 검증과 관련된 일반적인 문제를 식별하고 해결하는 방법을 배워요. 검증이 거부되거나 수용되는 문제, x509 인증서 오류, 호스트/엔드포인트 오류를 다뤄요.

출처: Istio 문서

본문

유효해 보이는 구성이 거부되는 경우

구성이 왜 거부되는지 더 잘 파악하려면 istioctl validate -f와 istioctl analyze를 사용하세요. 컨트롤 플레인 버전과 비슷한 버전의 istioctl CLI를 사용하세요.

구성에서 가장 흔히 보고되는 문제는 YAML 들여쓰기와 배열 표기법(-) 실수예요.

필요할 때 Istio API 참조를 상호 참조하면서 구성을 수동으로 검증하세요.

유효하지 않은 구성이 수용되는 경우

istio-validator- 다음에 <revision>-(기본 revision이 아닌 경우)이 오고, 그다음 Istio 시스템 네임스페이스가 오는 이름(예: istio-validator-myrev-istio-system)의 validatingwebhookconfiguration이 존재하고 올바른지 검증하세요. 유효하지 않은 구성의 apiVersion, apiGroup, resource는 validatingwebhookconfiguration의 webhooks 섹션에 나열되어 있어야 해요.

$ kubectl get validatingwebhookconfiguration istio-validator-istio-system -o yaml
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  labels:
    app: istiod
    install.operator.istio.io/owning-resource-namespace: istio-system
    istio: istiod
    istio.io/rev: default
    operator.istio.io/component: Pilot
    operator.istio.io/managed: Reconcile
    operator.istio.io/version: unknown
    release: istio
  name: istio-validator-istio-system
  resourceVersion: "615569"
  uid: 112fed62-93e7-41c9-8cb1-b2665f392dd7
webhooks:
- admissionReviewVersions:
  - v1beta1
  - v1
  clientConfig:
    # caBundle should be non-empty. This is periodically (re)patched
    # every second by the webhook service using the ca-cert
    # from the mounted service account secret.
    caBundle: LS0t...
    # service corresponds to the Kubernetes service that implements the webhook
    service:
      name: istiod
      namespace: istio-system
      path: /validate
      port: 443
  failurePolicy: Fail
  matchPolicy: Equivalent
  name: rev.validation.istio.io
  namespaceSelector: {}
  objectSelector:
    matchExpressions:
    - key: istio.io/rev
      operator: In
      values:
      - default
  rules:
  - apiGroups:
    - security.istio.io
    - networking.istio.io
    - telemetry.istio.io
    - extensions.istio.io
    apiVersions:
    - '*'
    operations:
    - CREATE
    - UPDATE
    resources:
    - '*'
    scope: '*'
  sideEffects: None
  timeoutSeconds: 10

검증 구성은 fail-close예요. 구성이 존재하고 올바르게 스코핑되면 웹훅이 호출돼요. caBundle 누락, 잘못된 인증서, 또는 네트워크 연결 문제는 리소스가 생성/업데이트될 때 오류 메시지를 만들어요. 오류 메시지가 보이지 않고 웹훅이 호출되지도 않았는데 웹훅 구성이 유효하다면, 클러스터가 잘못 구성된 거예요.

구성 생성이 x509 인증서 오류로 실패하는 경우

x509: certificate signed by unknown authority 관련 오류는 일반적으로 웹훅 구성의 caBundle이 비어 있어서 발생해요. 그것이 비어 있지 않은지 확인하세요(웹훅 구성 검증 참고). Istio는 웹훅 구성을 istio-validation configmap과 루트 인증서를 사용해 의식적으로 조정(reconcile)해요.

  1. istiod 파드가 실행 중인지 확인하세요.
$  kubectl -n istio-system get pod -lapp=istiod
NAME                            READY     STATUS    RESTARTS   AGE
istiod-5dbbbdb746-d676g   1/1       Running   0          2d
  1. 오류가 있는지 파드 로그를 확인하세요. caBundle 패치 실패는 오류를 출력해야 해요.
$ for pod in $(kubectl -n istio-system get pod -lapp=istiod -o jsonpath='{.items[*].metadata.name}'); do \
    kubectl -n istio-system logs ${pod} \
done
  1. 패치가 실패했다면 Istiod에 대한 RBAC 구성을 확인하세요.
$ kubectl get clusterrole istiod-istio-system -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
  name: istiod-istio-system
rules:
- apiGroups:
  - admissionregistration.k8s.io
  resources:
  - validatingwebhookconfigurations
  verbs:
  - '*'

Istio는 validatingwebhookconfiguration을 생성하고 업데이트하기 위해 validatingwebhookconfigurations에 대한 쓰기 접근이 필요해요.

no such hosts 또는 no endpoints available 오류로 구성 생성이 실패하는 경우

검증은 fail-close예요. istiod 파드가 준비되지 않으면 구성을 생성하고 업데이트할 수 없어요. 이런 경우 no endpoints available에 대한 오류를 보게 될 거예요.

istiod 파드가 실행 중이고 엔드포인트가 준비되었는지 확인하세요.

$  kubectl -n istio-system get pod -lapp=istiod
NAME                            READY     STATUS    RESTARTS   AGE
istiod-5dbbbdb746-d676g   1/1       Running   0          2d
$ kubectl -n istio-system get endpoints istiod
NAME           ENDPOINTS                          AGE
istiod         10.48.6.108:15014,10.48.6.108:443   3d

파드나 엔드포인트가 준비되지 않았다면 파드 로그와 상태를 확인해 웹훅 파드가 시작되어 트래픽을 서빙하지 못하는 이유를 찾아보세요.

$ for pod in $(kubectl -n istio-system get pod -lapp=istiod -o jsonpath='{.items[*].metadata.name}'); do \
    kubectl -n istio-system logs ${pod} \
done
$ for pod in $(kubectl -n istio-system get pod -lapp=istiod -o name); do \
    kubectl -n istio-system describe ${pod} \
done

더 알아보기 (Learn more)