작성
·
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.41
에80: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
0
안녕하세요 나뭇잎님
강사 최일선입니다.
kubectl get node -o wide 명령을 사용해 노드의 ip를 확인하시고
앞서 확인하신 포트 번호인 30450포를 사용하여 접속하셔야 합니다.
127.0.0.1:30450 대신에 노드 ip를 써보시고 알려주시면 좋을것 같습니다.
인그레스의 클러스터ip는 iptables 정책에 의해서 접속되기 때문에 80포트를 사용하시면 됩니다~
인그레스의 ip는 별도로 할당받으신것으로 보이는데 베어메탈lb 같은것을 쓰셔서 할당받으신걸까요? 그래서 노드의 ip와 동일한 기능을 수행하는 ip를 할당 받으신것 같습니다.
정확한 상태를 알 수 없어서 일단 주어진 정보에서 추정했는데 시도해보시고 추가 질문 남겨주시면 감사하겠습니다~
안녕하세요 나뭇잎님
추가 작성된 내용을 지금에서야 봤네요. 늦어서 죄송합니다.
마스터 노드의 127.0.0.1:노드 포트로 접속하면 접속이 안된다고 하시는 것 같습니다.
촬영 시의 버전과 다르게 최근 버전에서는 127.0.0.1로 하면 접속이 안되는 케이스가 생겼더라구요. 아무래도 프록시로 패킷을 전달하는 방식이 바뀌어서 그런 것 같습니다. 과거 버전에서는 kube-proxy가 직접 포트를 노출했는데 이제는 iptables를 사용하여 OS 정책으로 kube-proxy에 트래픽을 전달합니다.
그래서 127.0.0.1로 요청을 하면 OS 정책에 해당사항이 없어서 통신이 안되는 것 같습니다. 이렇게 소소한 부분들이 변경이 되었는데 시간이 되는데로 영상은 변경할 수 있도록 하겠습니다.
감사합니다.