Модуль 0.2: Робочий процес розробника
Складність:
[QUICK]- Основні шаблони kubectlЧас на проходження: 25-30 хвилин
Передумови: Модуль 0.1 (Огляд CKAD), Модуль 0.2 CKA (Володіння оболонкою)
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Налаштувати псевдоніми kubectl, автодоповнення оболонки та ярлики, специфічні для CKAD, для максимальної швидкості
- Створити ресурси Kubernetes імперативно за допомогою
kubectl run,kubectl createтаkubectl expose - Діагностувати проблеми з ресурсами швидко за допомогою
kubectl describe,kubectl logsтаkubectl exec - Пояснити робочий процес kubectl, орієнтований на розробника, що відрізняє завдання CKAD від CKA
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»CKAD — це про швидкість ТА правильність. У вас є 2 години на ~15-20 завдань. Кожна секунда має значення. Різниця між успішним і провальним результатом часто полягає не в знаннях, а у швидкості виконання.
Цей модуль зосереджений на специфічних для розробника шаблонах kubectl, які ви будете використовувати постійно. Якщо ви пройшли програму CKA, у вас вже налаштовані псевдоніми (aliases) та автодоповнення. Тут ми додаємо оптимізації спеціально для CKAD.
Аналогія: Пояс з інструментами теслі
Майстер-тесля не порпається в ящику для інструментів заради кожного цвяха. Найчастіше використовувані інструменти висять у нього на поясі, розміщені для миттєвого доступу. Аналогічно, ваші найбільш вживані шаблони kubectl повинні бути під рукою — створені як псевдоніми, запам’ятовані та відпрацьовані до рівня м’язової пам’яті.
Важливі псевдоніми (Aliases) для CKAD
Розділ «Важливі псевдоніми (Aliases) для CKAD»Якщо ви пройшли програму CKA, вони у вас уже є. Якщо ні, додайте їх зараз:
# Add to ~/.bashrc or ~/.zshrc
# Basic alias (MUST have)alias k='kubectl'
# Common actionsalias kaf='kubectl apply -f'alias kdel='kubectl delete'alias kd='kubectl describe'alias kg='kubectl get'alias kl='kubectl logs'alias kx='kubectl exec -it'
# Output formatsalias kgy='kubectl get -o yaml'alias kgw='kubectl get -o wide'
# Dry-run pattern (CKAD essential)alias kdr='kubectl --dry-run=client -o yaml'
# Quick runalias kr='kubectl run'
# Watchalias kgpw='kubectl get pods -w'Доповнення спеціально для CKAD
Розділ «Доповнення спеціально для CKAD»# Jobs and CronJobs (CKAD heavy)alias kcj='kubectl create job'alias kccj='kubectl create cronjob'
# Quick debug podalias kdebug='kubectl run debug --image=busybox --rm -it --restart=Never --'
# Logs with container selectionalias klc='kubectl logs -c'
# Fast context switchalias kctx='kubectl config use-context'alias kns='kubectl config set-context --current --namespace'Шаблон Dry-Run: Ваш найкращий друг
Розділ «Шаблон Dry-Run: Ваш найкращий друг»Шаблон --dry-run=client -o yaml генерує YAML без створення ресурсів. Це необхідно для CKAD:
# Generate pod YAMLk run nginx --image=nginx $kdr > pod.yaml
# Generate deployment YAMLk create deploy web --image=nginx --replicas=3 $kdr > deploy.yaml
# Generate job YAMLk create job backup --image=busybox -- echo done $kdr > job.yaml
# Generate service YAMLk expose deploy web --port=80 $kdr > svc.yamlЗмінна $kdr
Розділ «Змінна $kdr»Встановіть її для ще швидшої генерації YAML:
export kdr='--dry-run=client -o yaml'
# Now use it anywherek run nginx --image=nginx $kdr > pod.yamlk create deploy web --image=nginx $kdr > deploy.yamlГенерація YAML для багатоконтейнерного Пода
Розділ «Генерація YAML для багатоконтейнерного Пода»Це фірмова навичка CKAD. Ви не можете створювати багатоконтейнерні Поди імперативно — вам потрібен YAML. Ось найшвидший підхід:
Крок 1: Згенеруйте базовий YAML
Розділ «Крок 1: Згенеруйте базовий YAML»k run multi --image=nginx $kdr > multi-pod.yamlКрок 2: Додайте другий контейнер
Розділ «Крок 2: Додайте другий контейнер»Відредагуйте файл і продублюйте розділ контейнера:
apiVersion: v1kind: Podmetadata: name: multispec: containers: - name: nginx image: nginx - name: sidecar # Add this image: busybox # Add this command: ["sleep", "3600"] # Add thisПрактикуйте до автоматизму
Розділ «Практикуйте до автоматизму»Цей шаблон зустрічається приблизно у 20% запитань CKAD. Ви повинні вміти:
- Згенерувати базовий YAML
- Додати контейнер sidecar
- Застосувати та перевірити
Усе це менш ніж за 2 хвилини.
Шаблони швидкого тестування
Розділ «Шаблони швидкого тестування»В CKAD часто просять перевірити вашу роботу. Ці шаблони допоможуть:
Тестування підключення від Пода до Сервісу
Розділ «Тестування підключення від Пода до Сервісу»# One-liner test podk run test --image=busybox --rm -it --restart=Never -- wget -qO- http://service-name
# DNS resolution testk run test --image=busybox --rm -it --restart=Never -- nslookup service-name
# Test with curlk run test --image=curlimages/curl --rm -it --restart=Never -- curl http://service-nameШвидка перевірка логів Пода
Розділ «Швидка перевірка логів Пода»# Last 10 linesk logs pod-name --tail=10
# Follow logsk logs pod-name -f
# Specific container in multi-container podk logs pod-name -c container-name
# Previous container (if restarted)k logs pod-name --previousЗневадження всередині контейнера
Розділ «Зневадження всередині контейнера»# Interactive shellk exec -it pod-name -- sh
# Specific containerk exec -it pod-name -c container-name -- sh
# Run a single commandk exec pod-name -- cat /etc/config/app.confJSON Path для швидкого вилучення даних
Розділ «JSON Path для швидкого вилучення даних»Деякі запитання CKAD вимагають конкретних значень. JSONPath стає у пригоді:
# Get pod IPk get pod nginx -o jsonpath='{.status.podIP}'
# Get all pod IPsk get pods -o jsonpath='{.items[*].status.podIP}'
# Get container imagek get pod nginx -o jsonpath='{.spec.containers[0].image}'
# Get node where pod runsk get pod nginx -o jsonpath='{.spec.nodeName}'Поширені шаблони JSONPath для CKAD
Розділ «Поширені шаблони JSONPath для CKAD»# All container names in a podk get pod multi -o jsonpath='{.spec.containers[*].name}'
# All service cluster IPsk get svc -o jsonpath='{.items[*].spec.clusterIP}'
# ConfigMap datak get cm myconfig -o jsonpath='{.data.key}'
# Secret data (base64 encoded)k get secret mysecret -o jsonpath='{.data.password}' | base64 -dУправління Простором імен
Розділ «Управління Простором імен»Запитання CKAD часто вказують Простори імен. Будьте швидкими:
# Create namespacek create ns dev
# Set default namespace for sessionk config set-context --current --namespace=dev
# Run command in specific namespacek get pods -n prod
# All namespacesk get pods -AПорада від профі: Спочатку перевіряйте Простір імен
Розділ «Порада від профі: Спочатку перевіряйте Простір імен»Багато кандидатів провалюють завдання на іспиті, тому що працюють не в тому Просторі імен. Завжди перевіряйте:
# Check current namespacek config view --minify | grep namespace
# Or set it explicitly in each commandk get pods -n specified-namespaceШвидкість Vim для редагування YAML
Розділ «Швидкість Vim для редагування YAML»Ви будете постійно редагувати YAML. Ці налаштування Vim допоможуть:
" Add to ~/.vimrcset tabstop=2set shiftwidth=2set expandtabset autoindentОсновні команди Vim для YAML
Розділ «Основні команди Vim для YAML»" Copy a lineyy
" Paste belowp
" Delete a linedd
" Indent a block (visual mode)>>
" Unindent a block<<
" Search for text/searchterm
" Jump to line 50:50
" Save and quit:wqКопіювання блоків YAML
Розділ «Копіювання блоків YAML»Додаючи контейнер sidecar, ви будете копіювати наявну специфікацію контейнера:
1. Position cursor on the line with "- name:"2. V (visual line mode)3. Move down to select all container lines4. y (yank/copy)5. Move to where you want the new container6. p (paste)7. Edit the pasted blockЧи знали ви?
Розділ «Чи знали ви?»-
Прапорець
--restart=Neverє критично важливим для тестових Подів. Без нього Kubernetes створює Деплоймент замість звичайного Пода. Прапорець--rmвидаляє Под після його завершення — ідеально для одноразових тестів. -
Ви можете поєднати
-itта--rmдля ефемерних сеансів зневадження. Под запускається інтерактивно та зникає після виходу. -
JSONPath в kubectl використовує той самий синтаксис, що й API Kubernetes. Його практика допомагає як на іспиті, так і в реальній автоматизації.
Типові помилки
Розділ «Типові помилки»| Помилка | Чому це шкодить | Рішення |
|---|---|---|
Забутий прапорець --restart=Never | Створює Деплоймент замість Пода | Зробіть це частиною свого шаблону тестування |
| Неправильний Простір імен | Ресурси створюються в default | Завжди спочатку перевіряйте/встановлюйте Простір імен |
| Редагування YAML з неправильним відступом | Недійсний YAML, незрозумілі помилки | Використовуйте :set paste у Vim перед вставленням |
Невикористання --dry-run | Повільніше створення YAML | Зробіть використання змінної $kdr своєю другою натурою |
| Забагато пошуку в документації | Витрачений час | Запам’ятайте типові специфікації |
Тест
Розділ «Тест»-
Яка команда генерує YAML для Job без створення ресурсу?
Відповідь
`kubectl create job myjob --image=busybox -- echo done --dry-run=client -o yaml` -
Як створити тестовий Под, який автоматично видаляється після запуску wget?
Відповідь
`kubectl run test --image=busybox --rm -it --restart=Never -- wget -qO- http://service` -
Який JSONPath використовується для отримання образу першого контейнера з Пода?
Відповідь
`kubectl get pod podname -o jsonpath='{.spec.containers[0].image}'` -
Як встановити Простір імен за замовчуванням для поточного контексту?
Відповідь
`kubectl config set-context --current --namespace=namespace-name`
Практичне завдання
Розділ «Практичне завдання»Завдання: Відпрацюйте шаблони робочого процесу розробника CKAD.
Частина 1: Майстерність Dry-Run (Ціль: 3 хвилини)
# Generate these YAML files using --dry-run# 1. Pod named 'web' with nginx image# 2. Deployment named 'api' with httpd image, 2 replicas# 3. Job named 'backup' that echoes "complete"# 4. CronJob named 'hourly' running every hourЧастина 2: Створення кількох контейнерів (Ціль: 4 хвилини)
# Create a pod with two containers:# - main: nginx# - sidecar: busybox running "sleep 3600"Частина 3: Швидке тестування (Ціль: 2 хвилини)
# Test connectivity to a service# Verify pod logs work# Execute a command in a containerКритерії успіху:
- Усі файли YAML згенеровано правильно
- Багатоконтейнерний Под працює з обома контейнерами в стані Ready
- Тестові команди виконуються успішно
Практичні вправи
Розділ «Практичні вправи»Вправа 1: Перевірка псевдонімів (Ціль: 1 хвилина)
Розділ «Вправа 1: Перевірка псевдонімів (Ціль: 1 хвилина)»Перевірте, чи працюють ваші псевдоніми:
# These should all workk get podskgy pod nginx # Get YAML of a podkdr # Should echo "--dry-run=client -o yaml"Вправа 2: Швидкість генерації YAML (Ціль: 5 хвилин)
Розділ «Вправа 2: Швидкість генерації YAML (Ціль: 5 хвилин)»Згенеруйте YAML для кожного типу ресурсу, не підглядаючи в нотатки:
# Podk run nginx --image=nginx $kdr > /tmp/pod.yaml
# Deploymentk create deploy web --image=nginx $kdr > /tmp/deploy.yaml
# Servicek create svc clusterip mysvc --tcp=80:80 $kdr > /tmp/svc.yaml
# Jobk create job backup --image=busybox -- echo done $kdr > /tmp/job.yaml
# CronJobk create cronjob hourly --image=busybox --schedule="0 * * * *" -- date $kdr > /tmp/cronjob.yaml
# ConfigMapk create cm myconfig --from-literal=key=value $kdr > /tmp/cm.yaml
# Secretk create secret generic mysecret --from-literal=password=secret $kdr > /tmp/secret.yamlВправа 3: Швидкість створення багатоконтейнерного Пода (Ціль: 3 хвилини)
Розділ «Вправа 3: Швидкість створення багатоконтейнерного Пода (Ціль: 3 хвилини)»Створіть багатоконтейнерний Под з нуля:
# Generate basek run multi --image=nginx $kdr > /tmp/multi.yaml
# Edit to add sidecar (use vim)vim /tmp/multi.yaml
# Applyk apply -f /tmp/multi.yaml
# Verify both containers runningk get pod multi -o jsonpath='{.spec.containers[*].name}'# Expected: nginx sidecar
# Cleanupk delete pod multiВправа 4: Вилучення JSONPath (Ціль: 3 хвилини)
Розділ «Вправа 4: Вилучення JSONPath (Ціль: 3 хвилини)»# Create a test pod firstk run nginx --image=nginx
# Wait for runningk wait --for=condition=Ready pod/nginx
# Extract these values using JSONPath:# 1. Pod IPk get pod nginx -o jsonpath='{.status.podIP}'
# 2. Container imagek get pod nginx -o jsonpath='{.spec.containers[0].image}'
# 3. Node namek get pod nginx -o jsonpath='{.spec.nodeName}'
# 4. Pod phase (Running/Pending/etc)k get pod nginx -o jsonpath='{.status.phase}'
# Cleanupk delete pod nginxВправа 5: Робочий процес із Просторами імен (Ціль: 2 хвилини)
Розділ «Вправа 5: Робочий процес із Просторами імен (Ціль: 2 хвилини)»# Create a namespacek create ns ckad-test
# Set as defaultk config set-context --current --namespace=ckad-test
# Verifyk config view --minify | grep namespace
# Create a pod (should go to ckad-test)k run nginx --image=nginx
# Verify pod is in ckad-testk get pods # Should show nginxk get pods -n default # Should NOT show nginx
# Reset namespacek config set-context --current --namespace=default
# Cleanupk delete ns ckad-testВправа 6: Повний робочий процес розробника (Ціль: 8 хвилин)
Розділ «Вправа 6: Повний робочий процес розробника (Ціль: 8 хвилин)»Зімітуйте завдання CKAD від початку до кінця:
Сценарій: Створіть вебдодаток із sidecar, який логує доступ.
# 1. Create namespacek create ns web-app
# 2. Set namespacek config set-context --current --namespace=web-app
# 3. Generate multi-container pod YAMLk run webapp --image=nginx $kdr > /tmp/webapp.yaml
# 4. Edit to add sidecar (logs container)# Add this container:# - name: logger# image: busybox# command: ["sh", "-c", "tail -f /var/log/nginx/access.log"]# volumeMounts:# - name: logs# mountPath: /var/log/nginx
# 5. Applyk apply -f /tmp/webapp.yaml
# 6. Verify both containers runningk get pod webapp -o widek describe pod webapp | grep -A5 Containers
# 7. Test connectivityk expose pod webapp --port=80k run test --image=busybox --rm -it --restart=Never -- wget -qO- http://webapp
# 8. Cleanupk config set-context --current --namespace=defaultk delete ns web-appНаступний модуль
Розділ «Наступний модуль»Модуль 1.1: Образи контейнерів — Збірка, тегування та пуш образів контейнерів для CKAD.