[k8s] Ingress 컨트롤러 구성 - 트러블슈팅
Ingress 컨트롤러 를 Ingress-Nginx로 구성해보는 실습 중에 발생한 이슈에 대해 원인과 해결을 공유하고자 합니다.
사건 발단
강의에서는 Ingress-Nginx 버전 v0.47.0 으로 진행하여 인그레스 컨트롤러를 구성했습니다.
하지만 저의 k8s 에서는 "ingress-nginx-admission-patch" Pod가 자꾸 crashloopbackoff 상태가 되어 버리는 것입니다.
(강의에서와 똑같이 따라해줬을 뿐인데 왜 저만 안될까요?)
문제해결시도
- Ingress-nginx를 삭제하고 재설치해보는 작업
Ingress-Nginx 는 https://github.com/kubernetes/ingress-nginx#support-versions-table 여기서 다운 받을 수 있습니다.
GitHub - kubernetes/ingress-nginx: NGINX Ingress Controller for Kubernetes
NGINX Ingress Controller for Kubernetes. Contribute to kubernetes/ingress-nginx development by creating an account on GitHub.
github.com
- crashloopbackoff 상태인 노드에 접속하여 도커 이미지를 다시 받아보는 작업
해결이 되지않아 결국 k8s 환경인 vm를 전부 초기화해보고 다시 설치해봤지만 역시 해결되지 않았습니다..
무엇이 문제일까요?
강의가 진행되었던 Ingress-nginx버전은 v0.47.0 버전이였습니다.
아래의 그림에서 확인해보시면 강의에서 진행하는 v0.47.0 의 k8s지원버전은 1.21, 1.20, 1.90 입니다.
어? 하고 바로 k8s 버전을 확인해보니 아니나 다를까 1.23.4 버전이였습니다.
k8s 1.23 버전을 지원하는 Ingress - nginx 버전 중 바로 1.1.2 로 변경하였습니다.
바로 성공하는 모습입니다.
하지만 기쁨도 잠시 바로 다음 고비가 찾아왔습니다.
(Ingress Controller는 Ingress 규칙을 관리하기 위한 서버일 뿐이고, 실제 Ingress 규칙을 생성 해주셔야 합니다)
바로 그 고비는 Ingress 규칙을 생성하는 과정에서 다음과 같은 이슈가 발생하였습니다.
오류를 보면 serviceName, servicePort 필드를 해석할 수 없고 pathType 필드가 없다는 둥 다양한 오류를 내뿜고 있었습니다. 공식문서를 확인해보니 apiversion이 변경되면서 yaml 작성 포맷 또한 제가 작성한 yaml 과는 차이가 있는 것을 확인했습니다.
기존의 작성한 yaml 파일
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foos1
backend:
serviceName: s1
servicePort: 80
- path: /bars2
backend:
serviceName: s2
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: s2
servicePort: 80
제가 작성한 yaml 파일과 공식문서에서 작성한 yaml 과는 pathType 이 추가되었고 backend 부분 정의 방법이 변경되었다는 것을 확인할 수 있었습니다.
ingress yaml 파일 수정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foos1
pathType: Prefix
backend:
service:
name: s1
port:
number: 80
- path: /bars2
pathType: Prefix
backend:
service:
name: s2
port:
number: 80
- host: bar.foo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: s2
port:
number: 80
모두 잘되는 것을 확인할 수 있었습니다.