Raspberry pi

[삽질의 추억] K8s ingress-nginx를 설치했는데 controller가 떠있는 노드에서만 접근이 된다면...

[혜안] 2023. 10. 22. 21:25
728x90

뭔가 너무 편하게 해놓으면 바보가 되는게 맞다.

라즈베리파이에 K8s를 셋팅하고나서, 점점 이것저것 서비스들이 추가되다보니 ingress로 통합하고 싶어졌다.

그래서 그냥 구글링으로 ingress를 설치했는데,

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml

이렇게만 하면 걍 무지성으로 ingress가 설치된다.

 

됐구나 싶어 여기에 서비스 연결을 했는데,

어라?

라즈베리파이가 3개인데 이중에 1개로만 접근이 된다.

뭔말이고 하니,

라즈베리파이 2,3,4가 있는데, 

ingress-controller를 설치했으니, 가령 ingress http 포트를 30080이라고 했다면,

라즈베리파이 2,3,4 어디로든 30080으로 접근하면 서비스가 되어야 한다.

그런데,

실제로 ingress-controller Pod가 떠있는 라즈베리파이 4로 지정해줘야만 서비스가 되는 것...

 

아 이거 뭔가 K8s 버그구나, kube-proxy가 맛이 갔구나 했는데,

.

.

.

결론은 내가 맛이 간거였다.

 

자동으로 설치된 ingress-nginx에 아래 설정 2가지를 바꿔줘야 한다.

#type: LoadBalancer
type: NodePort

#externalTrafficPolicy: Local
externalTrafficPolicy: Cluster

 

집에 라즈베리파이 3개 묶어놨는데 LB가 있을리가 없잖은가?

그리고,

서비스를 NodePort로 생성할때에 externalTrafficPolicy는 Cluster가 기본이지만,

ingress-nginx는 Local로 설정이 되어 있다.

Local로 했을 경우 실제 Pod가 떠있는 노드의 포트만 열려있게 된다.

ingress-nginx가 Local로 설정된 이유는 생각해보면 당연하다.

LoadBalancer type 으로 생성하면 LoadBalancer가 모든 노드의 해당 포트를 감시므로 

Pod가 실제로 떠있는 노드로만 트래픽을 보낼 수 있다.

그러면 NodePort의 고민거리인 불필요한 홉을 줄일 수 있고,

또 SNAT가 되지 않으니 nginx에서도 Client  IP를 식별할 수 있게 된다.

여러가지 장점이 있으니 Local로 지정한거다.

 

이걸 무지성으로 그냥 쓰려고 했고, 또 왜 이런지 전혀 감을 잡을 수 없었다니,

역시 사람은 너무 편하면 바보가 된다.

728x90