Learning Platform
Глоссарий Troubleshooting
Урок 04.05 · 18 мин
Начальный
kindminikubek3sautocompletealiasvimCKAD

Локальное окружение: kind, alias, autocomplete, vim для CKAD

Все последующие модули курса предполагают, что у вас есть кластер, в котором можно безнаказанно ломать вещи. Production EKS не подходит — за kubectl delete namespace prod вас уволят. Нужно что-то локальное, лёгкое, быстро поднимающееся. Этот урок — про настройку такого окружения и про шорткаты, которые нужно завести сейчас, чтобы не потерять полчаса на экзамене. После этого урока у вас будет: запущенный multi-node cluster, autocomplete для kubectl, alias k, переменные $do и $now, готовый vim для YAML. И всё это — за 15 минут.


Первые проверки после установки Docker: version, info, hello-world

Зачем local cluster

Causes для локального cluster:

  • Эксперименты — попробовать новый ресурс, новый flag без риска сломать прод.
  • Labs курса — модули 04-19 содержат hands-on labs, которые на real cluster не сделаешь (нет permissions).
  • Reproduce production bugs — снять состояние с прода, накатить локально, искать причину.
  • Test manifests перед mergekubectl apply -f в local cluster ловит 80% YAML-ошибок до code review.
  • CI/CD smoke tests — github actions поднимает kind, гоняет интеграционные тесты, тушит. Минута на job.

Главный критерий — скорость подъёма. Если cluster поднимается 5 минут — вы будете прокрастинировать его поднятие. Если 30 секунд — поднимаете походя.


Кандидаты: kind vs minikube vs k3s vs OrbStack

Время стартаИзоляцияMulti-nodeПлатформа
kind~30 секDocker containers per nodeДаLinux/macOS/Windows + Docker
minikube~2 минVM или DockerДа (через --nodes)Linux/macOS/Windows
k3s~10 секsystemd на хостеДаLinux только
k3d~30 секDocker containers (k3s внутри)ДаLinux/macOS/Windows + Docker
OrbStack k8s~30 секOrbStack VM (только macOS)Single-nodemacOS only
Docker Desktop k8s~2 минDocker VMSingle-nodemacOS/Windows
Local clusters: где что запускается
kindKubernetes IN Docker. Один control plane Pod, kubelet и т.д. — всё внутри одного Docker контейнера. Multi-node = несколько контейнеров с containerd внутри. Топчик для CI и быстрого dev.
minikubeЗапускает Kubernetes в VM (qemu, hyperkit, hyperv, kvm) или в Docker. Тяжелее kind, но ближе к настоящему cluster (отдельная VM с своим Linux). Удобен для feature-rich дев-сред.
k3sLightweight K8s от Rancher. Один бинарь (~50 MB), запускается systemd-сервисом прямо на хосте. Меньше features (без CSI snapshots и т.п.), но молниеносный старт. Используется в edge и IoT.
k3dk3s in Docker. Та же скорость, что k3s, но переносимый между ОС через Docker. Альтернатива kind с меньшим overhead.

Для этого курса рекомендация — kind. Он быстрый, кросс-платформенный, идеален для labs. Если вы на macOS и уже стоит OrbStack — встроенный k8s тоже подойдёт, но multi-node сценарии в OrbStack ограничены.


Установка kind

# macOS
brew install kind

# Linux amd64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64
chmod +x ./kind && sudo mv ./kind /usr/local/bin/kind

# Windows (PowerShell)
curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.24.0/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

# Через Go
go install sigs.k8s.io/[email protected]

Проверка:

kind version
# kind v0.27.0 go1.23.x darwin/arm64

Зависимость: kind требует Docker (или podman, OrbStack, containerd). Запущенный docker daemon — обязательное условие.


Создание single-node cluster

Самый простой случай — один node:

kind create cluster --name ckad
# Creating cluster "ckad" ...
#  ✓ Ensuring node image (kindest/node:v1.35.0) 🖼
#  ✓ Preparing nodes 📦
#  ✓ Writing configuration 📄
#  ✓ Starting control-plane 🕹️
#  ✓ Installing CNI 🔌
#  ✓ Installing StorageClass 💾
# Set kubectl context to "kind-ckad"

# Что произошло:
kubectl config current-context     # kind-ckad
kubectl cluster-info               # API server URL + CoreDNS
kubectl get nodes                  # один node готов
kubectl get pods -A                # системные Pod-ы в kube-system

