5.7 KiB
Сделал тебе полный набор GitOps-файлов и упаковал в один архив:
👉 Скачать архив k3s-gitops-apps-bundle.zip
Внутри структура такая (относительно k3s-gitops/apps/):
jenkins/semaphore/harbor/(упрощённый registry на базеregistry:2)vault/portainer/elk/(Elasticsearch single-node + Kibana)
Каждая папка содержит:
-
application.yaml— ArgoCD Application, указывающий на:repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitopspath: apps/<app-name>
-
namespace.yaml— отдельный namespace для сервиса -
pvc-*.yaml— PVC под Longhorn (StorageClasslonghorn) -
workload (
deployment.yamlилиstatefulset-*.yaml) -
service.yaml -
ingress*.yaml— сtraefik+cert-manager.io/cluster-issuer: letsencrypt-http
Домены (можешь поменять под себя):
- Jenkins:
jenkins.thedevops.dev - Semaphore:
semaphore.thedevops.dev - Harbor (registry):
harbor.thedevops.dev - Vault:
vault.thedevops.dev - Portainer:
portainer.thedevops.dev - Kibana (ELK):
elk.thedevops.dev
Как развернуть пошагово
- Распаковать архив локально:
unzip k3s-gitops-apps-bundle.zip
- Положить всё в твой GitOps-репозиторий Gitea:
Структура репо должна быть:
k3s-gitops/
apps/
jenkins/
semaphore/
harbor/
vault/
portainer/
elk/
- Закоммитить и запушить в Gitea:
cd k3s-gitops
git add apps/
git commit -m "Add Jenkins, Semaphore, Harbor, Vault, Portainer, ELK GitOps manifests"
git push
- Создать ArgoCD Applications:
Вариант A — через kubectl:
kubectl apply -f apps/jenkins/application.yaml
kubectl apply -f apps/semaphore/application.yaml
kubectl apply -f apps/harbor/application.yaml
kubectl apply -f apps/vault/application.yaml
kubectl apply -f apps/portainer/application.yaml
kubectl apply -f apps/elk/application.yaml
Вариант B — через UI ArgoCD: можно просто импортировать эти YAML.
- Проверить:
kubectl get ns
kubectl get pods -n jenkins
kubectl get pods -n semaphore
kubectl get pods -n harbor
kubectl get pods -n vault
kubectl get pods -n portainer
kubectl get pods -n elk
И Ingress:
kubectl get ingress -A
Краткий комментарий по каждому сервису
1. Jenkins
- PVC:
jenkins-home(20Gi, Longhorn) - Монтируется в
/var/jenkins_home - Ingress:
jenkins.thedevops.dev→ Servicejenkins:8080 - После старта: первый админ-пароль в логе контейнера или в
/var/jenkins_home/secrets/initialAdminPassword(на PVC).
2. Semaphore
- Использую
bolt(встроенная db) → файлsemaphore.dbна PVC/var/lib/semaphore. - Это упрощённый вариант без PostgreSQL, удобно для домашней лаборатории.
- Ingress:
semaphore.thedevops.dev→ 3000/tcp.
3. Harbor (упрощённо)
Полноценный Harbor — огромный чарт. Для домашней лаборатории я положил минимальный docker-registry:
- Deployment
harbor-registryсregistry:2 - PVC
harbor-registry(50Gi) →/var/lib/registry - Ingress:
harbor.thedevops.dev→ 5000 (HTTP Registry)
Можно использовать как приватный Docker registry:
docker login harbor.thedevops.dev
docker push harbor.thedevops.dev/myimage:tag
(для TLS/авторизации потом можно навесить auth / basic auth через Traefik или перейти на официальный Harbor chart — можем отдельно сделать GitOps под настоящий Harbor.)
4. Vault
- Одиночный Vault без HA, backend
fileна PVC/vault/file(10Gi). - UI включен:
ui: true,tls_disable: 1(HTTP, для lab). - Ingress:
vault.thedevops.dev→ 8200. - После запуска нужно будет init + unseal вручную (через CLI или UI).
5. Portainer
-
portainer/portainer-ce:latest -
PVC
portainer-data(5Gi) →/data -
HTTP включён, Ingress на 9443:
- Host:
portainer.thedevops.dev
- Host:
-
Первый запуск → создаёшь admin-пользователя через UI.
6. ELK (минимальный стек)
-
Elasticsearch:
- StatefulSet, single node,
discovery.type=single-node - PVC через
volumeClaimTemplates→ Longhorn, 30Gi
- StatefulSet, single node,
-
Kibana:
- Deployment
kibanaв namespaceelk - Подключается к
http://elasticsearch.elk.svc.cluster.local:9200
- Deployment
-
Ingress:
- Host:
elk.thedevops.dev→ Servicekibana:5601
- Host:
Если хочешь, можем дальше:
- добавить Prometheus/Grafana в таком же стиле,
- переписать Harbor на официальный Helm-чарт, но всё равно через ArgoCD,
- добавить ExternalDNS и разрулить DNS-записи для всех этих доменов.
Пока можешь закинуть архив в Gitea и включить по одному приложению через ArgoCD – если что-то не поднимется, пришлёшь kubectl get pods -n <ns> -o wide и kubectl logs, и будем доводить до идеала.