Разница между контейнерным портом и целевым портом в Kubernetes?
Чем 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). Поправьте меня, если я ошибаюсь.
Ответы
В двух словах: 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
себя).
ContainerPort в спецификации контейнера
Список портов, которые нужно выставить из контейнера. Открытие порта здесь дает системе дополнительную информацию о сетевых соединениях, используемых контейнером, но в первую очередь носит информационный характер. Отсутствие указания порта здесь НЕ предотвращает раскрытие этого порта
targetPort в спецификации службы
Номер или имя порта для доступа к модулям, на которые нацелена служба. Номер должен быть в диапазоне от 1 до 65535. Имя должно быть IANA_SVC_NAME. Если это строка, она будет рассматриваться как именованный порт в портах контейнера целевого модуля. Если это не указано, используется значение поля «порт» (идентификационная карта).
Следовательно, targetPort
служба должна соответствовать containerPort
спецификации в подах, потому что именно так служба узнает, какой порт контейнера является местом назначения для пересылки трафика.