본문 바로가기
kubenetes

minikube service web에서 접속하는 방법

by kyeongseo.oh 2022. 3. 16.

minikube를 통해 web service를 올리면 curl은 되는 데 web에서 접근이 안되는 요상한 이슈가 발생했다.

분명 kubernetes에서 동일한 서비스를 올릴 때는 web에서 잘 접근됐는 데 minikube에서는 web으로 도저히 접속이

안 된다.

 

일주일 가량 뻘짓을 한 후 드디어 해결책을 찾았음

1.  kubectl proxy를 실행해준다.

kubectl proxy에 대한 공식문서 상 설명은 아래와 같음

사용자의 데스크탑이나 파드 안에서 실행한다.
로컬 호스트 주소에서 쿠버네티스의 API 서버로 프락시한다.
클라이언트로 프락시는 HTTP를 사용한다.
API 서버로 프락시는 HTTPS를 사용한다.
API 서버를 찾는다.
인증 헤더를 추가한다.

 

기본으로 foreground로 실행되기에 그냥 돌리면 터미널을 하나 더 띄어야된다.

백그라운드로 실행해준다.

kubectl proxy --address 0.0.0.0 --port 30001 --accept-hosts='^*$' >/dev/null 2>&1 &

 

2. minikube tunnel를 실행해준다.

kubectl proxy로 끝이 아니었다. 걍 minikube를 안 쓰고 k8s 쓰는 게 속 편할 듯 함

공식문서의 minikube tunnel 설명은 아래와 같음

클러스터의 IP 주소를 게이트웨이로 사용하여 클러스터의 서비스 CIDR에 대한 호스트의 
네트워크 경로를 생성하는 프로세스로 실행됩니다.
tunnel 명령은 호스트 운영 체제에서 실행 중인 모든 프로그램에 외부 IP를 직접 노출합니다.

 

터미널에서 일단 실행해본다.

password를 입력해야 실행이 된다. foregroud로 돌아서 계속 status를 출력한다. 

services: [hello-node, hello-node2, testweb]는 테스트로 expose한 서비스들이다. 

서비스를 추가할 때마다 리스트에 하나씩 추가된다.

[ddadmin@edge ~]$ minikube tunnel
[sudo] password for ddadmin:
Status:
        machine: minikube
        pid: 2760654
        route: 10.96.0.0/12 -> 192.168.49.2
        minikube: Running
        services: [hello-node, hello-node2, testweb]
    errors:
                minikube: no errors
                router: no errors
                loadbalancer emulator: no errors
Status:
        machine: minikube
        pid: 2760654
        route: 10.96.0.0/12 -> 192.168.49.2
        minikube: Running
        services: [hello-node, hello-node2, testweb]
    errors:
                minikube: no errors
                router: no errors
                loadbalancer emulator: no errors
Status:
        machine: minikube
        pid: 2760654
        route: 10.96.0.0/12 -> 192.168.49.2
        minikube: Running
        services: [hello-node, hello-node2, testweb]
    errors:
                minikube: no errors
                router: no errors
                loadbalancer emulator: no errors

 

minikube를 왜 그런지 모르겠는 데 dashboard부터 시작해서 왠만한 건 다 foreground로 실행된다.

모니터링 할 예정이면 좋겠지만, 충분히 봤으니 백그라운드로 실행하도록 한다.

참고로 ctrl+c로 종료할 때도 password를 입력해야한다.

 

minikube tunnel을 백그라운드로 실행한다.

minikube tunnel >/dev/null 2>&1 &

 

3. 서비스를 추가한다.

# hello-app:1.0 이미지를 사용해 deploy를 하나 추가해준다.
[ddadmin@edge ~]$ kubectl create deployment testweb --image=gcr.io/google-samples/hello-app:1.0
deployment.apps/testweb created

#testweb deploy를 외부에서 접속할 수 있게 LoadBalancer 타입으로 서비스를 하나 생성한다.
[ddadmin@edge ~]$ kubectl expose deployment testweb --type=LoadBalancer --port=8081
service/testweb exposed

 

서비스가 잘 올라갔는 지 확인해본다.

