Подвійний стек IPv4/IPv6
Kubernetes v1.23 [stable]
Двостекова мережа IPv4/IPv6 дозволяє виділяти як адреси IPv4, так і IPv6 для Podʼів та Serviceʼів.
Двостекова мережа IPv4/IPv6 є стандартно увімкненою у вашому кластері Kubernetes починаючи з версії 1.21, що дозволяє одночасно призначати адреси як IPv4, так і IPv6.
Підтримувані функції
Двостекова мережа IPv4/IPv6 у вашому кластері Kubernetes надає наступні можливості:
- Мережа Pod із двома стеками (призначення адреси IPv4 і IPv6 на один Pod)
- Serviceʼи з підтримкою IPv4 і IPv6
- Маршрутизація egress Pod за межі кластера (наприклад, в Інтернет) через інтерфейси IPv4 та IPv6
Передумови
Для використання двостекових кластерів Kubernetes IPv4/IPv6 потрібні наступні передумови:
Kubernetes 1.20 або новіше
Для отримання інформації щодо використання двостекових Serviceʼів із попередніми версіями Kubernetes, дивіться документацію для відповідної версії Kubernetes.
Підтримка постачальником двостекової мережі (постачальник хмари або інший повинен забезпечити вузлам Kubernetes маршрутизовані мережеві інтерфейси IPv4/IPv6)
Мережевий втулок, який підтримує двостекову мережу.
Налаштування двостекової мережі IPv4/IPv6
Щоб налаштувати подвійний стек IPv4/IPv6, встановіть призначення мережі кластера з подвійним стеком:
- kube-apiserver:
--service-cluster-ip-range=<CIDR IPv4>,<CIDR IPv6>
- kube-controller-manager:
--cluster-cidr=<CIDR IPv4>,<CIDR IPv6>
--service-cluster-ip-range=<CIDR IPv4>,<CIDR IPv6>
--node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6
типово /24 для IPv4 та /64 для IPv6
- kube-proxy:
--cluster-cidr=<CIDR IPv4>,<CIDR IPv6>
- kubelet:
--node-ip=<IP IPv4>,<IP IPv6>
- Ця опція є обовʼязковою для bare metal двостекових вузлів (вузлів, які не визначають постачальника хмари прапорцем
--cloud-provider
). Якщо ви використовуєте постачальника хмари та вирішили перевизначити IP-адреси вузлів, визначені постачальником хмари, встановіть опцію--node-ip
. - (Вбудовані застарілі постачальники хмари не підтримують двостековий параметр
--node-ip
.)
- Ця опція є обовʼязковою для bare metal двостекових вузлів (вузлів, які не визначають постачальника хмари прапорцем
Примітка:
Приклад CIDR IPv4: 10.244.0.0/16
(хоча ви повинні вказати свій власний діапазон адрес)
Приклад CIDR IPv6: fdXY:IJKL:MNOP:15::/64
(це показує формат, але не є дійсною адресою — дивіться RFC 4193)
Serviceʼи
Ви можете створювати Serviceʼи, які можуть використовувати адреси IPv4, IPv6 або обидві.
Сімейство адрес Service типово відповідає сімейству адрес першого діапазону IP Service кластера (налаштованого через прапорець --service-cluster-ip-range
у kube-apiserver).
При визначенні Service ви можете конфігурувати його як двостековий за власним бажанням. Щоб вказати потрібну поведінку, ви встановлюєте в поле .spec.ipFamilyPolicy
одне з наступних значень:
SingleStack
: Service з одним стеком. Панель управління виділяє IP кластера для Service, використовуючи перший налаштований діапазон IP кластера для Service.PreferDualStack
: Виділяє IP-адреси кластерів IPv4 та IPv6 для Service, коли ввімкнено подвійний стек. Якщо подвійний стек не ввімкнено або не підтримується, він повертається до одностекового режиму.RequireDualStack
: Виділяє IP-адреси Service.spec.clusterIP
з діапазонів адрес IPv4 та IPv6, якщо увімкнено подвійний стек. Якщо подвійний стек не ввімкнено або не підтримується, створення обʼєкта Service API завершиться невдачею.- Вибирає
.spec.clusterIP
зі списку.spec.clusterIPs
на основі сімейства адрес першого елемента у масиві.spec.ipFamilies
.
- Вибирає
Якщо ви хочете визначити, яке сімейство IP використовувати для одностекової конфігурації або визначити порядок IP для двостекової, ви можете вибрати сімейства адрес, встановивши необовʼязкове поле .spec.ipFamilies
в Service.
Примітка:
Поле.spec.ipFamilies
умовно змінюване: ви можете додавати або видаляти вторинне
сімейство IP-адрес, але не можете змінювати основне сімейство IP-адрес наявного Service.Ви можете встановити .spec.ipFamilies
в будь-яке з наступних значень масиву:
["IPv4"]
["IPv6"]
["IPv4","IPv6"]
(два стеки)["IPv6","IPv4"]
(два стеки)
Перше сімейство, яке ви перераховуєте, використовується для легасі-поля .spec.clusterIP
.
Сценарії конфігурації двостекового Service
Ці приклади демонструють поведінку різних сценаріїв конфігурації двостекового Service.
Параметри подвійного стека в нових Service
Специфікація цього Service явно не визначає
.spec.ipFamilyPolicy
. Коли ви створюєте цей Service, Kubernetes виділяє кластерний IP для Service з першого налаштованогоservice-cluster-ip-range
та встановлює значення.spec.ipFamilyPolicy
наSingleStack
. (Service без селекторів та headless Services із селекторами будуть працювати так само.)apiVersion: v1 kind: Service metadata: name: my-service labels: app.kubernetes.io/name: MyApp spec: selector: app.kubernetes.io/name: MyApp ports: - protocol: TCP port: 80
Специфікація цього Service явно визначає
PreferDualStack
в.spec.ipFamilyPolicy
. Коли ви створюєте цей Service у двостековому кластері, Kubernetes призначає як IPv4, так і IPv6 адреси для Service. Панель управління оновлює.spec
для Service, щоб зафіксувати адреси IP. Поле.spec.clusterIPs
є основним полем і містить обидві призначені адреси IP;.spec.clusterIP
є вторинним полем зі значенням, обчисленим з.spec.clusterIPs
.- Для поля
.spec.clusterIP
панель управління записує IP-адресу, яка є з того ж самого сімейства адрес, що й перший діапазон кластерних IP Service. - У одностековому кластері поля
.spec.clusterIPs
та.spec.clusterIP
містять лише одну адресу. - У кластері з увімкненими двома стеками вказання
RequireDualStack
в.spec.ipFamilyPolicy
працює так само як іPreferDualStack
.
apiVersion: v1 kind: Service metadata: name: my-service labels: app.kubernetes.io/name: MyApp spec: ipFamilyPolicy: PreferDualStack selector: app.kubernetes.io/name: MyApp ports: - protocol: TCP port: 80
- Для поля
Специфікація цього Service явно визначає
IPv6
таIPv4
в.spec.ipFamilies
, а також визначаєPreferDualStack
в.spec.ipFamilyPolicy
. Коли Kubernetes призначає IPv6 та IPv4 адреси в.spec.clusterIPs
,.spec.clusterIP
встановлюється на IPv6 адресу, оскільки це перший елемент у масиві.spec.clusterIPs
, що перевизначає типові значення.apiVersion: v1 kind: Service metadata: name: my-service labels: app.kubernetes.io/name: MyApp spec: ipFamilyPolicy: PreferDualStack ipFamilies: - IPv6 - IPv4 selector: app.kubernetes.io/name: MyApp ports: - protocol: TCP port: 80
Параметри подвійного стека в наявних Service
Ці приклади демонструють типову поведінку при увімкненні двостековості в кластері, де вже існують Service. (Оновлення наявного кластера до версії 1.21 або новіше вмикає двостековість.)
Коли двостековість увімкнена в кластері, наявні Service (безперебійно
IPv4
абоIPv6
) конфігуруються панеллю управління так, щоб встановити.spec.ipFamilyPolicy
наSingleStack
та встановити.spec.ipFamilies
на сімейство адрес наявного Service. Кластерний IP наявного Service буде збережено в.spec.clusterIPs
.apiVersion: v1 kind: Service metadata: name: my-service labels: app.kubernetes.io/name: MyApp spec: selector: app.kubernetes.io/name: MyApp ports: - protocol: TCP port: 80
Ви можете перевірити цю поведінку за допомогою kubectl, щоб переглянути наявний Service.
kubectl get svc my-service -o yaml
apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/name: MyApp name: my-service spec: clusterIP: 10.0.197.123 clusterIPs: - 10.0.197.123 ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - port: 80 protocol: TCP targetPort: 80 selector: app.kubernetes.io/name: MyApp type: ClusterIP status: loadBalancer: {}
Коли двостековість увімкнена в кластері, наявні headless Services з селекторами конфігуруються панеллю управління так, щоб встановити
.spec.ipFamilyPolicy
наSingleStack
та встановити.spec.ipFamilies
на сімейство адрес першого діапазону кластерних IP Service (налаштованого за допомогою прапорця--service-cluster-ip-range
для kube-apiserver), навіть якщо.spec.clusterIP
встановлено вNone
.apiVersion: v1 kind: Service metadata: name: my-service labels: app.kubernetes.io/name: MyApp spec: selector: app.kubernetes.io/name: MyApp ports: - protocol: TCP port: 80
Ви можете перевірити цю поведінку за допомогою kubectl, щоб переглянути наявний headless Service з селекторами.
kubectl get svc my-service -o yaml
apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/name: MyApp name: my-service spec: clusterIP: None clusterIPs: - None ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - port: 80 protocol: TCP targetPort: 80 selector: app.kubernetes.io/name: MyApp
Перемикання Service між одностековим та двостековим режимами
Service можна перемикати з одностекового режиму на двостековий та навпаки.
Для того щоби перемикнути Service з одностекового режиму на двостековий, змініть
.spec.ipFamilyPolicy
зSingleStack
наPreferDualStack
абоRequireDualStack
за необхідності. Коли ви змінюєте цей Service з одностекового режиму на двостековий, Kubernetes призначає відсутнє адресне сімейство, так що тепер Service має адреси IPv4 та IPv6.Відредагуйте специфікацію Service, оновивши
.spec.ipFamilyPolicy
зSingleStack
наPreferDualStack
.До:
spec: ipFamilyPolicy: SingleStack
Після:
spec: ipFamilyPolicy: PreferDualStack
Для того щоби змінити Service з двостекового режиму на одностековий, змініть
.spec.ipFamilyPolicy
зPreferDualStack
абоRequireDualStack
наSingleStack
. Коли ви змінюєте цей Service з двостекового режиму на одностековий, Kubernetes залишає лише перший елемент у масиві.spec.clusterIPs
, і встановлює.spec.clusterIP
на цю IP-адресу і встановлює.spec.ipFamilies
на адресне сімейство.spec.clusterIPs
.
Headless Services без селекторів
Для Headless Services без селекторів і без явно вказаного .spec.ipFamilyPolicy
, поле .spec.ipFamilyPolicy
має типове значення RequireDualStack
.
Тип Service — LoadBalancer
Щоб налаштувати двостековий балансувальник навантаження для вашого Service:
- Встановіть значення поля
.spec.type
вLoadBalancer
- Встановіть значення поля
.spec.ipFamilyPolicy
вPreferDualStack
абоRequireDualStack
Примітка:
Для використання двостекового Service типуLoadBalancer
, ваш постачальник хмари повинен підтримувати балансувальники навантаження IPv4 та IPv6.Трафік Egress
Якщо ви хочете увімкнути трафік Egress, щоб досягти призначення за межами кластера (наприклад, публічний Інтернет) з Podʼа, який використовує непублічно марковані адреси IPv6, вам потрібно увімкнути Pod для використання публічно-маршрутизованих адрес IPv6 за допомогою механізму, такого як прозорий проксі або IP маскування. Проєкт ip-masq-agent підтримує IP-маскування у двохстекових кластерах.
Примітка:
Переконайтеся, що ваш постачальник CNI підтримує IPv6.Підтримка Windows
Kubernetes на Windows не підтримує одностекову мережу "лише IPv6". Однак підтримується двохстекова мережа IPv4/IPv6 для Podʼів та вузлів з одностековими Service.
Ви можете використовувати двохстекову мережу IPv4/IPv6 з мережами l2bridge
.
Примітка:
Мережі VXLAN на Windows не підтримують двохстекову мережу.Ви можете дізнатися більше про різні режими мережі для Windows в розділі Мережа у Windows.