영기

에러 발생 환경

 

  • Kubernetes 클러스터에 Helm을 사용하여 Nginx Ingress Controller를 설치하고 Ingress 리소스를 생성하는 과정에서 에러가 발생함.
  • Ingress 리소스를 적용할 때 웹훅 검증 서비스를 찾지 못하는 에러가 발생했습니다.
  • 웹훅은 존재하지만 참조하는 서비스가 없어서 검증에 실패한 상황으로, 웹훅 설정을 삭제하여 문제를 해결했습니다.

 

 

# 네임스페이스 생성
kubectl create namespace ingress-nginx

# Helm으로 다시 설치 (네임스페이스 지정)
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# 웹훅 설정을 포함한 완전한 설치
helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.admissionWebhooks.enabled=true \
  --set controller.service.type=NodePort
  
  # 테스트 애플리케이션 배포
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: podinfo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: podinfo
  template:
    metadata:
      labels:
        app: podinfo
    spec:
      containers:
      - name: podinfo
        image: stefanprodan/podinfo:latest
        ports:
        - containerPort: 9898
---
apiVersion: v1
kind: Service
metadata:
  name: podinfo
spec:
  ports:
  - port: 80
    targetPort: 9898
  selector:
    app: podinfo
EOF

# Ingress 리소스 생성
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: podinfo
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: podinfo
            port:
              number: 80
EOF

 

 

발생한 에러

Error from server (InternalError): error when creating "podinfo-ingress.yaml": 
Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": 
failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": 
service "ingress-nginx-controller-admission" not found

 

원인

  1. 웹훅 설정과 서비스 불일치
    • ingress-nginx-admission이라는 검증 웹훅은 존재하지만, 이 웹훅이 참조하는 서비스 ingress-nginx-controller-admission이 존재하지 않거나 다른 이름으로 설치되었습니다.
  2. 불완전한 설치
    • Helm이나 다른 설치 방법으로 Nginx Ingress Controller를 설치할 때 일부 리소스만 성공적으로 생성되었을 수 있습니다.
    • 검증 웹훅은 설치되었지만, 실제 검증 서비스는 설치되지 않은 상태였습니다.

 

해결 방법

1. 웹훅 설정 제거 (테스트 환경 only)

kubectl delete validatingwebhookconfigurations ingress-nginx-admission
  • 이 방법으로 검증 단계를 건너뛰어 Ingress 리소스를 즉시 생성할 수 있었습니다.
  • 실제로 이 방법을 적용했더니 Ingress 리소스가 정상적으로 생성되었습니다.

2. NGINX ingress controller 재설치 (프로덕션 환경)

  1. 완전한 재설치:
  2. # 기존 설치 제거 helm uninstall nginx-ingress -n ingress-nginx kubectl delete namespace ingress-nginx kubectl delete validatingwebhookconfigurations ingress-nginx-admission # 새로 설치 (웹훅 비활성화 옵션) kubectl create namespace ingress-nginx helm install nginx-ingress ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --set controller.admissionWebhooks.enabled=false
  3. 웹훅 수동 구성:
    • 웹훅 설정이 올바른 서비스와 네임스페이스를 가리키도록 수정할 수도 있습니다.

 

Validating Webhook이란?

  • 검증 웹훅(Validating Webhook): Kubernetes의 동적 어드미션 컨트롤 기능으로, 리소스 생성/수정 시 외부 서비스를 호출하여 검증합니다.
  • Ingress 컨트롤러 웹훅: Ingress 리소스의 올바른 구성을 검증하는 역할을 합니다.
  • 서비스 참조: 웹훅 설정은 특정 서비스 엔드포인트를 참조하며, 이 서비스가 없으면 검증에 실패합니다.

Kubernetes는 리소스의 무결성과 보안을 위해 웹훅 검증을 사용합니다. 검증 웹훅을 삭제하면 기능적으로는 문제가 없으나, 잘못된 구성의 Ingress 리소스가 생성될 가능성이 있습니다. 그러나 대부분의 기본 Ingress 설정에서는 문제가 발생하지 않으므로 임시 해결책으로 적합합니다.

실무 환경에서는 웹훅 검증이 올바르게 작동하도록 설정하는 것이 권장되지만, 테스트 환경이나 빠른 해결이 필요한 상황에서는 웹훅을 제거하는 것이 실용적인 해결책입니다.

profile

영기

@yeongki0944

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그