인프런 커뮤니티 질문&답변

나뭇잎님의 프로필 이미지

작성한 질문수

데브옵스(DevOps)를 위한 쿠버네티스 마스터

인그레스(ingress) 실습

섹션6:인그레스(ingress) 실습 - 인그레스 통한 접속 시 IP 문제

작성

·

1.2K

·

수정됨

2

  • 강의 : 섹션6:인그레스(ingress) 실습

  • 위치 : 7분 43초 경


안녕하세요.

인그레스 서비스를 올린 후, curl 통해서 접속 테스트 시에 127.0.0.1 이 아니라 인그레스 IP로 직접 curl을 해야 접속이 됩니다.

  • 실행 ❌ : curl 127.0.0.1:{인그레스 PORT}

  • 실행 ⭕ : curl {인그레스 IP}:{인그레스 PORT}

아래는 인그레스 정보입니다.

root@master0:/home/user01# kubectl get ing
NAME              CLASS    HOSTS   ADDRESS          PORTS   AGE
http-go-ingress   <none>   *       192.168.32.134   80      17h

root@master0:/home/user01# kubectl get all -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-s4j5j        0/1     Completed   0          14h
pod/ingress-nginx-admission-patch-f9jwd         0/1     Completed   0          14h
pod/ingress-nginx-controller-6b58ffdc97-9d9hd   1/1     Running     0          14h

NAME                                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.97.10.247   <none>        80:30450/TCP,443:30058/TCP   14h
service/ingress-nginx-controller-admission   ClusterIP   10.106.36.94   <none>        443/TCP                      14h

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           14h

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-6b58ffdc97   1         1         1       14h

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           5s         14h
job.batch/ingress-nginx-admission-patch    1/1           7s         14h
root@master0:/home/user01# curl 192.168.32.134:30450
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

root@master0:/home/user01# curl 192.168.32.134:30450/welcome/test
Welcome! http-go-56686cfd44-7rsch

root@master0:/home/user01# curl 127.0.0.1:30450/welcome/test
curl: (7) Failed to connect to 127.0.0.1 port 30450: Connection refused

 

실습 명령어는 똑같이 따라했으며, 3번을 반복해도 같은 결과이네요..

'마스터 노드-인그레스 노드' 간의 포트포워딩? 이 되어야 하는건지, 아니면 제가 빠트린 설정이 있는것인지 알고 싶습니다😢

답변 2

1

나뭇잎님의 프로필 이미지
나뭇잎
질문자

인그레스의 ip는 별도로 할당받으신것으로 보이는데 베어메탈lb 같은것을 쓰셔서 할당받으신걸까요? 그래서 노드의 ip와 동일한 기능을 수행하는 ip를 할당 받으신것 같습니다.

==> 별도로 IP를 할당받지는 않았습니다.

자원을 모두 지우고 강의 자료에 명시된 아래 명령어만 사용하였습니다.

kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io ingress-nginx-admission
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: http-go-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /welcome/test
spec:
  rules:
    - http:
        paths:
          - pathType: Exact
            path: /welcome/test
            backend:
              service:
                name: http-go
                port: 
                  number: 80
EOF

일단 말씀주신 kubectl get node -o wide 실행 결과는 아래와 같습니다.

root@master0:/home/user01# kubectl get node -o wide
NAME      STATUS   ROLES           AGE    VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
master0   Ready    control-plane   110d   v1.26.0   192.168.32.133   <none>        Ubuntu 20.04 LTS   5.4.0-26-generic   containerd://1.6.12
node0     Ready    <none>          110d   v1.26.0   192.168.32.134   <none>        Ubuntu 20.04 LTS   5.4.0-26-generic   containerd://1.6.12
node1     Ready    <none>          110d   v1.26.0   192.168.32.135   <none>        Ubuntu 20.04 LTS   5.4.0-26-generic   containerd://1.6.12

 

기타 명령어 결과는 아래와 같습니다.

