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

Kubernetes Service는 서비스 정의에 targetPortand port를 가질 수 있습니다 .

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376

port과 의 차이점은 무엇입니까 targetPort?



답변

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

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 의견에 따라 편집되었습니다 .


답변

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

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

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

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

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


답변

@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있습니다.


답변

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

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

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

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

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

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


답변

간단히 말해서

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

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

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


답변

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

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

배포 노출

  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 : 서비스가 외부 적으로 접근 할 수 있도록하는 포트입니다.

이 답변을 바랍니다.


답변

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

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

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

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

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