이전 상황
제가 운영하는 EKS에서 간헐적으로 pod간 통신이 안되는 증상이 있었습니다. 원인을 찾아보니 VPC CNI의 network policy기능에서 pod간 통신이 안되는 버그를 만났습니다. 패치버전이 있지만 계속 버그 이슈가 있어, 고민 끝에 network policy를 당분간 사용하지 않기로 했습니다. 쿠버네티스 네트워크 통신이 불안정하면 서비스 품질에 영향이 있기 때문입니다.
장애 재현은 저의 유투브를 참고하시면 됩니다.
버그 설명
VPC CNI는 bpf를 사용하여 network policy네트워크 기능을 구현했습니다. 리눅스 conntrack 기능을 자체 구현한 것으로 보이는데 일정확률로 conntrack을 업데이트하지 못하는 상황이 발생합니다. github issue에서 올라온 설명으로는 버그가 발생한 이유를 race condition라고 표현합니다.
- github issue: https://github.com/aws/aws-network-policy-agent/pull/179
마주쳤던 오류
기존 실행중인 network policy를 전부 삭제한 후 VPC CNI network policy를 false처리하여 비활성화 하였습니다. 그런데, VPC CNI pod가 실행이 되지 않았습니다.
$ kubectl -n kube-system get pod
aws-node-xxxxx 1/2 CrashLoopBackOff
VPC CNI pod로그를 확인해보니 메모리 참조 오류가 발생했습니다.
$ kubectl -n kube-system logs -f {aws-node pod이름}
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x28 pc=0x55f8874b0347]
다행히 저랑 같은 이슈를 겪으신 분이 github issue에 질문을 주셨습니다. 그리고 VPC CNI 컨트리뷰터가 직접 해결방법을 답변 달아줬습니다. 컨트리뷰터는 모든 network policy를 삭제하면 VPC CNI pod 실행 오류가 해결될거라고 답변을 주었습니다.
- github issue: https://github.com/aws/amazon-vpc-cni-k8s/issues/2562#issuecomment-1717843553
저는 network policy를 전부 삭제한 줄 알았는데, 다시 조회해보니 삭제 안된 것이 있었습니다.
$ kubectl get networkpolicy -A
...
network policy를 전부 삭제하니 VPC CNI pod 정상으로 실행되었습니다.
참고자료
1. VPC CNI network policy 버그 내용: https://github.com/aws/aws-network-policy-agent/pull/179
2. VPC CNI panic error: https://github.com/aws/amazon-vpc-cni-k8s/issues/2562#issuecomment-1717843553
이하공백
'전공영역 공부 기록' 카테고리의 다른 글
ansible playbook에서 AWS Secret 값을 가져오는 방법 (0) | 2024.07.16 |
---|---|
harbor저장소에 docker login할 때 발생하는 오류 (0) | 2024.07.16 |
Pod 안정성을 높이는 쿠버네티스 설정 (33) | 2024.07.06 |
EKS upgrade in-place방식에서 가장 걱정했던 것 (3) | 2024.07.01 |
karpenter on-demand:ratio 분배 설정 (3) | 2024.06.22 |