Разница между контейнерным портом и целевым портом в Kubernetes?

Aug 17 2020

Чем container portотличается от targetportsконтейнера в Kubernetes? Используются ли они как взаимозаменяемые, если да, то почему?

Я наткнулся на фрагмент кода ниже, где containerPortон используется для обозначения portмодуля в Kubernetes.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
  labels:
    app: demo-voting-app
spec:
  replicas: 1
  selector:
    matchLabels:
      name: postgres-pod
      app: demo-voting-app
  template:
    metadata:
      name: postgres-pod
      labels:
        name: postgres-pod
        app: demo-voting-app

    spec:
      containers:
      - name: postgres
        image: postgres:9.4
        ports:
        - containerPort: 5432
        

В приведенном выше фрагменте кода для containerPortпараметра указано 5432 (в последней строке). Итак, чем это containerPortотличается от targetport?

Насколько я знаю, этот термин portв целом относится к portна service(Kubernetes). Поправьте меня, если я ошибаюсь.

Ответы

4 mario Aug 18 2020 at 16:17

В двух словах: targetPort и в containerPortосновном относятся к одному и тому же порту (так что, если используются оба, ожидается, что они будут иметь одинаковое значение), но они используются в двух разных контекстах и ​​имеют совершенно разные цели.

Их нельзя использовать взаимозаменяемо, поскольку оба являются частями спецификации двух различных ресурсов / объектов кубернетов: Serviceи Podсоответственно. Хотя цель containerPortможет рассматриваться как чисто информационная, targetPortтребуется Serviceобъект, который предоставляет набор Pods.

Важно понимать, что, объявив containerPortконкретное значение в вашей Pod/ Deploymentспецификации, вы не можете заставить вас Podоткрывать этот конкретный порт, например, если вы объявляете в containerPortполе, что ваш nginx Podпредоставляет порт 8080вместо порта по умолчанию 80, вам все равно нужно настроить сервер nginx в вашем контейнере. слушать на этом порту.

Заявление containerPortв Podспецификации необязательно. Даже без него вы Serviceбудете знать, куда направить запрос на основе информации, указанной в его targetPort.

Это хорошо , чтобы помнить , что это не обязательно объявлять targetPortв Serviceопределении. Если вы его опустите, по умолчанию используется значение, которое вы указали port(которое является портом самого Serviceсебя).

2 ArghyaSadhu Aug 17 2020 at 10:05

ContainerPort в спецификации контейнера

Список портов, которые нужно выставить из контейнера. Открытие порта здесь дает системе дополнительную информацию о сетевых соединениях, используемых контейнером, но в первую очередь носит информационный характер. Отсутствие указания порта здесь НЕ предотвращает раскрытие этого порта

targetPort в спецификации службы

Номер или имя порта для доступа к модулям, на которые нацелена служба. Номер должен быть в диапазоне от 1 до 65535. Имя должно быть IANA_SVC_NAME. Если это строка, она будет рассматриваться как именованный порт в портах контейнера целевого модуля. Если это не указано, используется значение поля «порт» (идентификационная карта).

Следовательно, targetPortслужба должна соответствовать containerPortспецификации в подах, потому что именно так служба узнает, какой порт контейнера является местом назначения для пересылки трафика.