[ddadmin@edge ~]$ kubectl get svc
NAME          TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
hello-node    LoadBalancer   10.106.175.19    10.106.175.19    8080:32399/TCP   86m
hello-node2   LoadBalancer   10.108.29.71     10.108.29.71     8082:32244/TCP   84m
kubernetes    ClusterIP      10.96.0.1        <none>           443/TCP          107m
testweb       LoadBalancer   10.101.198.131   10.101.198.131   8080:30793/TCP   107m

 

curl이 잘 날라가는 지 확인해보도록 한다.

1. CLUSTER-IP:targetPort

pod의 cluster-ip와 targetPort를 통해 curl을 날린다.

[ddadmin@edge ~]$ curl 10.101.198.131:8080
Hello, world!
Version: 1.0.0
Hostname: testweb-9f59cfbd8-pwkkc

 

2. minikube-ip:nodePort

minikube ip를 통해 minikube ip를 확인한 다음 nodePort를 붙여 curl을 날려봄

[ddadmin@edge ~]$ minikube ip
192.168.49.2

[ddadmin@edge ~]$ curl 192.168.49.2:30793
Hello, world!
Version: 1.0.0
Hostname: testweb-9f59cfbd8-pwkkc

 

3. minikube service service-name --url

2번과 동일한 url을 minikube command를 통해 얻을 수 있음

[ddadmin@edge ~]$ minikube service testweb --url
http://192.168.49.2:30793
[ddadmin@edge ~]$ curl http://192.168.49.2:30793
Hello, world!
Version: 1.0.0
Hostname: testweb-9f59cfbd8-pwkkc

 

4. web minikube web service에 접속한다.

curl로는 결과가 잘 오는 것을 확인했으니 web에서의 접속을 확인해본다.

 

url format은 다음과 같음

http://<PROXY_HOST>:<PROXY_PORT>/api/v1/namespaces/<NAMESPACE>/services/http[s]:<SERVICE_NAME>:[<SERVICE_PORT>]/proxy/

 

 

172.30.1.142는 minikube를 설치한 서버의 ip이고 포트 30001은 kubectl proxy에서 --port 옵션으로 설정한 값임

namespace는 별도 옵션을 안줬기 때문에 default. 만약 namespace를 변경했다면 해당 namespace로 변경한다.

port는 nodePort가 아닌 targetPort를 줘야 되는 것 같음

http://172.30.1.142:30001/api/v1/namespaces/default/services/http:testweb:8080/proxy/

 

chrome에서 접속하니 curl과 동일한 화면이 출력된다.

 

web 화면

 


  • ISSUE

kubectl get svc로 서비스 목록들의 port를 보면 targetPort가 전부 8080인 것을 볼 수 있다.

8080이 아닌 다른 포트를 쓰고 싶었지만 8080이 아닌 다른 포트를 targetPort로 사용하면 connection refused가

발생한다.

원인 파악이 필요함.

[ddadmin@edge ~]$ kubectl get svc
NAME          TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
hello-node    LoadBalancer   10.106.175.19    10.106.175.19    8080:32399/TCP   86m
hello-node2   LoadBalancer   10.108.29.71     10.108.29.71     8082:32244/TCP   84m
kubernetes    ClusterIP      10.96.0.1        <none>           443/TCP          107m
testweb       LoadBalancer   10.101.198.131   10.101.198.131   8080:30793/TCP   107m

 

  • TODO

접속 url이 너무 길다. ingress를 통해 url을 깔쌈하게 바꿔봐야겠음

k8s로 올리면 172.30.1.142:30793으로 접속하면 바로 web ui가 뜨는 데 minikube도 이게 되는 지.. 확인이 좀 더 필요할 듯

'kubenetes' 카테고리의 다른 글

kubernetes dashboard login skip하는 방법  (0) 2022.03.20
kubernetes dashboard 설치  (0) 2022.03.20
kubernetes 설치  (0) 2022.03.19
minikube dashboard 활성화, 접속 방법  (1) 2022.03.13
minikube 클러스터 설치  (0) 2022.03.13

댓글