apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: nginx-hostport
qcloud-app: nginx-hostport
name: nginx-hostport
namespace: cjweichen
spec:
replicas: 1
selector:
matchLabels:
k8s-app: nginx-hostport
qcloud-app: nginx-hostport
template:
metadata:
labels:
k8s-app: nginx-hostport
qcloud-app: nginx-hostport
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
hostPort: 8000
name: http
protocol: TCP
- containerPort: 443
hostPort: 44300
name: https
protocol: TCP
Проверка доступа заключается в следующем. Доступ к нему осуществляется обычно через PODIP+containerPort и IP узла+hostPort.
HostPort и hostNetwork по существу раскрывают IP-адрес узла, на котором расположен модуль, конечным пользователям. Поскольку жизненный цикл модуля не фиксирован и может быть ненормально перестроен в любое время, неопределенность IP-адреса в конечном итоге приводит к неудобствам для пользователей. , порт хоста занят. Это также предотвращает использование одним и тем же портом на одном компьютере несколькими программами. Поэтому вообще не рекомендуется использовать метод hostPort.
При использовании hostNetwork модуль фактически использует сетевое адресное пространство хоста модуля: то есть IP-адрес модуля — это IP-адрес хоста, а не IP-адрес модуля, назначенный cni, а порт — это интерфейс прослушивания сети хоста.
При использовании hostPort IP-адрес модуля не является IP-адресом хоста, а IP-адресом модуля, выделенным cni. Он использует тот же метод выделения IP, что и другие обычные модули. Порт не является портом прослушивания сети хоста, но для сопоставления используется механизм DNAT. порт, указанный в параметре hostPort, на порт контейнера (можно просмотреть с помощью команды iptables). При внешнем доступе к этому поду по-прежнему используются методы хоста и хост-порта. Скриншоты IP-адреса модуля и IP-адреса хоста следующие:
Соответствующий порт DNAT можно просмотреть с помощью команды iptables, как показано на скриншоте ниже:
Как видно из рисунка выше, поток таблицы iptables nat на хосте, где расположен модуль, выглядит следующим образом:
1 Когда клиент инициирует pod Во время посещения, например. curl http://pod_in_host:hostPort
2 Сетевой пакет пройдет через цепочку предварительной маршрутизации узла модуля и попадет в цепочку CNI-HOSTPORT-DNAT.
3 Сетевой пакет будет проходить через третье правило в цепочке CNI-HOSTPORT_DNAT, которое является целью DNAT. В это время трафик, доступный через порт 9998, будет перенаправлен на порт 80.
Исходя из этого, когда клиент обращается к порту 8000 хоста, на котором расположен под, трафик будет автоматически перенаправлен на порт 80 с IP 10.55.3.5 (то есть ip пода).
Когда модуль использует и HostNetwork, и HostPort, HostNetwork будет напрямую использовать пространство имен хост-сети, а HostPort фактически бесполезен. Можно считать, что опция хостNetwork имеет более высокий приоритет, чем хост Порт.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-hostnetwork
namespace: cjweichen
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: nginx-hostnetwork
qcloud-app: nginx-hostnetwork
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
k8s-app: nginx-hostnetwork
qcloud-app: nginx-hostnetwork
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
hostPort: 80
name: http
protocol: TCP
- containerPort: 443
hostPort: 443
name: https
protocol: TCP
resources: {}
dnsPolicy: ClusterFirst
hostNetwork: true
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30