Kubernetes 서비스 정의에서 targetPort와 포트의 차이점


답변:


81

서비스 : 트래픽을 포드로 보냅니다.

TargetPort : 컨테이너 내에서 애플리케이션이 실행되는 실제 포트입니다.

포트 : 컨테이너 내부의 애플리케이션이 다른 포트에서 다른 서비스를 제공하는 경우가 있습니다.

예 : 실제 애플리케이션을 실행할 수 있으며이 애플리케이션에 8080대한 상태 확인을 8089컨테이너의 포트에서 실행할 수 있습니다 . 따라서 포트없이 서비스를 실행하면 컨테이너의 어느 포트로 요청을 리디렉션해야하는지 알 수 없습니다. 서비스는 컨테이너의 특정 포트에 도달 할 수 있도록 매핑이 있어야합니다.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      nodePort: 30475
      port: 8089
      protocol: TCP
      targetPort: 8080
    - name: metrics
      nodePort: 31261
      port: 5555
      protocol: TCP
      targetPort: 5555
    - name: health
      nodePort: 30013
      port: 8443
      protocol: TCP
      targetPort: 8085 

히트하면 my-service:8089트래픽이 8080컨테이너 (targetPort)로 라우팅됩니다 . 마찬가지로 히트 하면 컨테이너 (targetPort)로 my-service:8443리디렉션됩니다 8085. 그러나 이것은 myservice:8089kubernetes 클러스터 내부에 있으며 한 애플리케이션이 다른 애플리케이션과 통신하려고 할 때 사용할 수 있습니다. 따라서 클러스터 외부에서 서비스를 사용하려면 트래픽이 컨테이너의 포트로 리디렉션되도록 kubernetes가 실행중인 호스트 머신의 포트를 노출해야합니다. 이것은 node port(호스트 머신에 노출 된 포트)입니다. 위의 예에서 다음과 같이 클러스터 외부 (Postman 또는 기타 클라이언트)에서 서비스를 이용할 수 있습니다.host_ip:nodePort

호스트 컴퓨터의 IP는 말 10.10.20.20은하여 HTTP, 측정, 건강 서비스를 칠 수있다 10.10.20.20:30475, 10.10.20.20:31261, 10.10.20.20:30013.

편집 : Raedwald 의견에 따라 편집되었습니다 .


4
허용 port하고 targetPort다른 이점은 무엇입니까 ? 예를 들어 귀하의 health예를 보면 왜 port 8443대신 8085? 기본적으로 targetPort서비스의 모든를 노출하는 대신 두 개의 매개 변수가있는 이유는 무엇입니까?
Dan

안녕하세요 Dan, 8443을 포트 및 대상 포트로 사용할 수 있습니다. 더 나은 설명을 위해 다른 숫자를 사용했습니다.
Manikanta P

응답 해 주셔서 감사합니다. 제 말은 어떤 상황에서 그것들을 다르게 만드는 것이 유용할까요?
Dan

"컨테이너 위를 달리다"는 의미? 컨테이너 내부 의 서버 사용 하는 포트 ? 아니면 컨테이너 외부 의 클라이언트가 사용 하는 포트 ?
Raedwald

Cloud Services에서 10.10.20.20과 같은 호스트 시스템에 대해 고정 IP를 가정 할 수 있습니까? 예 : 다중 노드 배포 상황이있는 Azure AKS?
Jaish Mathews

16

서비스 의 관점에서 생각하면 도움이됩니다 .

  • nodePort: 외부 트래픽이 들어올 노드의 포트
  • port: 이 서비스 의 포트
  • targetPort 트래픽을 전달할 포드의 대상 포트

트래픽이에서 들어오고 서비스 nodePort에서 전달 port된 다음 targetPort포드에서 라우팅됩니다 .

nodePort외부 트래픽에 대한 것 보다 더 강조 할 가치가 있습니다. 서비스에 액세스해야 할 수있는 클러스터의 다른 포드는 서비스에 대한 내부 전용 액세스가 port아닌 nodePort을 사용 합니다.

targetPort설정하지 않으면 기본적으로 port. 예 : 컨테이너 포트를 대상으로하는 80:80서비스 80포트의 경우 80.


4
몇 마디로 질문에 잘 답 해주신 좋은 요약입니다. 감사합니다!
Wolfson

동의하다. 다른 답변이 혼란 스러웠지만이 답변은 못을 박았습니다.
Nikola Malešević

사람들은 port과 의 차이점을 알고 싶어합니다 targetPort. 당신은 정말로 혼란을 해결했습니다.
Ankur Gautam

1
나는 이것이 "그"대답이라고 생각하며 위의 답변은 추가 필드와 더 넓은 주제를 열어 이해하기 어렵게 만듭니다. 건배 julz.
Worp

10

@Manikanta P가 위에 제시 한 대답이 맞습니다. 그러나 처음 읽을 때는 "항구"에 대한 설명이 다소 불분명 할 수 있습니다. 예를 들어 설명하겠습니다.

httpd가 호스팅하는 정적 콘텐츠 (프론트 페이지, 이미지 등)와 바람둥이가 호스팅하는 동적 콘텐츠 (예 : 요청에 대한 응답 등)가 포함 된 웹 애플리케이션을 생각해보십시오. 웹 서버 (또는 정적 콘텐츠)는 포트에서 httpd에 의해 제공되는 80반면 Appserver (또는 동적 콘텐츠)는 포트에서 tomcat에 의해 제공됩니다 8080.

