服务是NodePort类型,并指定port和targetPort是什么意思?

时间:2017-01-31 17:08:30

标签: kubernetes

到目前为止,我对Kubernetes的熟悉程度越来越高,但仍处于基本水平。我也不是一个网络人。

我正盯着服务定义的以下片段,我无法在我的脑海中形成正确的图片说明:

nodePort     The port on each node on which this service is exposed when type=NodePort or LoadBalancer. Usually
integer      assigned by the system. If specified, it will be allocated to the service if unused or else creation of the
             service will fail. Default is to auto-allocate a port if the ServiceType of this Service requires one. More info: 
             http://kubernetes.io/docs/user-guide/services#type--nodeport

port         The port that will be exposed by this service.
integer

targetPort   Number or name of the port to access on the pods targeted by the service. Number must be in the range 1
IntOrString  to 65535. Name must be an IANA_SVC_NAME. If this is a string, it will be looked up as a named port in the
             target Pod's container ports. If this is not specified, the value of the 'port' field is used (an identity map).
             This field is ignored for services with clusterIP=None, and should be omitted or set equal to the 'port' field.
             More info: http://kubernetes.io/docs/user-guide/services#defining-a-service

引用ServicePort documentation,其中部分读取:

30000

我的理解是,群集外部的客户端将“看到”的端口将是32767 - targetPort范围内动态分配的端口,如定义的in the documentation。这将使用我还不了解的一些黑魔法,流向给定节点上的27017(在这种情况下为port)。

那么for $i in trace(1 to 3, "s") return <element>{$i * trace($i, "i") }</element> 用于什么?

2 个答案:

答案 0 :(得分:37)

nodePort是群集外部的客户端将“看到”的端口。通过kube-proxy在群集中的每个节点上打开nodePort。使用iptables magic Kubernetes(k8s)然后将流量从该端口路由到匹配的服务pod(即使该pod在完全不同的节点上运行)。

port是您的服务在群集内侦听的端口。我们来看这个例子:

---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - port: 8080
    targetPort: 8070
    nodePort: 31222
    protocol: TCP 
  selector:
    component: my-service-app

从我的k8s群集内部,可以通过my-service.default.svc.cluster.local:8080(群集内的服务与服务通信)访问此服务,并且任何到达此处的请求都会转发到targetPort 8070上的正在运行的窗格。

如果没有另外指定,

tagetPort默认情况下与port的值相同。

答案 1 :(得分:5)

为了更好地解释这个概念,我想象了服务的NodePort概念。

NodePort Service

在他的回答中提到的@fishi NodePort允许将k8s主机端口(又名nodePort)暴露给外部客户端。客户端可以直接访问nodePort,k8s可以将流量转发到必要的端口。

K8s在其所有节点上保留nodePort。运行服务的pod的所有节点都打开了此端口。

Pod不仅可以通过内部群集IP访问,还可以通过节点的IP和保留端口HOST_IP:NODE_PORT对访问。