Модуль 3.2: Ендпоінти та EndpointSlices
Складність:
[MEDIUM]- Розуміння механіки сервісівЧас на проходження: 30-40 хвилин
Передумови: Модуль 3.1 (Сервіси)
Що ви зможете робити
Розділ «Що ви зможете робити»Після цього модуля ви зможете:
- Пояснити, як Endpoints та EndpointSlices з’єднують Services з Pods
- Дебажити помилки “no endpoints”, перевіряючи селектори міток, готовність подів та статус ендпоінтів
- Створити ручні Endpoints для зовнішніх сервісів, що знаходяться поза кластером
- Діагностувати часту зміну ендпоінтів та її вплив на стабільність сервісу
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Коли ви створюєте Сервіс, Kubernetes автоматично створює об’єкт Endpoints, який відстежує, які IP-адреси подів мають отримувати трафік. Розуміння ендпоінтів має вирішальне значення для вирішення проблем із сервісами — коли сервіс не має ендпоінтів, трафік нікуди не йде.
Іспит CKA перевіряє вашу здатність до усунення несправностей сервісів, і перевірка ендпоінтів — це ваш основний інструмент налагодження. Ви також зіткнетеся з EndpointSlices, новішою та більш масштабованою версією Endpoints.
Аналогія з телефонною книгою
Якщо Сервіс — це номер телефону (стабільний), то Ендпоінти — це записи в телефонній книзі, які відображають цей номер на реальних людей (поди). Коли ви телефонуєте за номером, телефонна система шукає в книзі, хто зараз доступний, і з’єднує вас. Kubernetes робить те саме — IP-адреса Сервісу шукається в Ендпоінтах (Endpoints), щоб знайти доступні IP-адреси подів.
Що ви дізнаєтесь
Розділ «Що ви дізнаєтесь»До кінця цього модуля ви зможете:
- Розуміти, як Ендпоінти з’єднують Сервіси з Подами
- Налагоджувати сервіси, перевіряючи ендпоінти
- Створювати ручні ендпоінти для зовнішніх сервісів
- Розуміти EndpointSlices та їхні переваги
- Працювати з headless сервісами та розуміти їхню унікальну поведінку ендпоінтів
Чи знали ви?
Розділ «Чи знали ви?»-
Ендпоінти можуть бути величезними: У кластерах з тисячами подів один об’єкт Endpoints може містити тисячі IP-адрес. Це викликало проблеми з продуктивністю, що призвело до створення EndpointSlices.
-
EndpointSlices — це майбутнє: Починаючи з Kubernetes 1.21, EndpointSlices використовуються за замовчуванням. Кожен зріз (slice) містить до 100 ендпоінтів, що робить оновлення набагато ефективнішими.
-
Контролери відстежують ендпоінти: Багато контролерів (наприклад, контролери Інгрес (Ingress)) відстежують Ендпоінти, щоб знати, куди маршрутизувати трафік. Коли ендпоінти змінюються, таблиці маршрутизації оновлюються автоматично.
Частина 1: Основи Ендпоінтів
Розділ «Частина 1: Основи Ендпоінтів»1.1 Що таке Ендпоінти?
Розділ «1.1 Що таке Ендпоінти?»Ендпоінти — це клей між Сервісами та Подами:
┌────────────────────────────────────────────────────────────────┐│ Сервіс → Ендпоінти → Поди ││ ││ ┌──────────────────┐ ┌──────────────────┐ ││ │ Сервіс │ │ Ендпоінти │ ││ │ web-svc │ │ web-svc │ ││ │ │ │ │ ││ │ селектор: │───►│ subsets: │ ││ │ app: web │ │ - addresses: │ ││ │ │ │ - 10.244.1.5 │───► Под 1 ││ │ порти: │ │ - 10.244.2.8 │───► Под 2 ││ │ - port: 80 │ │ - 10.244.1.12 │───► Под 3 ││ │ │ │ ports: │ ││ │ │ │ - port: 8080 │ ││ └──────────────────┘ └──────────────────┘ ││ ││ Ендпоінти автоматично створюються та оновлюються контролером ││ ендпоінтів ││ │└────────────────────────────────────────────────────────────────┘1.2 Життєвий цикл Ендпоінта
Розділ «1.2 Життєвий цикл Ендпоінта»┌────────────────────────────────────────────────────────────────┐│ Контролер ендпоінтів ││ ││ Відстежує: Поди та Сервіси ││ Оновлює: об'єкти Endpoints ││ ││ Под створено (мітка: app=web) ││ │ ││ ▼ ││ Контролер знаходить Сервіс із селектором app=web ││ │ ││ ▼ ││ Додає IP-адресу Пода до Ендпоінтів Сервісу ││ ││ Под видалено або він не пройшов перевірку готовності (Readiness)││ │ ││ ▼ ││ Видаляє IP-адресу Пода з Ендпоінтів ││ │└────────────────────────────────────────────────────────────────┘1.3 Перегляд Ендпоінтів
Розділ «1.3 Перегляд Ендпоінтів»# List all endpointsk get endpointsk get ep # Short form
# Get specific endpointk get endpoints web-svc
# Detailed viewk describe endpoints web-svc
# Get endpoints as YAMLk get endpoints web-svc -o yaml
# Wide output with pod IPsk get endpoints -o wide1.4 Структура Ендпоінта
Розділ «1.4 Структура Ендпоінта»# What an Endpoints object looks likeapiVersion: v1kind: Endpointsmetadata: name: web-svc # Must match Service name namespace: defaultsubsets:- addresses: # Ready pod IPs - ip: 10.244.1.5 nodeName: worker-1 targetRef: kind: Pod name: web-abc123 namespace: default - ip: 10.244.2.8 nodeName: worker-2 targetRef: kind: Pod name: web-def456 namespace: default notReadyAddresses: # Pods not passing readiness probe - ip: 10.244.1.12 nodeName: worker-1 targetRef: kind: Pod name: web-ghi789 namespace: default ports: - port: 8080 protocol: TCPЧастина 2: Налагодження з використанням Ендпоінтів
Розділ «Частина 2: Налагодження з використанням Ендпоінтів»2.1 Немає Ендпоінтів = Немає Трафіку
Розділ «2.1 Немає Ендпоінтів = Немає Трафіку»# Service exists but has no endpointsk get svc web-svc# NAME TYPE CLUSTER-IP PORT(S)# web-svc ClusterIP 10.96.45.123 80/TCP
k get endpoints web-svc# NAME ENDPOINTS AGE# web-svc <none> 5m ← Problem!2.2 Типові причини відсутності Ендпоінтів
Розділ «2.2 Типові причини відсутності Ендпоінтів»| Симптом | Причина | Команда для налагодження | Рішення |
|---|---|---|---|
<none> ендпоінтів | Жоден под не відповідає селектору | k get pods --show-labels | Виправити селектор або мітки подів |
<none> ендпоінтів | Поди не працюють (not running) | k get pods | Виправити проблеми з подами |
<none> ендпоінтів | Поди в іншому просторі імен | k get pods -A | Перевірити Простір імен |
| Часткові ендпоінти | Деякі поди не готові (not ready) | k describe endpoints | Перевірити проби готовності (readiness probes) |
2.3 Робочий процес налагодження
Розділ «2.3 Робочий процес налагодження»# Step 1: Check if endpoints existk get endpoints web-svc# If <none>, proceed to step 2
# Step 2: Check service selectork get svc web-svc -o yaml | grep -A5 selector# selector:# app: web
# Step 3: Find pods with matching labelsk get pods --selector=app=web# Should list pods backing the service
# Step 4: If no pods found, check what labels pods havek get pods --show-labels# Compare with service selector
# Step 5: If pods exist but not in endpoints, check pod statusk get pods# Look for pods that aren't Running
# Step 6: Check for readiness probe failuresk describe pod <pod-name> | grep -A10 Readiness2.4 Ендпоінти з не готовими подами (NotReady Pods)
Розділ «2.4 Ендпоінти з не готовими подами (NotReady Pods)»# Describe shows both ready and not-ready addressesk describe endpoints web-svc
# Output:# Name: web-svc# Subsets:# Addresses: 10.244.1.5,10.244.2.8# NotReadyAddresses: 10.244.1.12# Ports:# Name Port Protocol# ---- ---- --------# <unset> 8080 TCPПоди у NotReadyAddresses не отримують трафік.
Частина 3: Ручні Ендпоінти
Розділ «Частина 3: Ручні Ендпоінти»3.1 Коли використовувати Ручні Ендпоінти
Розділ «3.1 Коли використовувати Ручні Ендпоінти»Створюйте ендпоінти вручну, коли потрібно вказати на:
- Зовнішні бази даних поза Kubernetes
- Сервіси в інших кластерах
- Ресурси на основі IP-адрес, які не є подами
3.2 Створення Ручних Ендпоінтів
Розділ «3.2 Створення Ручних Ендпоінтів»# Step 1: Create service WITHOUT selectorapiVersion: v1kind: Servicemetadata: name: external-dbspec: ports: - port: 5432 targetPort: 5432 # No selector! This is intentional.---# Step 2: Create Endpoints with same nameapiVersion: v1kind: Endpointsmetadata: name: external-db # Must match service name exactlysubsets:- addresses: - ip: 192.168.1.100 # External database IP - ip: 192.168.1.101 # Backup database IP ports: - port: 5432# Apply bothk apply -f external-db.yaml
# Verifyk get svc,endpoints external-db
# Now pods can reach external DB via:# external-db.default.svc.cluster.local:54323.3 Варіанти використання Ручних Ендпоінтів
Розділ «3.3 Варіанти використання Ручних Ендпоінтів»# Example: External API endpointapiVersion: v1kind: Servicemetadata: name: external-apispec: ports: - port: 443---apiVersion: v1kind: Endpointsmetadata: name: external-apisubsets:- addresses: - ip: 52.84.123.45 # External API server ports: - port: 443Частина 4: EndpointSlices
Розділ «Частина 4: EndpointSlices»4.1 Чому EndpointSlices?
Розділ «4.1 Чому EndpointSlices?»┌────────────────────────────────────────────────────────────────┐│ Проблема Ендпоінтів ││ ││ Великий Сервіс з 5000 подів ││ ││ Один об'єкт Endpoints: ││ - Містить усі 5000 IP-адрес ││ - Будь-яка зміна пода = оновлення всього об'єкта ││ - Великий обсяг даних надсилається всім спостерігачам ││ - Навантаження на API-сервер та etcd ││ │└────────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────┐│ Рішення з EndpointSlices ││ ││ Ті ж 5000 подів розділені на 50 зрізів (slices) ││ ││ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ││ │ Зріз 1 │ │ Зріз 2 │ │ Зріз 3 │ ... │ Зріз 50 │ ││ │ 100 IP │ │ 100 IP │ │ 100 IP │ │ 100 IP │ ││ └─────────┘ └─────────┘ └─────────┘ └─────────┘ ││ ││ Зміна пода = оновлення лише відповідного зрізу ││ Невеликий обсяг даних, мінімальне навантаження на API-сервер ││ │└────────────────────────────────────────────────────────────────┘4.2 Структура EndpointSlice
Розділ «4.2 Структура EndpointSlice»# What an EndpointSlice looks likeapiVersion: discovery.k8s.io/v1kind: EndpointSlicemetadata: name: web-svc-abc12 # Auto-generated name labels: kubernetes.io/service-name: web-svcaddressType: IPv4ports:- name: "" port: 8080 protocol: TCPendpoints:- addresses: - 10.244.1.5 conditions: ready: true serving: true terminating: false nodeName: worker-1 targetRef: kind: Pod name: web-abc123 namespace: default- addresses: - 10.244.2.8 conditions: ready: true nodeName: worker-24.3 Перегляд EndpointSlices
Розділ «4.3 Перегляд EndpointSlices»# List all EndpointSlicesk get endpointslicesk get eps # Short form (might conflict with endpoints)
# Get EndpointSlices for a servicek get endpointslices -l kubernetes.io/service-name=web-svc
# Detailed viewk describe endpointslice web-svc-abc12
# Get as YAMLk get endpointslice web-svc-abc12 -o yaml4.4 Порівняння Ендпоінтів (Endpoints) та EndpointSlices
Розділ «4.4 Порівняння Ендпоінтів (Endpoints) та EndpointSlices»| Аспект | Endpoints | EndpointSlices |
|---|---|---|
| Макс. кількість записів | Необмежено (але проблематично) | 100 на зріз |
| Область оновлення | Весь об’єкт | Один зріз |
| Версія API | v1 | discovery.k8s.io/v1 |
| За замовчуванням з | Завжди | Kubernetes 1.21 |
| Підтримка Dual-stack | Обмежена | Повна підтримка IPv4/IPv6 |
| Підказки топології | Ні | Так |
Частина 5: Headless Сервіси
Розділ «Частина 5: Headless Сервіси»5.1 Що таке Headless Сервіс?
Розділ «5.1 Що таке Headless Сервіс?»Headless сервіс не має ClusterIP. DNS повертає безпосередньо IP-адреси подів.
apiVersion: v1kind: Servicemetadata: name: headless-svcspec: clusterIP: None # This makes it headless selector: app: web ports: - port: 805.2 Поведінка Headless Сервісу
Розділ «5.2 Поведінка Headless Сервісу»┌────────────────────────────────────────────────────────────────┐│ Звичайний Сервіс проти Headless Сервісу ││ ││ Звичайний Сервіс (ClusterIP: 10.96.45.123) ││ ┌─────────────────────────────────────────────────────────┐ ││ │ DNS: web-svc.default.svc → 10.96.45.123 (IP Сервісу) │ ││ │ Клієнт → IP Сервісу → kube-proxy → випадковий Под │ ││ └─────────────────────────────────────────────────────────┘ ││ ││ Headless Сервіс (clusterIP: None) ││ ┌─────────────────────────────────────────────────────────┐ ││ │ DNS: web-svc.default.svc → │ ││ │ 10.244.1.5 (Под 1) │ ││ │ 10.244.2.8 (Под 2) │ ││ │ 10.244.1.12 (Под 3) │ ││ │ Клієнт отримує ВСІ IP-адреси подів, сам обирає одну │ ││ └─────────────────────────────────────────────────────────┘ ││ │└────────────────────────────────────────────────────────────────┘5.3 Варіанти використання Headless Сервісу
Розділ «5.3 Варіанти використання Headless Сервісу»| Варіант використання | Чому Headless? |
|---|---|
| StatefulSets | Потрібно звертатися до конкретних подів (pod-0, pod-1) |
| Балансування навантаження на боці клієнта | Клієнту потрібні всі IP-адреси для реалізації власного балансування |
| Виявлення сервісів (Service discovery) | Виявлення всіх інстансів бекенду |
| Кластери баз даних | Потрібне пряме підключення до конкретного вузла |
5.4 Ендпоінти Headless Сервісу
Розділ «5.4 Ендпоінти Headless Сервісу»# Endpoints still track podsk get endpoints headless-svc# NAME ENDPOINTS# headless-svc 10.244.1.5,10.244.2.8,10.244.1.12
# DNS returns multiple A recordsk run test --rm -it --image=busybox:1.36 --restart=Never -- \ nslookup headless-svc
# Output:# Name: headless-svc.default.svc.cluster.local# Address: 10.244.1.5# Address: 10.244.2.8# Address: 10.244.1.12Частина 6: Топологія Сервісів та Підказки Топології (Topology Hints)
Розділ «Частина 6: Топологія Сервісів та Підказки Топології (Topology Hints)»6.1 Топологічно-обізнана маршрутизація
Розділ «6.1 Топологічно-обізнана маршрутизація»EndpointSlices підтримують підказки топології для маршрутизації з урахуванням зон:
# EndpointSlice with hintsapiVersion: discovery.k8s.io/v1kind: EndpointSlicemetadata: name: web-svc-abc12endpoints:- addresses: - 10.244.1.5 zone: us-east-1a # Pod is in this zone hints: forZones: - name: us-east-1a # Prefer traffic from same zone6.2 Увімкнення Підказок Топології
Розділ «6.2 Увімкнення Підказок Топології»# Service with topology hintsapiVersion: v1kind: Servicemetadata: name: web-svc annotations: service.kubernetes.io/topology-mode: Auto # Enable hintsspec: selector: app: web ports: - port: 80Типові помилки
Розділ «Типові помилки»| Помилка | Проблема | Рішення |
|---|---|---|
| Неправильне ім’я ендпоінта | Ендпоінти не пов’язані з сервісом | Ім’я має точно збігатися з ім’ям сервісу |
| Друкарська помилка в селекторі | Немає ендпоінтів | Двічі перевірте селектори міток |
| Відсутній targetRef | Неможливо відстежити ендпоінт до пода | Включіть targetRef у ручні ендпоінти |
| Ігнорування NotReadyAddresses | Думаєте, що поди здорові | Перевіряйте вивід команди describe на наявність не готових (not-ready) подів |
| Плутанина між endpoints/endpointslices | Отримуєте неправильні дані | Використовуйте обидві команди для налагодження |
Тест
Розділ «Тест»-
Чому сервіс може показувати
<none>для ендпоінтів?Відповідь
Селектор сервісу не відповідає міткам жодних запущених подів, АБО жоден под з відповідними мітками не перебуває у стані Running. -
Як створити ендпоінти для зовнішнього сервісу?
Відповідь
1. Створіть Сервіс без селектора 2. Створіть об'єкт Endpoints з таким самим ім'ям, як і у сервісу 3. Додайте зовнішні IP-адреси до `subsets` в Endpoints -
Яка різниця між
addressesтаnotReadyAddressesв ендпоінтах?Відповідь
`addresses` містить IP-адреси подів, які готові та приймають трафік. `notReadyAddresses` містить IP-адреси подів, які не проходять свою пробу готовності (readiness probe) та не будуть отримувати трафік. -
Чому були впроваджені EndpointSlices?
Відповідь
Для кращої обробки великих сервісів. Один об'єкт Endpoints для тисяч подів викликав проблеми з продуктивністю. EndpointSlices розділяють ендпоінти на частини по 100, тому оновлення впливають лише на один зріз (slice). -
Що робить сервіс “headless” і що особливого в його ендпоінтах?
Відповідь
Встановлення `clusterIP: None` робить сервіс headless. Його ендпоінти повертаються безпосередньо через DNS (кілька A-записів) замість використання віртуального ClusterIP.
Практичні вправи
Розділ «Практичні вправи»Завдання: Налагодити сервіс з проблемами ендпоінтів.
Кроки:
- Створити деплоймент:
k create deployment web --image=nginx --replicas=3- Створити сервіс з неправильним селектором:
cat << 'EOF' | k apply -f -apiVersion: v1kind: Servicemetadata: name: broken-servicespec: selector: app: webapp # Wrong! Should be "web" ports: - port: 80EOF- Спостерігати за проблемою:
k get endpoints broken-service# Shows: <none>- Налагодити проблему:
# Check what selector the service hask get svc broken-service -o yaml | grep -A2 selector
# Check what labels the pods havek get pods --show-labels
# Find the mismatch!- Виправити сервіс:
k delete svc broken-servicek expose deployment web --port=80 --name=broken-service- Переконатися, що ендпоінти існують:
k get endpoints broken-service# Should show 3 pod IPs- Перевірити також EndpointSlices:
k get endpointslices -l kubernetes.io/service-name=broken-service- Протестувати з headless сервісом:
cat << 'EOF' | k apply -f -apiVersion: v1kind: Servicemetadata: name: headless-webspec: clusterIP: None selector: app: web ports: - port: 80EOF
# Check DNS returns multiple IPsk run test --rm -it --image=busybox:1.36 --restart=Never -- \ nslookup headless-web- Очищення:
k delete deployment webk delete svc broken-service headless-webКритерії успіху:
- Вміє знаходити відсутні ендпоінти
- Вміє налагоджувати невідповідності селекторів
- Розуміє різницю між endpoints та endpointslices
- Вміє створювати headless сервіси
- Розуміє відмінності у поведінці DNS
Практичні вправи
Розділ «Практичні вправи»Вправа 1: Перевірка Ендпоінтів (Ціль: 2 хвилини)
Розділ «Вправа 1: Перевірка Ендпоінтів (Ціль: 2 хвилини)»# Setupk create deployment drill --image=nginx --replicas=2k expose deployment drill --port=80
# Check endpointsk get endpoints drill
# Get detailed endpoint infok describe endpoints drill
# Get as YAML (see pod IPs)k get endpoints drill -o yaml
# Check EndpointSlicesk get endpointslices -l kubernetes.io/service-name=drill
# Cleanupk delete deployment drillk delete svc drillВправа 2: Налагодження відсутніх Ендпоінтів (Ціль: 3 хвилини)
Розділ «Вправа 2: Налагодження відсутніх Ендпоінтів (Ціль: 3 хвилини)»# Create deploymentk create deployment debug-app --image=nginx
# Create service with typo in selectorcat << 'EOF' | k apply -f -apiVersion: v1kind: Servicemetadata: name: debug-svcspec: selector: app: debug-apps # Typo: extra 's' ports: - port: 80EOF
# Observe problemk get endpoints debug-svc# <none>
# Debugk get pods --show-labelsk get svc debug-svc -o jsonpath='{.spec.selector}'
# Fixk delete svc debug-svck expose deployment debug-app --port=80 --name=debug-svc
# Verifyk get endpoints debug-svc
# Cleanupk delete deployment debug-appk delete svc debug-svcВправа 3: Ручні Ендпоінти (Ціль: 4 хвилини)
Розділ «Вправа 3: Ручні Ендпоінти (Ціль: 4 хвилини)»# Create service without selectorcat << 'EOF' | k apply -f -apiVersion: v1kind: Servicemetadata: name: external-svcspec: ports: - port: 80EOF
# Check - no endpoints yetk get endpoints external-svc
# Create manual endpointscat << 'EOF' | k apply -f -apiVersion: v1kind: Endpointsmetadata: name: external-svcsubsets:- addresses: - ip: 1.2.3.4 - ip: 5.6.7.8 ports: - port: 80EOF
# Verify endpointsk get endpoints external-svck describe endpoints external-svc
# Cleanupk delete svc external-svck delete endpoints external-svcВправа 4: Headless Сервіс (Ціль: 3 хвилини)
Розділ «Вправа 4: Headless Сервіс (Ціль: 3 хвилини)»# Create deploymentk create deployment headless-test --image=nginx --replicas=3
# Create headless servicecat << 'EOF' | k apply -f -apiVersion: v1kind: Servicemetadata: name: headlessspec: clusterIP: None selector: app: headless-test ports: - port: 80EOF
# Verify no ClusterIPk get svc headless# CLUSTER-IP should be "None"
# Check endpoints (still exist!)k get endpoints headless
# Test DNS - should return multiple IPsk run test --rm -it --image=busybox:1.36 --restart=Never -- \ nslookup headless
# Cleanupk delete deployment headless-testk delete svc headlessВправа 5: Аналіз EndpointSlice (Ціль: 3 хвилини)
Розділ «Вправа 5: Аналіз EndpointSlice (Ціль: 3 хвилини)»# Create deploymentk create deployment slice-test --image=nginx --replicas=3k expose deployment slice-test --port=80
# Get EndpointSlice namek get endpointslices -l kubernetes.io/service-name=slice-test
# Describe itSLICE_NAME=$(k get endpointslices -l kubernetes.io/service-name=slice-test -o jsonpath='{.items[0].metadata.name}')k describe endpointslice $SLICE_NAME
# Get YAMLk get endpointslice $SLICE_NAME -o yaml
# Note the endpoints array with conditions
# Cleanupk delete deployment slice-testk delete svc slice-testВправа 6: Готовність (Readiness) та Ендпоінти (Ціль: 4 хвилини)
Розділ «Вправа 6: Готовність (Readiness) та Ендпоінти (Ціль: 4 хвилини)»# Create pod with failing readiness probecat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: unready-pod labels: app: unreadyspec: containers: - name: nginx image: nginx readinessProbe: httpGet: path: /nonexistent port: 80 initialDelaySeconds: 1 periodSeconds: 2EOF
# Create servicek expose pod unready-pod --port=80 --name=unready-svc
# Wait a moment, then check endpointssleep 10k get endpoints unready-svc# Should be <none> or empty!
# Check whyk describe endpoints unready-svc# Look for notReadyAddresses
# Check pod statusk get pod unready-pod# Not ready due to probe
# Cleanupk delete pod unready-podk delete svc unready-svcВправа 7: Масштабування та відстеження Ендпоінтів (Ціль: 3 хвилини)
Розділ «Вправа 7: Масштабування та відстеження Ендпоінтів (Ціль: 3 хвилини)»# Create deploymentk create deployment watch-test --image=nginx --replicas=1k expose deployment watch-test --port=80
# Watch endpoints in terminal 1 (or background)k get endpoints watch-test -w &
# Scale up and observe endpoints changek scale deployment watch-test --replicas=5sleep 5
# Scale downk scale deployment watch-test --replicas=2sleep 5
# Bring watch to foreground and stopfg# Ctrl+C
# Cleanupk delete deployment watch-testk delete svc watch-testВправа 8: Виклик - Повний робочий процес Ендпоінтів
Розділ «Вправа 8: Виклик - Повний робочий процес Ендпоінтів»Без підглядання у рішення:
- Створіть деплоймент
ep-challengeз 3 репліками nginx - Створіть сервіс, який навмисно має неправильний селектор
- З’ясуйте, чому ендпоінти порожні
- Виправте сервіс
- Створіть headless сервіс для цього ж деплойменту
- Переконайтеся, що DNS повертає 3 IP-адреси для headless сервісу
- Створіть ручні ендпоінти для IP-адреси 10.0.0.1
- Очистіть усе
# YOUR TASK: Complete in under 6 minutesВідповідь
# 1. Create deploymentk create deployment ep-challenge --image=nginx --replicas=3
# 2. Create service with wrong selectorcat << 'EOF' | k apply -f -apiVersion: v1kind: Servicemetadata: name: wrong-svcspec: selector: app: wrong ports: - port: 80EOF
# 3. Diagnosek get endpoints wrong-svc# <none>k get pods --show-labels# Labels show app=ep-challenge, not app=wrong
# 4. Fixk delete svc wrong-svck expose deployment ep-challenge --port=80 --name=fixed-svck get endpoints fixed-svc# Shows 3 IPs
# 5. Create headless servicecat << 'EOF' | k apply -f -apiVersion: v1kind: Servicemetadata: name: headless-challengespec: clusterIP: None selector: app: ep-challenge ports: - port: 80EOF
# 6. Verify DNSk run test --rm -it --image=busybox:1.36 --restart=Never -- \ nslookup headless-challenge# Should show 3 IPs
# 7. Manual endpointscat << 'EOF' | k apply -f -apiVersion: v1kind: Servicemetadata: name: manual-svcspec: ports: - port: 80---apiVersion: v1kind: Endpointsmetadata: name: manual-svcsubsets:- addresses: - ip: 10.0.0.1 ports: - port: 80EOFk get endpoints manual-svc
# 8. Cleanupk delete deployment ep-challengek delete svc fixed-svc headless-challenge manual-svck delete endpoints manual-svcНаступний модуль
Розділ «Наступний модуль»Модуль 3.3: DNS та CoreDNS - Глибоке занурення у Kubernetes DNS та виявлення сервісів.