Что означает, что служба должна быть типа NodePort и иметь как порт, так и targetPort?

Я все ближе знаком с Кубернетом, но я все еще на базовом уровне. Я также не являюсь сетевым парнем.

Я смотрю на следующий фрагмент определения службы, и я не могу сформировать правильную картину в моем сознании того, что объявляется:

spec:
  type: NodePort
  ports:
  - port: 27018
    targetPort: 27017
    protocol: TCP

Ссылка на документацию ServicePort, которая гласит:

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 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

Я понимаю, что порт, который клиент за пределами кластера будет "видеть", будет динамически назначенным в диапазоне 30000 - 32767, как определено в документации. Это, используя некоторую черную магию, которую я еще не понимаю, перетекает к targetPort в заданный node (27017 в этом случае).

Итак, что здесь используется port?

Ответ 1

nodePort - это порт, который клиент видит вне кластера. nodePort открывается на каждом node в вашем кластере через kube-proxy. С помощью iptables magic Kubernetes (k8s) затем направляет трафик с этого порта на соответствующий сервисный модуль (даже если этот блок работает на совершенно другом node).

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, если не указано иное.