TroubleShooting/Kubernetes

Traefik에서 대량으로 포트 오픈 시 발생한 이슈

IT록흐 2025. 8. 7. 13:13
반응형

 

이슈사항 

 

Kubernetes Ingress Controller로 Traefik을 사용하고 있다.

Traefik 로드밸런서에 MetalLB로 외부 ip를 부여하고 EntryPoint을 등록해서 Port를 열려고 하는데 문제가 하나 발생했다.

 

단일한 포트 몇 개 여는데는 문제가 없으나 특정 범위의 포트를 일괄 개방하려니, Traefik에서 해당 기능을 지원하지 않았다. 그래서 파이썬 코드를 작성하여  특정 범위의 포트를 모두 단일 포트로 Traefik Helm의 values.yaml에 직접 넣어주었더니... values.yaml 이 거대해짐에 따라 여러가지 문제가 발생하였다. 

 

결론부터 말하면

이슈가 여러 개 발생하여, 결국 만 개에서 7천개 정도로 개방할 포트 수를 줄여서 임시방편으로 문제를 해결하였다. 내가 만난 이슈는 다음과 같다. 

 

1. NodePort가 부족하다. 

Ingress LB의 포트는 NodePort와 매핑되는데, 노드포트가 30000-32767 로 디폴트 설정이 되어있었다. 만 개 이상의 포트를 열어주어야 하므로  kube-apiserver.yaml에 설정을 변경해 노드포트 범위를 늘려주었다. 

 

 

/etc/kubernetes/manifests/kube-apiserver.yaml

apiVersion: v1
kind: Pod
metadata:
  #중략...
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
	# 중략...
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    - --service-node-port-range=30000-50000 # node-port 범위 추가

 

 

 

2. Helm Secret 크기 초과 

 

Helm은 배포대상에 대한 릴리즈 정보를 K8S에 secret으로 생성해서 관리한다.

 

예시)

 

 

릴리즈 정보에 values.yaml 정보도 들어가는데, k8s secret 크기 제한이 있다보니 크기가 큰 values.yaml 정보가 담긴 secret을 생성하지 못하였다.

 

secret의 크기를 늘릴수 없으니 배포 플랫폼을 ArgoCD로 변경하여 해결하였다. 

 

 

3. annotation 크기 초과 

 

argocd로 배포하니 secret 크기 초과 이슈는 발생하지 않았지만 annotation 크기 초과 이슈가 발생하였다. Kubernetes 오브젝트는 256kb 고정된 어노테이션 크기 제한이 있기 때문이다. 

one or more objects failed to apply, reason: error when patching "/dev/shm/835636613": Timeout: request did not complete within requested timeout - context deadline exceeded,error when patching "/dev/shm/3327891598": 
Deployment.apps "traefik" is invalid: metadata.annotations: Too long: may not be more than 262144 bytes

 

 

어노테이션 크기가 커지는 이유는 kubectl.kubernetes.io/last-applied-configuration 어노테이션 때문이다. 

 

ArgoCD는 Client Side Apply 방식으로 배포를 하는데, 해당 방식은 yaml 파일 전체 스냅샷을 kubectl.kubernetes.io/last-applied-configuration 에 저장하여 오브젝트를 배포한다. port의 개수가 많아져 yaml 크기가 커졌고 어노테이션 크기도 커지니 어노테이션 크기 초과 이슈가 발생한 것이다. 

 

Argocd의 traefik app 배포시, Server Side Apply  방식으로 배포하도록 설정을 변경하여 이슈를 해결하였다. CSA와 SSA의 차이는 나중에 포스팅으로 정리할 예정이다.  

 

kubectl edit application traefik -n argocd

 

 

4. etcd 서버의 최대 요청 크기 초과 이슈

 

etcdserver: request is too large

 

이번에는 etcd 서버에 요청 크기 초과 이슈가 발생하였다. 1.5MiB가 디폴트라고 한다.  

helm template traefik ./traefik -f ./traefik/values.yaml > output.yaml
wc -c output.yaml

 

위 명령어로 계산하면 2526456 Bytes 정도이니 3MiB로 늘려줘야 한다.  

 

apiVersion: v1
kind: Pod
metadata:
 # 중략 ....
  name: etcd
  namespace: kube-system
spec:
  containers:
  - command:
    - etcd
 # 중략 ...
    - --max-request-bytes=3145728 # 크기 3MiB로 늘리기

 

 

5. args 크기 초과 이슈

 

etcd 설정까지 수정해주니 ArgoCD로 배포는 되었다. 그러나 Pod 생성중에 오류가 발생하였는데 로그를 확인해보니 args 크기가 너무 큰 게 원인이었다. 

 

exec /entrypoint.sh: argument list too long

 

 

entrypoint의 설정들을 모두 args로 넘기다보니 그런건데, arg의 크기는 커널로 고정되어 있는 부분이라 확장이 불가능하다. 

 

root@test-205:/# getconf ARG_MAX
2097152

 

 

이 부분은 해결하지 못했다. args 부분을 configmap으로 만들어 볼륨마운트 해볼 생각을 해보았지만 그러면 Traefik의 Helm Template을 너무 많이 수정해야 하고 configMap도 크기 제한이 있다보니 이래저래 수정할 부분이 많았다. 그래서 기존의 포트 만 개정도에서 7천개 정도로 줄여 ARG 크기 자체를 줄이는 방안으로 해결해보았다. 완전한 해결책이 아니므로 Traefik의 Helm Template을 수정하는 방향을 따로 고민해봐야 겠다. 

 

 

 

참고자료

https://www.arthurkoziel.com/fixing-argocd-crd-too-long-error/

https://www.baeldung.com/linux/argument-list-too-long-error

반응형