[삽질의 추억] K8s ingress-nginx를 설치했는데 controller가 떠있는 노드에서만 접근이 된다면...
뭔가 너무 편하게 해놓으면 바보가 되는게 맞다.
라즈베리파이에 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로 지정한거다.
이걸 무지성으로 그냥 쓰려고 했고, 또 왜 이런지 전혀 감을 잡을 수 없었다니,
역시 사람은 너무 편하면 바보가 된다.