Перейти к основному содержимому

Практикум GitOps — подготовка кластера

Инженеру

Первый шаг — поднять локальный Kubernetes и установить Argo CD — инструмент, который следит за Git-репозиторием и приводит кластер к описанному в нём состоянию. Без работающего кластера и Argo CD следующие шаги практикума невозможны.


Предварительные требования

ТребованиеПроверка
Docker запущенdocker ps без ошибки
kubectl установленkubectl version --client
4+ GB свободной RAMДиспетчер задач / free -h
Свободны порты 8080, 6443Нет другого kind/minikube на тех же портах

Если Kubernetes новый для вас — начните с первых шагов. Теория GitOps — 8.12/4.


Архитектура шага 1

На этом шаге появляются только кластер и namespace argocd с компонентами Argo CD. Namespace demo создадим в конце статьи.


1. Локальный кластер (kind)

kind (Kubernetes in Docker) создаёт кластер из Docker-контейнеров — удобно для учебных стендов без облака.

Установка kind (если ещё нет):

# Linux / macOS — см. https://kind.sigs.k8s.io/docs/user/quick-start/
# Windows (scoop): scoop install kind
kind version

Создание кластера:

kind create cluster --name gitops-lab

Ожидаемый вывод (фрагмент):

Creating cluster "gitops-lab" ...
✓ Ensuring node image (kindest/node:v1.xx.x) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-gitops-lab"

Проверка:

kubectl cluster-info --context kind-gitops-lab
kubectl get nodes

Ожидаемый результат:

Kubernetes control plane is running at https://127.0.0.1:xxxxx
NAME STATUS ROLES AGE VERSION
gitops-lab-control-plane Ready control-plane 1m v1.xx.x

Альтернатива — minikube

minikube start --cpus=4 --memory=8192 --driver=docker
kubectl get nodes

Ещё один вариант — встроенный Kubernetes в Docker Desktop. Включите Kubernetes в настройках и убедитесь, что context указывает на docker-desktop.

Устранение неполадок — кластер

ОшибкаРешение
ERROR failed to create clusterПерезапустите Docker, увеличьте RAM в Docker Desktop до 6 GB+
node(s) already existkind delete cluster --name gitops-lab и повторите create
Unable to connect to the serverkubectl config use-context kind-gitops-lab

2. Установка Argo CD

Argo CD — контроллер GitOps. Он устанавливается в отдельный namespace argocd и не смешивается с вашими приложениями.

Создание namespace и установка stable-манифеста:

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Ожидаемый вывод:

namespace/argocd created
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
...
deployment.apps/argocd-server created

Дождитесь готовности server (до 5 минут на слабом ноутбуке):

kubectl wait --for=condition=Available deployment/argocd-server -n argocd --timeout=300s

Проверка подов:

kubectl get pods -n argocd

Ожидаемый результат — все поды в Running или Completed (redis):

NAME READY STATUS RESTARTS AGE
argocd-application-controller-... 1/1 Running 0 2m
argocd-server-... 1/1 Running 0 2m
argocd-repo-server-... 1/1 Running 0 2m
...

Начальный пароль admin

Argo CD создаёт Secret с одноразовым паролем:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

На Windows PowerShell без base64:

$p = kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}"
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($p))

Сохраните пароль — понадобится для UI и CLI. После смены пароля Secret можно удалить по документации Argo CD.

Доступ к веб-интерфейсу

Port-forward пробрасывает HTTPS Argo CD на localhost:

kubectl port-forward svc/argocd-server -n argocd 8080:443

Оставьте терминал открытым. В браузере откройте https://localhost:8080. Логин admin, пароль — из команды выше. Браузер покажет предупреждение о сертификате — в lab это нормально.

Ожидаемый экран — пустой список Applications (приложений ещё нет).

Устранение неполадок — Argo CD

СимптомДействие
argocd-server Pendingkubectl describe pod -n argocd -l app.kubernetes.io/name=argocd-server — часто нехватка CPU
port-forward connection refusedПод server ещё не Ready — дождитесь kubectl wait
Неверный парольУбедитесь, что декодировали Secret без лишних пробелов

3. CLI Argo CD (опционально)