개발자가 원하는 것 : 사용자는 외부에서 Appserver가 아닌 외부에서 웹 서버에 액세스 할 수 있어야합니다.

솔루션 : service.yml에있는 Webserver의 서비스 유형은 NodePort가되고 service.yml에있는 Appserver의 서비스 유형은 ClusterIP가됩니다.

웹 서버의 service.yml 코드 :

spec:
  selector:
    app: Webserver
  type: NodePort        // written to make this service accessible from outside.
  ports:
    - nodePort: 30475   // To access from outside, type <host_IP>:30475 in browser.
      port: 5050        // (ignore for now, I will explain below).
      protocol: TCP
      targetPort: 80  // port where httpd runs inside the webserver pod.

Appserver의 service.yml에 대한 코드

spec:
  selector:
    app: appserver
  type: ClusterIP        // written to make this service NOT accessible from outside.
  ports:
    - port: 5050         // port to access this container internally
      protocol: TCP
      targetPort: 8080   // port where tomcat runs inside the appserver pod.

또한 httpd.conf웹 서버 의 파일에 사용자의 요청을 앱 서버로 리디렉션하는 IP를 작성합니다. 이 IP는 host_IP:5050.

여기서 정확히 무슨 일이 일어나고 있습니까? 사용자는 hostIP:30475웹 서버 페이지를 작성 하고 본다. 이는 포트 80(targetport) 에서 httpd에 의해 제공되기 때문입니다 . 사용자가 버튼을 클릭하면 요청이 이루어집니다. 이 요청은 httpd.conf파일에서 포트 5050가 언급되고 Appserver의 컨테이너와 Webserver의 컨테이너가 내부적으로 통신 하는 포트 이기 때문에 Appserver로 리디렉션됩니다 . appserver가 요청을 받으면 port에서 tomcat이 내부에서 실행되기 때문에 요청을 처리 할 수 8080있습니다.


4
웹 서버 사양이 '포트 : 5050'을 정의하는 이유는 무엇입니까? 내가 올바르게 이해했다면 웹 서버는 appserver : 5050을 호출하지만 반대가 아닙니다 ...?
Everton

1
Everton의 질문 외에도 Tomcat이 포트 5050에서 내부 요청을 처리하는 경우 포트 8080을 열어야하는 이유는 무엇입니까?
Stephen

이 대답은 혼란 스럽습니다. 또한 httpd.conf"httpd.conf 파일에서 포트 5050이 언급 되었기 때문에"위치에 있습니다.
Polymerase

@Polymerase httpd.conf 파일은 시스템에 설치하는 httpd 패키지와 함께 제공됩니다. 구성해야하는 내부 파일입니다. 경로 : /etc/httpd/conf/http.conf
matak8s

@Stephen in tomcat / conf / server.xml, 우리는 tomcat 서비스가 실행될 포트를 지정합니다. 이것은 kubernetes가 해당 포트에서 tomcat 서비스를 가동해야한다는 것을 이해하도록 대상 포트로 작성하는 것과 동일한 포트 번호입니다. 내가 틀렸다면 정정하십시오.
matak8s

1

이 답변은 다른 답변 외에도 Kubernetes의 문서를 참조하는 것입니다.

https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/ :

targetPort: 컨테이너가 트래픽을 허용하는 포트입니다.

port: 추상화 된 서비스 포트이며 다른 포드가 서비스에 액세스하는 데 사용하는 포트 일 수 있습니다.

https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/ :

포드의 포트 정의에는 이름 targetPort이 있으며 서비스 속성 에서 이러한 이름을 참조 할 수 있습니다 . 이는 서로 다른 포트 번호를 통해 동일한 네트워크 프로토콜을 사용할 수있는 단일 구성된 이름을 사용하여 서비스에 혼합 된 포드가있는 경우에도 작동합니다.


간결한 답변 주셔서 감사합니다
Ankur Gautam

1

간단히 말해서

nodeport: nodeip : port의 모든 작업자 노드에서 외부 요청을 수신하고 요청을 port로 전달합니다.

port: 컨테이너에 대한 내부 클러스터 서비스 포트이며 노드 포트에서 들어오는 요청을 수신하고 targetPort로 전달합니다.

targetPort:포트에서 요청을 수신하고 수신중인 컨테이너 pod (port)로 전달합니다. 지정하지 않더라도 기본적으로 포트와 동일한 포트 번호가 할당됩니다.


0

"대상 포트"는 컨테이너가 실행중인 포트입니다.

포트 : 포트는 서비스에서 컨테이너로 트래픽을 리디렉션합니다.

배포 노출

  master $ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE

nginx        1/1     1            1           31s
master $ kubectl expose deployment nginx --name=nginx-svc --port=8080 --target-port=80
service/nginx-svc exposed

master $ kubectl get svc

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE

nginx-svc    ClusterIP   10.107.209.151   <none>        8080/TCP   5s

NodePort : 서비스가 외부 적으로 접근 할 수 있도록하는 포트입니다.

이 답변을 바랍니다.


0

컨테이너가 포트 9376에서 수신하는 경우 targetPort : 9376

서비스가 포트 80에서 수신 대기하는 경우 포트 : 80

그런 다음 서비스 포트 구성은 다음과 같습니다.

ports:
 - protocol: TCP
   port: 80
   targetPort: 9376

마지막으로, 요청이 서비스의 포트로 수신되고 포드 의 targetPort 로 전달됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.