root@master0:/home/user01# kubectl get ing -o wide
NAME              CLASS    HOSTS   ADDRESS          PORTS   AGE
http-go-ingress   <none>   *       192.168.32.135   80      9m48s
root@master0:/home/user01# kubectl get ing -o yaml
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"networking.k8s.io/v1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx","nginx.ingress.kubernetes.io/rewrite-target":"/welcome/test"},"name":"http-go-ingress","namespace":"default"},"spec":{"rules":[{"http":{"paths":[{"backend":{"service":{"name":"http-go","port":{"number":80}}},"path":"/welcome/test","pathType":"Exact"}]}}]}}
      kubernetes.io/ingress.class: nginx
      nginx.ingress.kubernetes.io/rewrite-target: /welcome/test
    creationTimestamp: "2023-05-02T21:44:34Z"
    generation: 1
    name: http-go-ingress
    namespace: default
    resourceVersion: "233537"
    uid: 0d9ab748-f44c-4f27-9b49-286bf7a07583
  spec:
    rules:
    - http:
        paths:
        - backend:
            service:
              name: http-go
              port:
                number: 80
          path: /welcome/test
          pathType: Exact
  status:
    loadBalancer:
      ingress:
      - ip: 192.168.32.135
kind: List
metadata:
  resourceVersion: ""
root@master0:/home/user01# kubectl get all
NAME                           READY   STATUS    RESTARTS   AGE
pod/http-go-56686cfd44-r2h2w   1/1     Running   0          15m

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/http-go      ClusterIP   10.111.165.210   <none>        80/TCP    15m
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   19m

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/http-go   1/1     1            1           15m

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/http-go-56686cfd44   1         1         1       15m

-----

root@master0:/home/user01# kubectl get all -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-vn94g        0/1     Completed   0          14m
pod/ingress-nginx-admission-patch-wdds2         0/1     Completed   0          14m
pod/ingress-nginx-controller-6b58ffdc97-kgnwm   1/1     Running     0          14m

NAME                                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.111.219.190   <none>        80:32022/TCP,443:31308/TCP   14m
service/ingress-nginx-controller-admission   ClusterIP   10.101.105.172   <none>        443/TCP                      14m

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           14m

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-6b58ffdc97   1         1         1       14m

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           6s         14m
job.batch/ingress-nginx-admission-patch    1/1           5s         14m

 

노드 IP를 이용한 결과는 아래와 같습니다.

root@master0:/home/user01# curl 192.168.32.135:32022
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

-----

root@master0:/home/user01# curl 192.168.32.135:32022/welcome/test
Welcome! http-go-56686cfd44-r2h2w

-----

root@master0:/home/user01# curl 192.168.32.135:80
curl: (7) Failed to connect to 192.168.32.135 port 80: Connection refused

root@master0:/home/user01# curl 192.168.32.135:80/welcome/test
curl: (7) Failed to connect to 192.168.32.135 port 80: Connection refused

-----

# 아래는 인그레스 클러스터 IP로의 접속 시도 입니다.

root@master0:/home/user01# curl -v 10.111.219.190:80/welcome/test
*   Trying 10.111.219.190:80...
* TCP_NODELAY set
* connect to 10.111.219.190 port 80 failed: Connection refused
* Failed to connect to 10.111.219.190 port 80: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 10.111.219.190 port 80: Connection refused

root@master0:/home/user01# curl -v 10.111.219.190:32022/welcome/test
*   Trying 10.111.219.190:32022...
* TCP_NODELAY set
* connect to 10.111.219.190 port 32022 failed: Connection refused
* Failed to connect to 10.111.219.190 port 32022: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 10.111.219.190 port 32022: Connection refused

 


위 질문에서 제가 잘못 표기했던 부분이 있네요ㅜ

죄송합니다.

  • 실행 ❌ : curl 127.0.0.1:{ingress-nginx-controller NodePort의 PORT}

  • 실행 ⭕ : curl {인그레스 노드 IP}:{ingress-nginx-controller NodePort의 PORT}


