Я пытаюсь предоставить услугу с помощью NodePort в локальной среде без metal kubernetes (1.17) кластер (calico для CNI и CRI-O 1.17 )
. Я могу успешно свернуть службу, используя IPv4, но не используя IPv6 (соединение установлено, но ничего не передается).
kubectl describe svc/example-service
Name: example-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=helloworld
Type: NodePort
IP: 10.97.69.135
Port: <unset> 5000/TCP
TargetPort: 5000/TCP
NodePort: <unset> 32042/TCP
Endpoints: 10.10.166.132:5000
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
На хосте, на котором выполняется это развертывание:
netstat -tulpen|grep ':32042'
tcp6 0 0 :::32042 :::* LISTEN 0 10276301 2314/kube-proxy
kube-proxy явно связывается с tcp6 (с совместимостью с tcp4 mode) - поэтому соединение может быть установлено - но данные не передаются с использованием tcp6 (curl -6), tcp4 (curl -4) работает должным образом.
Должен ли кластер быть настроен в режиме двойного стека или в режиме IPv6 для получения запросов IPv4 и IPv6 (например, через NodePort)?
Да, именно для этого нужен двойной стек. Он позволяет выделять адреса IPv6
и IPv4
. Без него модули и сервисы не будут доступны по тому или иному IP-протоколу. Разрешения DNS недостаточно для правильного подключения к сети, если IP-протокол не может быть обработан.
Согласно документации kubernetes :
Двойной стек IPv4 / IPv6
СОСТОЯНИЕ ФУНКЦИИ:
Kubernetes v1.16
alphaДвойной стек IPv4 / IPv6 позволяет выделять адреса IPv4 и IPv6 для Pod и Services .
Если вы включите IPv4 / Сеть с двойным стеком IPv6 для вашего кластера Kubernetes, кластер будет поддерживать одновременное назначение адресов IPv4 и IPv6.
Обратите внимание, что это альфа-функция и не подходит для производственной среды.
Альтернативный подход - использовать модель завершения IPv6
. Если IPv6-трафик
отправляется через прокси-серверы на серверные части IPv4 внутри сети кластера. Пример из документации GCP.
Обновление:
Можно использовать ТОЛЬКО IPv6
без IPv4
с сеткой. Однако есть некоторые ограничения.
Согласно документации calico :
- В настоящее время Kubernetes поддерживает только одну версию IP-стека одновременно. Это означает, что если вы настраиваете Kubernetes для IPv6, то Calico должен быть настроен для назначения только адресов IPv6.
- Приведенные здесь шаги и настройка не были протестированы на существующем кластере IPv4 и предназначены только для новых кластеров.
Чтобы включить IPv6
только в кластере кубернетов используйте это руководство .
Надеюсь, это поможет.