diff --git a/Makefile b/Makefile index 548be9d..8b3a87b 100644 --- a/Makefile +++ b/Makefile @@ -1197,6 +1197,158 @@ k8s: echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \ echo "💡 Запустите: make k8s create $$PRESET_ARG"; \ fi;; \ + manifest) \ + echo "📄 Работа с манифестами..."; \ + MANIFEST_CMD="$(word 3, $(MAKECMDGOALS))"; \ + PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \ + MANIFEST_ARG="$(word 5, $(MAKECMDGOALS))"; \ + if [ -z "$$MANIFEST_CMD" ] || [ -z "$$PRESET_ARG" ] || [ -z "$$MANIFEST_ARG" ]; then \ + echo "❌ Ошибка: Укажите команду, пресет и путь к манифесту"; \ + echo "💡 Пример: make k8s manifest apply kubernetes https://example.com/manifest.yaml"; \ + exit 1; \ + fi; \ + CONTAINER_NAME=k8s-$$PRESET_ARG; \ + if ! docker ps | grep -q $$CONTAINER_NAME; then \ + echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \ + echo "💡 Запустите: make k8s create $$PRESET_ARG"; \ + exit 1; \ + fi; \ + CLUSTER_NAME=$$(docker exec $$CONTAINER_NAME kind get clusters | head -1); \ + case "$$MANIFEST_CMD" in \ + apply) \ + echo "📥 Применение манифеста: $$MANIFEST_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify apply -f $$MANIFEST_ARG";; \ + delete) \ + echo "🗑️ Удаление ресурсов из манифеста: $$MANIFEST_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify delete -f $$MANIFEST_ARG";; \ + update) \ + echo "🔄 Обновление манифеста: $$MANIFEST_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify apply -f $$MANIFEST_ARG --force";; \ + *) \ + echo "❌ Неизвестная команда: $$MANIFEST_CMD"; \ + echo "💡 Доступные команды: apply, delete, update"; \ + exit 1;; \ + esac;; \ + helm) \ + echo "📦 Работа с Helm..."; \ + HELM_CMD="$(word 3, $(MAKECMDGOALS))"; \ + PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \ + RELEASE_ARG="$(word 5, $(MAKECMDGOALS))"; \ + CHART_ARG="$(word 6, $(MAKECMDGOALS))"; \ + if [ -z "$$HELM_CMD" ] || [ -z "$$PRESET_ARG" ]; then \ + echo "❌ Ошибка: Укажите команду и пресет"; \ + echo "💡 Пример: make k8s helm list kubernetes"; \ + exit 1; \ + fi; \ + CONTAINER_NAME=k8s-$$PRESET_ARG; \ + if ! docker ps | grep -q $$CONTAINER_NAME; then \ + echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \ + echo "💡 Запустите: make k8s create $$PRESET_ARG"; \ + exit 1; \ + fi; \ + CLUSTER_NAME=$$(docker exec $$CONTAINER_NAME kind get clusters | head -1); \ + case "$$HELM_CMD" in \ + apply) \ + if [ -z "$$RELEASE_ARG" ] || [ -z "$$CHART_ARG" ]; then \ + echo "❌ Ошибка: Укажите имя релиза и чарт"; \ + echo "💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress"; \ + exit 1; \ + fi; \ + echo "📦 Установка Helm чарта: $$CHART_ARG как $$RELEASE_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade --install $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \ + delete) \ + if [ -z "$$RELEASE_ARG" ]; then \ + echo "❌ Ошибка: Укажите имя релиза"; \ + echo "💡 Пример: make k8s helm delete kubernetes my-release"; \ + exit 1; \ + fi; \ + echo "🗑️ Удаление Helm релиза: $$RELEASE_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm uninstall $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \ + update) \ + if [ -z "$$RELEASE_ARG" ] || [ -z "$$CHART_ARG" ]; then \ + echo "❌ Ошибка: Укажите имя релиза и чарт"; \ + echo "💡 Пример: make k8s helm update kubernetes my-release stable/nginx-ingress"; \ + exit 1; \ + fi; \ + echo "🔄 Обновление Helm релиза: $$RELEASE_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \ + rollback) \ + if [ -z "$$RELEASE_ARG" ]; then \ + echo "❌ Ошибка: Укажите имя релиза"; \ + echo "💡 Пример: make k8s helm rollback kubernetes my-release"; \ + exit 1; \ + fi; \ + echo "⏪ Откат Helm релиза: $$RELEASE_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm rollback $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \ + list) \ + echo "📋 Список Helm релизов:"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm list --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy --all-namespaces 2>&1 | grep -v '^WARNING' || true";; \ + status) \ + if [ -z "$$RELEASE_ARG" ]; then \ + echo "❌ Ошибка: Укажите имя релиза"; \ + echo "💡 Пример: make k8s helm status kubernetes my-release"; \ + exit 1; \ + fi; \ + echo "📊 Статус Helm релиза: $$RELEASE_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm status $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \ + *) \ + echo "❌ Неизвестная команда: $$HELM_CMD"; \ + echo "💡 Доступные команды: apply, delete, update, rollback, list, status"; \ + exit 1;; \ + esac;; \ + helmrepo) \ + echo "🏪 Работа с Helm репозиториями..."; \ + REPO_CMD="$(word 3, $(MAKECMDGOALS))"; \ + PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \ + NAME_ARG="$(word 5, $(MAKECMDGOALS))"; \ + URL_ARG="$(word 6, $(MAKECMDGOALS))"; \ + if [ -z "$$REPO_CMD" ] || [ -z "$$PRESET_ARG" ]; then \ + echo "❌ Ошибка: Укажите команду и пресет"; \ + echo "💡 Пример: make k8s helmrepo list kubernetes"; \ + exit 1; \ + fi; \ + CONTAINER_NAME=k8s-$$PRESET_ARG; \ + if ! docker ps | grep -q $$CONTAINER_NAME; then \ + echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \ + echo "💡 Запустите: make k8s create $$PRESET_ARG"; \ + exit 1; \ + fi; \ + case "$$REPO_CMD" in \ + add) \ + if [ -z "$$NAME_ARG" ] || [ -z "$$URL_ARG" ]; then \ + echo "❌ Ошибка: Укажите имя и URL репозитория"; \ + echo "💡 Пример: make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable"; \ + exit 1; \ + fi; \ + echo "➕ Добавление Helm репозитория: $$NAME_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "helm repo add $$NAME_ARG $$URL_ARG 2>&1 | grep -v '^WARNING' || true; helm repo update";; \ + list) \ + echo "📋 Список Helm репозиториев:"; \ + docker exec $$CONTAINER_NAME bash -c "helm repo list 2>&1 | grep -v '^WARNING' || true";; \ + delete) \ + if [ -z "$$NAME_ARG" ]; then \ + echo "❌ Ошибка: Укажите имя репозитория"; \ + echo "💡 Пример: make k8s helmrepo delete kubernetes stable"; \ + exit 1; \ + fi; \ + echo "🗑️ Удаление Helm репозитория: $$NAME_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "helm repo remove $$NAME_ARG 2>&1 | grep -v '^WARNING' || true";; \ + update) \ + echo "🔄 Обновление Helm репозиториев"; \ + docker exec $$CONTAINER_NAME bash -c "helm repo update 2>&1 | grep -v '^WARNING' || true";; \ + packages) \ + if [ -z "$$NAME_ARG" ]; then \ + echo "❌ Ошибка: Укажите имя репозитория"; \ + echo "💡 Пример: make k8s helmrepo packages kubernetes stable"; \ + exit 1; \ + fi; \ + echo "📦 Пакеты в репозитории: $$NAME_ARG"; \ + docker exec $$CONTAINER_NAME bash -c "helm search repo $$NAME_ARG 2>&1 | grep -v '^WARNING' || true";; \ + *) \ + echo "❌ Неизвестная команда: $$REPO_CMD"; \ + echo "💡 Доступные команды: add, list, delete, update, packages"; \ + exit 1;; \ + esac;; \ *) \ echo "☸️ Доступные команды:"; \ echo ""; \ @@ -1234,6 +1386,18 @@ k8s: echo " 💡 Для: ручного управления kubectl/kind"; \ echo " 💡 Пример: make k8s shell kubernetes"; \ echo ""; \ + echo " make k8s manifest [cmd] [preset] [url] - работа с манифестами"; \ + echo " 💡 Команды: apply, delete, update"; \ + echo " 💡 Пример: make k8s manifest apply kubernetes https://example.com/deploy.yaml"; \ + echo ""; \ + echo " make k8s helm [cmd] [preset] [release] [chart] - работа с Helm"; \ + echo " 💡 Команды: apply, delete, update, rollback, list, status"; \ + echo " 💡 Пример: make k8s helm apply kubernetes nginx stable/nginx-ingress"; \ + echo ""; \ + echo " make k8s helmrepo [cmd] [preset] [name] [url] - работа с Helm репозиториями"; \ + echo " 💡 Команды: add, list, delete, update, packages"; \ + echo " 💡 Пример: make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable"; \ + echo ""; \ echo "💡 Примеры:"; \ echo " make k8s create # создать минимальный кластер"; \ echo " make k8s create kubernetes # создать кластер с аддонами"; \ diff --git a/docs/kubernetes-commands.md b/docs/kubernetes-commands.md new file mode 100644 index 0000000..5ca5dfb --- /dev/null +++ b/docs/kubernetes-commands.md @@ -0,0 +1,395 @@ +# Команды для работы с Kubernetes + +Автор: Сергей Антропов +Сайт: https://devops.org.ru + +## Содержание + +- [Работа с манифестами](#работа-с-манифестами) +- [Работа с Helm](#работа-с-helm) +- [Работа с Helm репозиториями](#работа-с-helm-репозиториями) + +## Работа с манифестами + +Команды для применения, удаления и обновления манифестов YAML в кластере. + +### Синтаксис + +```bash +make k8s manifest [команда] [пресет] [URL_или_путь_к_файлу] +``` + +### Команды + +#### `apply` - Применение манифеста + +Применяет манифест YAML к кластеру. + +```bash +make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml +``` + +**Примеры:** +```bash +# Применение манифеста из URL +make k8s manifest apply kubernetes https://example.com/deploy.yaml + +# Применение локального манифеста +make k8s manifest apply kubernetes ./manifests/my-app.yaml +``` + +#### `delete` - Удаление ресурсов + +Удаляет ресурсы из кластера по манифесту. + +```bash +make k8s manifest delete kubernetes https://example.com/deploy.yaml +``` + +#### `update` - Обновление манифеста + +Обновляет ресурсы в кластере, используя манифест. + +```bash +make k8s manifest update kubernetes https://example.com/deploy.yaml +``` + +### Примеры использования + +```bash +# Установка NGINX Ingress Controller +make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml + +# Удаление ресурсов +make k8s manifest delete kubernetes https://example.com/deploy.yaml + +# Обновление конфигурации +make k8s manifest update kubernetes https://example.com/deploy.yaml --force +``` + +## Работа с Helm + +Команды для установки, обновления и управления Helm чартами в кластере. + +### Синтаксис + +```bash +make k8s helm [команда] [пресет] [релиз] [чант] +``` + +### Команды + +#### `apply` - Установка/обновление чарта + +Устанавливает новый релиз или обновляет существующий. + +```bash +make k8s helm apply kubernetes my-nginx nginx/nginx-ingress +``` + +**Параметры:** +- `пресет` - имя пресета кластера +- `релиз` - имя релиза (например: my-nginx) +- `чарт` - имя чарта (например: nginx/nginx-ingress) + +**Примеры:** +```bash +# Установка nginx-ingress +make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress + +# Установка с указанием репозитория +make k8s helm apply kubernetes prometheus prometheus-community/prometheus +``` + +#### `delete` - Удаление релиза + +Удаляет Helm релиз из кластера. + +```bash +make k8s helm delete kubernetes my-nginx +``` + +**Примеры:** +```bash +# Удаление релиза +make k8s helm delete kubernetes nginx-ingress + +# Удаление с флагом --keep-history +# (не поддерживается в текущей реализации) +``` + +#### `update` - Обновление релиза + +Обновляет существующий Helm релиз. + +```bash +make k8s helm update kubernetes my-nginx nginx/nginx-ingress +``` + +#### `rollback` - Откат релиза + +Откатывает релиз к предыдущей версии. + +```bash +make k8s helm rollback kubernetes my-nginx +``` + +**Примеры:** +```bash +# Откат к предыдущей ревизии +make k8s helm rollback kubernetes my-nginx + +# Откат к конкретной ревизии (не поддерживается в текущей реализации) +``` + +#### `list` - Список релизов + +Показывает список всех установленных Helm релизов. + +```bash +make k8s helm list kubernetes +``` + +**Пример вывода:** +``` +NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +nginx-ingress default 1 2024-01-15 12:00:00.000000 +0000 UTC deployed nginx-ingress-0.1.0 1.0.0 +``` + +#### `status` - Статус релиза + +Показывает подробную информацию о статусе релиза. + +```bash +make k8s helm status kubernetes my-nginx +``` + +### Примеры использования + +```bash +# 1. Установка NGINX Ingress Controller +make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress + +# 2. Проверка статуса +make k8s helm status kubernetes nginx-ingress + +# 3. Обновление релиза +make k8s helm update kubernetes nginx-ingress nginx/nginx-ingress + +# 4. Просмотр списка релизов +make k8s helm list kubernetes + +# 5. Откат релиза +make k8s helm rollback kubernetes nginx-ingress + +# 6. Удаление релиза +make k8s helm delete kubernetes nginx-ingress +``` + +## Работа с Helm репозиториями + +Команды для управления Helm репозиториями. + +### Синтаксис + +```bash +make k8s helmrepo [команда] [пресет] [имя] [URL] +``` + +### Команды + +#### `add` - Добавление репозитория + +Добавляет новый Helm репозиторий. + +```bash +make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable +``` + +**Примеры:** +```bash +# Добавление официального репозитория Helm +make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable + +# Добавление репозитория Bitnami +make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami + +# Добавление репозитория NGINX +make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable + +# Добавление репозитория Prometheus +make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts + +# Добавление пользовательского репозитория +make k8s helmrepo add kubernetes my-repo https://charts.example.com +``` + +#### `list` - Список репозиториев + +Показывает список всех добавленных Helm репозиториев. + +```bash +make k8s helmrepo list kubernetes +``` + +**Пример вывода:** +``` +NAME URL +stable https://charts.helm.sh/stable +bitnami https://charts.bitnami.com/bitnami +nginx https://helm.nginx.com/stable +``` + +#### `delete` - Удаление репозитория + +Удаляет Helm репозиторий. + +```bash +make k8s helmrepo delete kubernetes stable +``` + +**Примеры:** +```bash +# Удаление репозитория +make k8s helmrepo delete kubernetes stable +``` + +#### `update` - Обновление репозиториев + +Обновляет информацию о всех Helm репозиториях. + +```bash +make k8s helmrepo update kubernetes +``` + +**Примеры:** +```bash +# Обновление всех репозиториев +make k8s helmrepo update kubernetes +``` + +#### `packages` - Список пакетов + +Показывает список пакетов в указанном репозитории. + +```bash +make k8s helmrepo packages kubernetes stable +``` + +**Примеры:** +```bash +# Просмотр пакетов в репозитории stable +make k8s helmrepo packages kubernetes stable + +# Просмотр пакетов в репозитории nginx +make k8s helmrepo packages kubernetes nginx + +# Поиск конкретного пакета +make k8s helmrepo packages kubernetes stable | grep nginx +``` + +### Примеры использования + +```bash +# 1. Добавление нескольких репозиториев +make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable +make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami +make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable + +# 2. Просмотр списка репозиториев +make k8s helmrepo list kubernetes + +# 3. Обновление репозиториев +make k8s helmrepo update kubernetes + +# 4. Поиск пакетов в репозитории +make k8s helmrepo packages kubernetes stable + +# 5. Удаление репозитория +make k8s helmrepo delete kubernetes my-custom-repo + +# 6. Установка пакета из добавленного репозитория +make k8s helm apply kubernetes my-nginx nginx/nginx-ingress +``` + +## Полный рабочий пример + +```bash +# 1. Создание кластера +make k8s create kubernetes + +# 2. Добавление Helm репозиториев +make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable +make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami + +# 3. Обновление репозиториев +make k8s helmrepo update kubernetes + +# 4. Просмотр доступных пакетов +make k8s helmrepo packages kubernetes nginx + +# 5. Установка NGINX Ingress Controller +make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress + +# 6. Проверка статуса +make k8s helm status kubernetes nginx-ingress + +# 7. Просмотр списка релизов +make k8s helm list kubernetes + +# 8. Применение манифеста +make k8s manifest apply kubernetes https://example.com/deploy.yaml + +# 9. Откат релиза (если нужно) +make k8s helm rollback kubernetes nginx-ingress + +# 10. Удаление релиза +make k8s helm delete kubernetes nginx-ingress + +# 11. Удаление репозитория +make k8s helmrepo delete kubernetes nginx + +# 12. Удаление кластера +make k8s destroy kubernetes +``` + +## Обработка ошибок + +### Ошибка: Контейнер не запущен + +``` +❌ Контейнер k8s-kubernetes не запущен +💡 Запустите: make k8s create kubernetes +``` + +**Решение:** Запустите кластер перед выполнением команд. + +### Ошибка: Неизвестная команда + +``` +❌ Неизвестная команда: unknown +💡 Доступные команды: apply, delete, update +``` + +**Решение:** Используйте правильную команду из списка доступных. + +### Ошибка: Не указаны параметры + +``` +❌ Ошибка: Укажите имя релиза и чарт +💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress +``` + +**Решение:** Укажите все необходимые параметры команды. + +## Дополнительная информация + +- Все команды kubectl и helm выполняются внутри контейнера `k8s-[пресет]` +- Вам не нужно устанавливать kubectl или helm локально +- Подключение к кластеру происходит через имя узла control-plane +- Используется флаг `--insecure-skip-tls-verify` для обхода проблем с сертификатами + +## Автор + +Сергей Антропов +Сайт: https://devops.org.ru