CLI удобен для автоматизации, просмотра diff и отладки без UI.

# Windows: choco install argocd-cli
# macOS: brew install argocd
argocd version --client

Логин (port-forward должен работать):

argocd login localhost:8080 --username admin --password YOUR_PASSWORD --insecure

Ожидаемый вывод:

'admin:logged in successfully'
Context 'localhost:8080' updated

Список приложений (пока пуст):

argocd app list

4. Namespace для приложения

Namespace — изолированная область имён в Kubernetes. Учебное приложение demo-nginx живёт в demo, отдельно от argocd.

kubectl create namespace demo
kubectl get namespace demo

Ожидаемый результат:

NAME STATUS AGE
demo Active 5s

В шаге 2 Argo CD может создать namespace сам через CreateNamespace=true, но явное создание помогает проверить права до подключения Git.


Проверка шага 1

Выполните контрольный список:

kubectl config current-context
# kind-gitops-lab или minikube

kubectl get ns argocd demo
kubectl get deployment argocd-server -n argocd
curl -k -s -o /dev/null -w "%{http_code}" https://localhost:8080
# при работающем port-forward ожидается 200 или 302

Если все проверки прошли — переходите к репозиторию манифестов и Application.


Конфигурация kind для GitOps lab

Файл kind-gitops-lab.yaml (опционально) — проброс port 8080 для Ingress-less lab:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: gitops-lab
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30080
hostPort: 30080
protocol: TCP

Создание:

kind create cluster --name gitops-lab --config kind-gitops-lab.yaml

Компоненты Argo CD в namespace argocd

DeploymentРоль
argocd-serverAPI и UI
argocd-application-controllerReconcile Application
argocd-repo-serverGit clone и manifest render
argocd-dex-serverSSO (опционально)
argocd-redisКэш

Проверка всех deployment:

kubectl get deploy -n argocd

Смена пароля admin (рекомендуется после lab)

argocd account update-password --account admin --current-password OLD --new-password NEW_STRONG

Или через UI: User Info → Update Password.


Установка kind и kubectl (Windows)

# scoop
scoop install kind kubectl

# проверка
kind version
kubectl version --client

На Linux используйте пакетный менеджер дистрибутива или бинарники с официальных сайтов.


minikube — дополнительные флаги

minikube start --cpus=4 --memory=8192 --driver=docker --kubernetes-version=v1.29.0
minikube addons enable metrics-server
kubectl get nodes -o wide

metrics-server пригодится для kubectl top pods в следующих шагах.


Docker Desktop Kubernetes

  1. Settings → Kubernetes → Enable Kubernetes.
  2. kubectl config use-context docker-desktop
  3. Дальше те же команды установки Argo CD.

Отличие от kind — одна нода, встроенная в Docker Desktop без отдельного kind create.


Расширенная диагностика Argo CD

Логи application-controller при проблемах sync (на шаге 2):

kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller --tail=30

События namespace:

kubectl get events -n argocd --sort-by='.lastTimestamp' | tail -15

Глоссарий шага 1

ТерминКратко
ContextЗапись в kubeconfig — к какому кластеру подключается kubectl
NamespaceИзоляция ресурсов внутри одного кластера
Port-forwardТуннель kubectl с pod/service на localhost
CRDCustom Resource Definition — расширение API K8s (Application)

Подробнее — справочник Kubernetes.


Заметки по безопасности

  1. Пароль admin смените после lab или удалите доступ из интернета — port-forward только на localhost.
  2. Stable manifest Argo CD тянет образы из публичного registry — в production используйте pinned версии и private mirror (Supply chain).
  3. RBAC кластера в kind по умолчанию широкий — это учебный стенд, в prod ограничивают права Argo CD через AppProject.

Связанные материалы


Полный walkthrough шага 1 (copy-paste)

Выполните блок целиком после проверки Docker. Каждый подблок заканчивается ожидаемым выводом.

Блок 1 — kind cluster

kind delete cluster --name gitops-lab 2>/dev/null || true
kind create cluster --name gitops-lab
kubectl cluster-info --context kind-gitops-lab

Ожидаемый фрагмент:

