Локальное окружение: 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 перед merge —
kubectl 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-node | macOS only |
| Docker Desktop k8s | ~2 мин | Docker VM | Single-node | macOS/Windows |
Для этого курса рекомендация — 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/...
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
Сохраняем в .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.