Подвійний стек IPv4/IPv6
Двостекова мережа IPv4/IPv6 дозволяє виділяти адреси IPv4 та IPv6 для Podʼів та Services.
Двостекова мережа IPv4/IPv6 стандартно увімкнена у вашому кластері Kubernetes починаючи з версії 1.21, що дозволяє одночасно призначати адреси IPv4 та IPv6.
Підтримувані можливості
Двостекова мережа IPv4/IPv6 у вашому кластері Kubernetes надає такі можливості:
- Двостекова мережа Podʼів (одна адреса IPv4 та одна адреса IPv6 на Pod)
- Services з підтримкою IPv4 та IPv6
- Маршрутизація вихідного трафіку Podʼів за межі кластера (наприклад, в Інтернет) через інтерфейси IPv4 та IPv6
Передумови
Щоб використовувати двостекові кластери Kubernetes IPv4/IPv6, потрібно виконати такі передумови:
Kubernetes 1.20 або новіше
Інформацію про використання двостекових Services із попередніми версіями 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)
Services
Ви можете створювати Services, які можуть використовувати IPv4, IPv6 або обидва.
Сімейство адрес Service стандартно відповідає сімейству адрес першого діапазону кластерних IP Services (налаштованого через прапорець --service-cluster-ip-range для kube-apiserver).
Під час визначення Service ви можете за бажанням налаштувати його як двостековий. Щоб вказати потрібну поведінку, встановіть у полі .spec.ipFamilyPolicy одне з таких значень:
SingleStack: одностековий Service. Панель управління виділяє кластерний IP для Service, використовуючи перший налаштований діапазон кластерних IP Services.PreferDualStack: виділяє кластерні IP IPv4 та IPv6 для Service, коли подвійний стек увімкнено. Якщо подвійний стек не увімкнено або він не підтримується, застосовується одностекова поведінка.RequireDualStack: виділяє.spec.clusterIPsService з діапазонів адрес IPv4 та IPv6, коли подвійний стек увімкнено. Якщо подвійний стек не увімкнено або він не підтримується, створення обʼєкта API Service завершиться невдачею.- Вибирає
.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.
Параметри подвійного стека в нових Services
Специфікація цього Service явно не визначає
.spec.ipFamilyPolicy. Коли ви створюєте цей Service, Kubernetes призначає кластерний IP для Service з першого налаштованогоservice-cluster-ip-rangeі встановлює.spec.ipFamilyPolicyуSingleStack. (Services без селекторів та headless Services із селекторами поводитимуться так само.)apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376Специфікація цього Service явно визначає
PreferDualStackв.spec.ipFamilyPolicy. Коли ви створюєте цей Service у двостековому кластері, Kubernetes призначає адреси IPv4 та IPv6 для Service. Панель управління оновлює.specService, щоб зафіксувати призначені IP-адреси. Поле.spec.clusterIPsє основним і містить обидві призначені IP-адреси;.spec.clusterIPє вторинним полем, значення якого обчислюється з.spec.clusterIPs.- Для поля
.spec.clusterIPпанель управління записує IP-адресу з того самого сімейства адрес, що й перший діапазон кластерних IP Services. - В одностековому кластері обидва поля
.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
Стандартні значення подвійного стека в наявних Services
Ці приклади демонструють стандартну поведінку, коли подвійний стек щойно увімкнено в кластері, де вже існують Services. (Оновлення наявного кластера до версії 1.21 або новішої вмикає подвійний стек.)
Коли в кластері увімкнено подвійний стек, панель управління налаштовує наявні Services (чи то
IPv4, чиIPv6), встановлюючи.spec.ipFamilyPolicyуSingleStack, а.spec.ipFamilies— у сімейство адрес наявного Service. Кластерний IP наявного Service зберігається в.spec.clusterIPs.apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376Цю поведінку можна перевірити, переглянувши наявний Service за допомогою kubectl.
kubectl get svc my-service -o yamlapiVersion: 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 Services (налаштованого через прапорець--service-cluster-ip-rangeдля kube-apiserver), навіть якщо.spec.clusterIPвстановлено вNone.apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376Цю поведінку можна перевірити, переглянувши наявний headless Service із селекторами за допомогою kubectl.
kubectl get svc my-service -o yamlapiVersion: 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
Перемикання Services між одностековим та двостековим режимами
Services можна перемикати з одностекового режиму на двостековий і навпаки.
Щоб перемкнути 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.Вихідний трафік
Якщо ви хочете увімкнути вихідний трафік, щоб досягати призначень за межами кластера (наприклад, публічного Інтернету) з Podʼа, який використовує адреси IPv6, що не маршрутизуються публічно, вам потрібно дати Podʼу змогу використовувати публічно маршрутизовану адресу IPv6 за допомогою такого механізму, як прозоре проксіювання або IP-маскування. Проєкт ip-masq-agent підтримує IP-маскування у двостекових кластерах.
Примітка:
Переконайтеся, що ваш провайдер CNI підтримує IPv6.Підтримка Windows
Kubernetes у Windows не підтримує одностекову мережу «лише IPv6». Однак підтримується двостекова мережа IPv4/IPv6 для Podʼів і вузлів з одностековими Services.
Ви можете використовувати двостекову мережу IPv4/IPv6 з мережами l2bridge.
Примітка:
Оверлейні мережі (VXLAN) у Windows не підтримують двостекову мережу.Докладніше про різні режими мережі у Windows читайте в розділі Мережа у Windows.