kind автоматически добавляет context kind-ckad в ваш ~/.kube/config. Дальше работаете обычным kubectl.

Удалить:

kind delete cluster --name ckad

Multi-node cluster через YAML config

Для labs курса нам пригодится cluster с несколькими worker-узлами, чтобы тестировать nodeAffinity, taints, NetworkPolicies:

# kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: ckad
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
- role: worker
  labels:
    tier: frontend
- role: worker
  labels:
    tier: backend
- role: worker
  labels:
    tier: data
kind create cluster --config kind-config.yaml
# 4 узла: 1 control-plane + 3 workers

kubectl get nodes
# NAME                  STATUS   ROLES           AGE   VERSION
# ckad-control-plane    Ready    control-plane   2m    v1.31.0
# ckad-worker           Ready    <none>          90s   v1.31.0
# ckad-worker2          Ready    <none>          90s   v1.31.0
# ckad-worker3          Ready    <none>          90s   v1.31.0

kubectl get nodes --show-labels | head
# ckad-worker  Ready  <none>  90s  v1.31.0  tier=frontend,kubernetes.io/...
NOTE

kindest/node:v1.35.0 — образ ноды, обновляется отдельно от kind. Каждый kind-release фиксирует список поддерживаемых K8s версий — используйте actual kindest/node:v1.35.X для подготовки к CKAD v1.35. При подготовке к CKAD держите версию ноды максимально близкой к экзаменационной.


Проверка кластера после создания

Три команды, которые подтверждают, что cluster жив:

# 1. Endpoints control plane доступны
kubectl cluster-info
# Kubernetes control plane is running at https://127.0.0.1:50000
# CoreDNS is running at https://127.0.0.1:50000/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

# 2. Все узлы Ready
kubectl get nodes
# Все должны быть STATUS=Ready

# 3. Системные Pod-ы запущены
kubectl get pods -A
# kube-system  coredns-...           1/1  Running
# kube-system  etcd-...              1/1  Running
# kube-system  kube-apiserver-...    1/1  Running
# kube-system  kube-controller-...   1/1  Running
# kube-system  kube-proxy-...        1/1  Running
# kube-system  kube-scheduler-...    1/1  Running
# local-path...local-path-provisioner 1/1  Running

Если что-то не Ready или Pending — kubectl describe pod <name> -n kube-system покажет Events с причиной.


kubectl autocomplete

Без autocomplete CKAD — пытка. Полный список ресурсов, шортнэймы, флаги — всё запомнить нельзя, и не нужно. Tab после kubectl get d выведет daemonsets, deployments. Tab после kubectl get pod — список pod-имён.

# Bash — однократно проверить, что bash-completion установлен
type _init_completion  # должна быть функция, если нет:
# Linux: apt install bash-completion
# macOS: brew install bash-completion@2 + добавить в .bash_profile

# Включить kubectl autocomplete (текущая сессия)
source <(kubectl completion bash)

# Сохранить навсегда
echo 'source <(kubectl completion bash)' >> ~/.bashrc

Для zsh:

# Включить
source <(kubectl completion zsh)

# Сохранить
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
echo 'compdef __start_kubectl k' >> ~/.zshrc   # для alias k

Fish:

kubectl completion fish | source

CKAD alias setup: must-have

В начале CKAD-экзамена первое, что делаете — настройка alias. Это разрешено, и без них вы не успеете. Стандартный пакет:

# 1. Alias на kubectl
alias k=kubectl
complete -F __start_kubectl k     # autocomplete и для k тоже

# 2. dry-run + YAML generator
export do='--dry-run=client -o yaml'
# Использование:
#   k run web --image=nginx $do > pod.yaml
#   k create deployment app --image=nginx $do > deploy.yaml

# 3. Force delete без grace period
export now='--grace-period=0 --force'
# Использование:
#   k delete pod web $now
# Эквивалент:
#   kubectl delete pod web --grace-period=0 --force
CKAD комбо: alias + переменные
k = kubectlАлиас на kubectl. 6 символов меньше каждой команды. На экзамене 200+ команд за 2 часа — экономия минут.
$do--dry-run=client -o yaml. Генерация YAML заготовки. k run web --image=nginx $do > pod.yaml — стандартный паттерн для всех задач, требующих YAML.
$now--grace-period=0 --force. Immediate delete. Когда нужно пересоздать Pod (immutable spec change) — k delete pod web $now && k apply -f web.yaml. На несколько секунд быстрее обычного delete.
комбо
k run web --image=nginx $do | tee pod.yamlRun + dry-run + YAML + view + сохранить — одна строка. tee показывает на экран И записывает в файл. Дальше vim pod.yaml для доработки.

