본문 바로가기

개발하자

쿠버네티스에서 서비스의 URL을 찾는 방법은?

반응형

쿠버네티스에서 서비스의 URL을 찾는 방법은?

로컬 도커 데스크톱에 로컬 쿠버네티스 클러스터가 있습니다.

이것은 내가 할 때 내 쿠버네티스 서비스의 모습이다

Name:              helloworldsvc
Namespace:         test
Labels:            app=helloworldsvc
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"helloworldsvc"},"name":"helloworldsvc","namespace":"test...
Selector:          app=helloworldapp
Type:              ClusterIP
IP:                10.108.182.240
Port:              http  9111/TCP
TargetPort:        80/TCP
Endpoints:         10.1.0.28:80
Session Affinity:  None
Events:            <none>

이 서비스는 웹 앱이 있는 배포를 가리킵니다.

이 서비스의 URL을 찾는 방법에 대한 질문입니다? 나는 이미 http://localhost:9111/을 시도했지만 작동하지 않았다.

이 서비스가 가리키는 포드가 작동 중임을 확인했습니다.




생성한 서비스가 클러스터 유형입니다클러스터 내부에서만 액세스할 수 있는 IP입니다. 데스크톱에서 액세스하는 방법은 두 가지가 있습니다:

  1. 유형 서비스를 만든 다음 다음을 통해 액세스합니다

  2. Kubectl을 사용하고 다음을 통해 액세스합니다




서비스 URL은 다음 형식입니다:

<service-name>.<namespace>.svc.cluster.local:<service-port>

당신의 경우는 다음과 같습니다:

helloworldsvc.test.svc.cluster.local:9111



서비스 이름 가져오기:

kubernetes 서비스에 대한 URL은 여기서 은 kubernetes 클러스터 이름입니다.

클러스터 이름을 가져오려면:

당신의 경우에 서비스를 제공하기 위해서는

당신이 하려고 하는 방법은 당신의 로컬 호스트에서 그것을 이용할 수 있도록 하는 것과 같이 작동하지 않을 것이다. 당신은 서비스를 쿠벡틀을 사용하거나 사용할 수 있도록 해야 한다.

그러나 노드 포트를 원하지 않고 컨테이너 내부에서 모든 것이 정상적으로 작동하는지 확인하려면 다음 단계를 수행하여 셸이 있는 경우 컨테이너 내부로 들어갑니다.

kubectl exec -it container-name -n its-namespace-name sh

그리고 나서 하다

또는

그러나 두 curl 명령은 모두 Kubernetes pod 내부에서만 작동하며 로컬 호스트 시스템에서는 작동하지 않습니다.

호스트 시스템에서 액세스하려면




작업 중인 경우 아래 코드를 실행할 수 있습니다

minikube service --all

enter image description here

특정 서비스를 위해


minikube service service-name --url

enter image description here




다음은 서비스 URL을 얻는 다른 방법입니다

하나의 포드 입력

kubectl exec -it podName -n namespace -- /bin/sh

그런 다음 포드에서와 같이 실행합니다

/ # nslookup 172.20.2.213
nslookup: can't resolve '(null)': Name does not resolve

Name:      172.20.2.213
Address 1: 172.20.2.213 172-20-2-213.servicename.namespace.svc.cluster.local

또는 포드에서 실행합니다

/ # nslookup servicename
nslookup: can't resolve '(null)': Name does not resolve

Name:      172.20.2.213
Address 1: 172.20.2.213 172-20-2-213.servicename.namespace.svc.cluster.local

이제 의 출력에 대한 IP를 제거한 후 서비스 URL이 서비스 포트에 첨부됩니다.




동일한 클러스터에 있고 동일한 네임스페이스에 있을 때 다음과 같은 변형이 적용되었습니다(namespace: 서비스가 서로 다른 네임스페이스에 있을 때는 처음을 제외한 모든 버전이 계속 작동합니다):

http://helloworldsvc
http://helloworldsvc.default
http://helloworldsvc.default.svc
http://helloworldsvc.default.svc.cluster.local
http://helloworldsvc.default.svc.cluster.local:80

//

using HttpClient client = new();
string result = await client.GetStringAsync(url);

주의:

  • ASP와 통화 중입니다.NET 6 응용 프로그램 사용
  • 그 클라이언트는 기본적으로 포트를 80으로 설정하기 때문에 포트를 명시적으로 설정할 필요가 없다고 생각합니다. 하지만 이 모든 것에 대해 URL에서 추가하거나 제거할 수 있음을 확인했습니다
  • only(특별하게 구성하지 않은 경우 제외)
  • 네임스페이스는 첫 번째 경우에만 생략할 수 있습니다(즉, 도메인 / '도메인'이 서비스 이름일 경우). 예외적으로 실패합니다



일반적으로 K8s 환경에서 실행되는 도커 기반 컨테이너는 과도한 도구가 제거되지만 포드에 들어가면 다음과 같이 됩니다:

kubectl exec -it <pod-name> -n <namespace> -- /bin/sh

그런 다음 다음 다음과 같이 dns 도메인 이름을 사용합니다:

kafka-0:/$ dnsdomainname
kafka-headless.kafka.svc.cluster.local

반응형