Kubernetes control plane is running at https://127.0.0.1:xxxxx

Блок 2 — Argo CD install

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl wait --for=condition=Available deployment/argocd-server -n argocd --timeout=300s
kubectl get pods -n argocd -o wide

Ожидаемый результат — минимум 5 подов Running (server, repo-server, application-controller, redis, dex).

Блок 3 — пароль и UI

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo
kubectl port-forward svc/argocd-server -n argocd 8080:443 &
sleep 3
curl -k -s -o /dev/null -w "HTTP %{http_code}\n" https://localhost:8080

Ожидаемый HTTP код 200 или 302. В браузере — пустой список Applications.

Блок 4 — namespace demo

kubectl create namespace demo
kubectl get ns argocd demo

Расширенное устранение неполадок

СимптомКоманда диагностикиОжидаемый вывод при OKРешение
Pod Pendingkubectl describe pod -n argocd -l app.kubernetes.io/name=argocd-serverEvents без FailedSchedulingУвеличьте CPU/RAM Docker
ImagePullBackOffkubectl describe pod -n argocd <pod>Pull succeededПроверьте сеть, docker pull quay.io/argoproj/argocd
CRD missingkubectl get crd applications.argoproj.ioNAME applications...Переустановите install.yaml
Wrong contextkubectl config current-contextkind-gitops-labkubectl config use-context kind-gitops-lab
Secret not foundkubectl get secret -n argocdargocd-initial-admin-secretДождитесь готовности server

Логи application-controller (на будущее, шаг 2):

kubectl logs -n argocd -l app.kubernetes.io/name=argocd-application-controller --tail=20

Предупреждения безопасности

  1. Не публикуйте port-forward Argo CD в интернет без TLS и auth proxy.
  2. Пароль admin смените после lab — argocd account update-password.
  3. Root token Vault и kubeconfig не коммитьте в infra-repo.
  4. В production используйте AppProject с whitelist repo и namespace.
  5. Образы Argo CD pin по digest — см. Supply chain.

Чек-лист завершения шага 1

#КритерийКомандаОжидание
1Кластер Readykubectl get nodesSTATUS Ready
2argocd-serverkubectl get deploy -n argocd1/1 READY
3Все поды argocdkubectl get pods -n argocdRunning
4UI отвечаетcurl -k localhost:8080200/302
5namespace demokubectl get ns demoActive
6CLI login (опц.)argocd app listпустой список

Шесть пунктов OK — шаг 2.


Windows PowerShell — эквиваленты команд

# пароль admin
$p = kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}"
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($p))

# port-forward (отдельное окно)
kubectl port-forward svc/argocd-server -n argocd 8080:443

# проверка Docker
docker ps

Ожидаемый docker ps — контейнер gitops-lab-control-plane в STATUS Up.


Установка argocd CLI — полный цикл

# Linux
curl -sSL -o argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x argocd && sudo mv argocd /usr/local/bin/
argocd version --client

argocd login localhost:8080 --username admin --password YOUR_PASSWORD --insecure
argocd app list

Ожидаемый вывод login:

'admin:logged in successfully'

Мониторинг ресурсов кластера

kubectl top nodes 2>/dev/null || echo "metrics-server не установлен — опционально"
kubectl get events -n argocd --sort-by='.lastTimestamp' | tail -10

При нехватке памяти Events покажут OOMKilled — освободите RAM на хосте.


Очистка lab (если нужно начать заново)

kubectl delete namespace argocd --wait=false
kubectl delete namespace demo --wait=false
kind delete cluster --name gitops-lab

Повторите walkthrough с блока 1.


Диагностика сети между host и kind

docker network ls | grep kind
kubectl run nettest --rm -it --restart=Never --image=busybox -- wget -qO- --timeout=3 https://kubernetes.default.svc 2>&1 | head -3

Ожидаемо — ответ от API или timeout в lab без DNS test — главное, что pod создался.


Проверка CRD Application

kubectl get crd applications.argoproj.io -o jsonpath='{.spec.versions[0].name}{"\n"}'
kubectl api-resources | grep application

Ожидаемый api-resources:

applications app argoproj.io/v1alpha1 true Application

Содержание