제가 궁금했던 부분은

영상에서는 kubectl get ing 에서 인그레스 노드 IP가 192.168.154.156 이고,

kubectl get all -n ingress-nginx 에서 ingress-nginx-controller의 IP가 10.103.171.4180:30921 포트가 할당된 상태입니다.

여기서 curl 127.0.0.1:30921/welcome/test 명령을 실행했을때 정상적으로 인그레스를 거쳐 서비스의 응답을 받는 것을 확인했는데요,

저는 루프백 127.0.0.1:{ingress-nginx-controller의 port로 요청을 보내도 연결 자체가 되지 않는게 왜 그런것인지 궁금합니다..ㅜ

영상에서는 인그레스 노드의 IP가 마스터 노드와 같은 IP를 가진 것도 아닌데, 루프백 주소를 쓰신 것이 이해가 가지 않습니다, 제가 빠트린 개념이 있을까요...?

아래는 127.0.0.1로의 요청입니다.

root@master0:/home/user01# curl -v 127.0.0.1:32022
*   Trying 127.0.0.1:32022...
* TCP_NODELAY set
* connect to 127.0.0.1 port 32022 failed: Connection refused
* Failed to connect to 127.0.0.1 port 32022: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 127.0.0.1 port 32022: Connection refused

-----

root@master0:/home/user01# curl -v 127.0.0.1:32022/welcome/test
*   Trying 127.0.0.1:32022...
* TCP_NODELAY set
* connect to 127.0.0.1 port 32022 failed: Connection refused
* Failed to connect to 127.0.0.1 port 32022: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 127.0.0.1 port 32022: Connection refused

-----

#인그레스 서비스 정보입니다.

root@master0:/home/user01# kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.111.219.190   <none>        80:32022/TCP,443:31308/TCP   42m
ingress-nginx-controller-admission   ClusterIP   10.101.105.172   <none>        443/TCP                      42m

 

안녕하세요 나뭇잎님

추가 작성된 내용을 지금에서야 봤네요. 늦어서 죄송합니다.

마스터 노드의 127.0.0.1:노드 포트로 접속하면 접속이 안된다고 하시는 것 같습니다.

촬영 시의 버전과 다르게 최근 버전에서는 127.0.0.1로 하면 접속이 안되는 케이스가 생겼더라구요. 아무래도 프록시로 패킷을 전달하는 방식이 바뀌어서 그런 것 같습니다. 과거 버전에서는 kube-proxy가 직접 포트를 노출했는데 이제는 iptables를 사용하여 OS 정책으로 kube-proxy에 트래픽을 전달합니다.

그래서 127.0.0.1로 요청을 하면 OS 정책에 해당사항이 없어서 통신이 안되는 것 같습니다. 이렇게 소소한 부분들이 변경이 되었는데 시간이 되는데로 영상은 변경할 수 있도록 하겠습니다.

감사합니다.

0

안녕하세요 나뭇잎님

강사 최일선입니다.

kubectl get node -o wide 명령을 사용해 노드의 ip를 확인하시고

앞서 확인하신 포트 번호인 30450포를 사용하여 접속하셔야 합니다.

127.0.0.1:30450 대신에 노드 ip를 써보시고 알려주시면 좋을것 같습니다.

인그레스의 클러스터ip는 iptables 정책에 의해서 접속되기 때문에 80포트를 사용하시면 됩니다~

인그레스의 ip는 별도로 할당받으신것으로 보이는데 베어메탈lb 같은것을 쓰셔서 할당받으신걸까요? 그래서 노드의 ip와 동일한 기능을 수행하는 ip를 할당 받으신것 같습니다.

정확한 상태를 알 수 없어서 일단 주어진 정보에서 추정했는데 시도해보시고 추가 질문 남겨주시면 감사하겠습니다~