<p>I am becoming more familiar with Kubernetes by the day, but am still at a basic level.  I am also not a networking guy.</p>

<p>I am staring at the following snippet of a Service definition, and I can't form the right picture in my mind of what is being declared:</p>

<pre><code>spec:
  type: NodePort
  ports:
  - port: 27018
    targetPort: 27017
    protocol: TCP
</code></pre>

<p>Referencing the <a href="https://kubernetes.io/docs/resources-reference/v1.5/#serviceport-v1" rel="noreferrer">ServicePort documentation</a>, which reads in part:</p>

<pre><code>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
</code></pre>

<p>My understanding is that the port that a client outside of the cluster will "see" will be the dynamically assigned one in the range of <code>30000</code>-<code>32767</code>, as defined <a href="https://kubernetes.io/docs/user-guide/services/#type-nodeport" rel="noreferrer">in the documentation</a>.  This will, using some black magic that I do not yet understand, flow to the <code>targetPort</code> on a given node (<code>27017</code> in this case).</p>

<p>So what is the <code>port</code> used for here?  </p>

<p><code>nodePort</code> is the port that a client outside of the cluster will "see". <code>nodePort</code> is opened on every node in your cluster via <a href="https://kubernetes.io/docs/user-guide/services/#type-nodeport" rel="noreferrer">kube-proxy</a>. With iptables magic Kubernetes (k8s) then routes traffic from that port to a matching service pod (even if that pod is running on a completely different node).</p>

<p><code>port</code> is the port your service listens on inside the cluster. Let's take this example: </p>

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

<p>From inside my k8s cluster this service will be reachable via <code>my-service.default.svc.cluster.local:8080</code> (service to service communication inside your cluster) and any request reaching there is forwarded to a running pod on <code>targetPort</code> 8070.</p>

<p><code>tagetPort</code> is also by default the same value as <code>port</code> if not specified otherwise.</p>