Сохраняем в .bashrc (домашний setup):

cat <<'EOF' >> ~/.bashrc
alias k=kubectl
source <(kubectl completion bash)
complete -F __start_kubectl k
export do='--dry-run=client -o yaml'
export now='--grace-period=0 --force'
EOF

# Применить
source ~/.bashrc

На CKAD это нужно вбить заново в начале экзамена. Время — 30 секунд, экономия — десятки минут.


vim/nano setup для YAML

YAML — отступы значимы. Вкладка вместо двух пробелов = error: yaml: line N: found character that cannot start any token. Нужно настроить редактор так, чтобы Tab = 2 пробела автоматически.

vim (~/.vimrc):

" Базовый setup для YAML
set tabstop=2
set expandtab
set shiftwidth=2
set softtabstop=2
set number
syntax on

" Только для YAML файлов
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab

nano (~/.nanorc):

set tabsize 2
set tabstospaces
set autoindent
set linenumbers
include "/usr/share/nano/yaml.nanorc"

На CKAD у вас будет vim или nano (выбор пользователя). Запоминать команды редактора нет смысла — нужна минимальная навигация: i для вставки, Esc для выхода в normal, :wq для сохранения и выхода, :q! для выхода без сохранения. Если умеете больше — отлично, но базовый набор покрывает 100% сценариев.


Полный setup checklist

После этого урока у вас должно быть:

  • Установлен kubectl нужной версии (kubectl version --client).
  • Установлен kind или другой local cluster tool.
  • Поднят локальный cluster (kind create cluster --name ckad).
  • kubectl get nodes возвращает Ready узлы.
  • kubectl get pods -A показывает запущенные системные Pod-ы.
  • Включён autocomplete для bash/zsh.
  • alias k=kubectl + complete -F __start_kubectl k.
  • export do='--dry-run=client -o yaml'.
  • export now='--grace-period=0 --force'.
  • ~/.vimrc или ~/.nanorc настроен под YAML.

Если всё — следующий модуль уже про Pods: создание, lifecycle, container images. Все labs будут идти на вашем kind-кластере с этими alias-ами.


Что дальше

Модуль завершён. Вы знаете: что такое kubectl как HTTP-клиент, как устроен kubeconfig, разницу imperative vs declarative, навигацию по API через explain, и у вас есть рабочее окружение. В следующем модуле — Pods. Минимальная единица планирования K8s, её lifecycle, init containers, ephemeral containers, всё про образы и pullPolicy.


Проверка знанийKnowledge check
Для labs курса нужен local cluster, готовый за 30 секунд, кросс-платформенный, поддерживающий multi-node. Какой инструмент выбрать и почему? Опишите минимальный config для cluster с 1 control plane + 3 workers с разными labels (tier=frontend/backend/data).
ОтветAnswer
Выбор — kind (Kubernetes IN Docker). Причины: (1) Старт за 30 секунд против 2 минут у minikube. (2) Кросс-платформенный — работает везде, где есть Docker (Linux/macOS/Windows). (3) Multi-node нативно поддерживается через YAML config. (4) k3s быстрее, но только Linux; minikube кросс-платформенный, но тяжелее; OrbStack — только macOS и single-node. Минимальный config — YAML с kind: Cluster, apiVersion: kind.x-k8s.io/v1alpha4, в nodes указать 1 объект role: control-plane и 3 объекта role: worker, каждому worker в labels добавить tier: frontend / tier: backend / tier: data. Запуск: kind create cluster --config kind-config.yaml --name ckad. После создания kubectl автоматически переключится на context kind-ckad, kubectl get nodes покажет 4 узла Ready, на workers будут labels, по которым можно делать nodeAffinity / nodeSelector в labs.

Проверьте понимание

Результат: 0 из 0
Прикладной
Вопрос 1 из 5. Для labs курса (Linux + macOS пользователи, нужны multi-node сценарии для NetworkPolicy и nodeAffinity, быстрый старт) — какой инструмент выбрать?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5