Kubernetes Service
는 서비스 정의에 targetPort
and 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:8089
kubernetes 클러스터 내부에 있으며 한 애플리케이션이 다른 애플리케이션과 통신하려고 할 때 사용할 수 있습니다. 따라서 클러스터 외부에서 서비스를 사용하려면 트래픽이 컨테이너의 포트로 리디렉션되도록 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 로 전달됩니다 .