Виділення IP-адрес ClusterIP Serviceʼам
У Kubernetes Service — це абстракція для експозиції застосунку, який працює на наборі Podʼів. Serviceʼи можуть мати віртуальну IP-адресу, доступну на рівні кластера (за допомогою Service з type: ClusterIP
). Клієнти можуть підключатися за допомогою цієї віртуальної IP-адреси, і Kubernetes балансує трафік до цього Service між його Podʼами.
Як виділяються IP-адреси ClusterIP Сервісу?
Коли Kubernetes потрібно призначити віртуальну IP-адресу для Service, це відбувається одним із двох способів:
- динамічно
- панель управління кластера автоматично вибирає вільну IP-адресу з налаштованого діапазону IP для Service з
type: ClusterIP
. - статично
- ви вказуєте IP-адресу за своїм вибором, з налаштованого діапазону IP для Service.
Для всього вашого кластера кожен Service ClusterIP
повинен бути унікальним. Спроба створення Service із конкретним ClusterIP
, що вже був призначений, призведе до помилки.
З чого випливає необхідність резервування IP-адрес для ClusterIP Service?
Іноді вам може знадобитися мати Serviceʼи, які працюють на відомих IP-адресах, щоб інші компоненти та користувачі в кластері могли їх використовувати.
Найкращим прикладом є Service DNS для кластера. Як мʼяка конвенція, деякі встановлювачі Kubernetes відводять 10-ту IP-адресу з діапазону IP-адрес Service для служби DNS. Припустимо, ви налаштували кластер із діапазоном IP-адрес Service 10.96.0.0/16 і хочете, щоб ваша IP-адреса Service DNS була 10.96.0.10, вам доведеться створити Service, подібний до цього:
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: CoreDNS
name: kube-dns
namespace: kube-system
spec:
clusterIP: 10.96.0.10
ports:
- name: dns
port: 53
protocol: UDP
targetPort: 53
- name: dns-tcp
port: 53
protocol: TCP
targetPort: 53
selector:
k8s-app: kube-dns
type: ClusterIP
Але, як це було пояснено раніше, IP-адреса 10.96.0.10 не була зарезервована. Якщо інші Service створюються перед або паралельно з динамічним виділенням, існує шанс, що вони можуть зайняти цю IP-адресу, тому ви не зможете створити Service DNS, оскільки це призведе до конфлікту.
Як уникнути конфліктів IP-адрес ClusterIP Сервісу?
Стратегія виділення, реалізована в Kubernetes для виділення ClusterIPs Service, зменшує ризик колізій.
ClusterIP
діапазон поділений на основі формули min(max(16, cidrSize / 16), 256)
, описано як ніколи менше ніж 16 або більше за 256 із поступовим кроком між ними.
Динамічне призначення IP типово використовує верхній діапазон, якщо цей діапазон вичерпано, то буде використано нижній діапазон. Це дозволить користувачам використовувати статичні виділення в нижньому діапазоні із низьким ризиком колізій.
Приклади
Приклад 1
У цьому прикладі використовується діапазон IP-адрес: 10.96.0.0/24 (нотація CIDR) для IP-адрес Serviceʼів.
Розмір діапазону: 28 - 2 = 254
Зсув діапазону: min(max(16, 256/16), 256)
= min(16, 256)
= 16
Початок статичного діапазону: 10.96.0.1
Кінець статичного діапазону: 10.96.0.16
Кінець діапазону: 10.96.0.254
Приклад 2
У цьому прикладі використовується діапазон IP-адрес: 10.96.0.0/20 (нотація CIDR) для IP-адрес Service.
Розмір діапазону: 212 - 2 = 4094
Зсув діапазону: min(max(16, 4096/16), 256)
= min(256, 256)
= 256
Початок статичного діапазону: 10.96.0.1
Кінець статичного діапазону: 10.96.1.0
Кінець діапазону: 10.96.15.254
Приклад 3
У цьому прикладі використовується діапазон IP-адрес: 10.96.0.0/16 (нотація CIDR) для IP-адрес Service.
Розмір діапазону: 216 - 2 = 65534
Зсув діапазону: min(max(16, 65536/16), 256)
= min(4096, 256)
= 256
Початок статичного діапазону: 10.96.0.1
Кінець статичного діапазону: 10.96.1.0
Кінець діапазону: 10.96.255.254
Що далі
- Дізнайтеся про Політики зовнішнього трафіку Service
- Дізнайтеся про Підключення застосунків за допомогою Service
- Дізнайтеся про Service