Add Jenkins, Harbor, Portainer, Vault, ELK, Semaphore manifests

This commit is contained in:
Vlad
2025-11-26 10:44:46 +00:00
parent 550c67d154
commit e7cff9d8c1
37 changed files with 666 additions and 0 deletions

20
apps/elk/application.yaml Normal file
View File

@@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: elk
namespace: argocd
spec:
project: default
source:
repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops
path: apps/elk
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: elk
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@@ -0,0 +1,23 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: elk
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:8.15.0
env:
- name: ELASTICSEARCH_HOSTS
value: "http://elasticsearch.elk.svc.cluster.local:9200"
ports:
- containerPort: 5601

View File

@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kibana
namespace: elk
annotations:
kubernetes.io/ingress.class: traefik
cert-manager.io/cluster-issuer: letsencrypt-http
spec:
tls:
- hosts:
- elk.thedevops.dev
secretName: elk-tls
rules:
- host: elk.thedevops.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kibana
port:
number: 5601

4
apps/elk/namespace.yaml Normal file
View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: elk

View File

@@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
namespace: elk
spec:
clusterIP: None
selector:
app: elasticsearch
ports:
- name: http
port: 9200
targetPort: 9200
- name: transport
port: 9300
targetPort: 9300

View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: kibana
namespace: elk
spec:
type: ClusterIP
selector:
app: kibana
ports:
- name: http
port: 5601
targetPort: 5601

View File

@@ -0,0 +1,39 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: elk
spec:
serviceName: elasticsearch
replicas: 1
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
env:
- name: discovery.type
value: single-node
- name: ES_JAVA_OPTS
value: "-Xms1g -Xmx1g"
ports:
- containerPort: 9200
- containerPort: 9300
volumeMounts:
- name: elasticsearch-data
mountPath: /usr/share/elasticsearch/data
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: longhorn
resources:
requests:
storage: 30Gi

View File

@@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: harbor
namespace: argocd
spec:
project: default
source:
repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops
path: apps/harbor
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: harbor
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@@ -0,0 +1,30 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: harbor-registry
namespace: harbor
spec:
replicas: 1
selector:
matchLabels:
app: harbor-registry
template:
metadata:
labels:
app: harbor-registry
spec:
containers:
- name: registry
image: registry:2
env:
- name: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
value: /var/lib/registry
ports:
- containerPort: 5000
volumeMounts:
- name: registry-data
mountPath: /var/lib/registry
volumes:
- name: registry-data
persistentVolumeClaim:
claimName: harbor-registry

View File

@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: harbor-registry
namespace: harbor
annotations:
kubernetes.io/ingress.class: traefik
cert-manager.io/cluster-issuer: letsencrypt-http
spec:
tls:
- hosts:
- harbor.thedevops.dev
secretName: harbor-tls
rules:
- host: harbor.thedevops.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: harbor-registry
port:
number: 5000

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: harbor

View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: harbor-registry
namespace: harbor
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: longhorn
resources:
requests:
storage: 50Gi

View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: harbor-registry
namespace: harbor
spec:
type: ClusterIP
selector:
app: harbor-registry
ports:
- name: registry
port: 5000
targetPort: 5000

View File

@@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: jenkins
namespace: argocd
spec:
project: default
source:
repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops
path: apps/jenkins
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: jenkins
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@@ -0,0 +1,33 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
securityContext:
fsGroup: 1000
containers:
- name: jenkins
image: jenkins/jenkins:lts-jdk17
ports:
- containerPort: 8080
- containerPort: 50000
env:
- name: JENKINS_OPTS
value: "--httpPort=8080"
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
volumes:
- name: jenkins-home
persistentVolumeClaim:
claimName: jenkins-home

24
apps/jenkins/ingress.yaml Normal file
View File

@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jenkins
namespace: jenkins
annotations:
kubernetes.io/ingress.class: traefik
cert-manager.io/cluster-issuer: letsencrypt-http
spec:
tls:
- hosts:
- jenkins.thedevops.dev
secretName: jenkins-tls
rules:
- host: jenkins.thedevops.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: jenkins
port:
number: 8080

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: jenkins

View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-home
namespace: jenkins
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: longhorn
resources:
requests:
storage: 20Gi

16
apps/jenkins/service.yaml Normal file
View File

@@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: jenkins
namespace: jenkins
spec:
type: ClusterIP
selector:
app: jenkins
ports:
- name: http
port: 8080
targetPort: 8080
- name: agent
port: 50000
targetPort: 50000

View File

@@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: portainer
namespace: argocd
spec:
project: default
source:
repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops
path: apps/portainer
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: portainer
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@@ -0,0 +1,31 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: portainer
namespace: portainer
spec:
replicas: 1
selector:
matchLabels:
app: portainer
template:
metadata:
labels:
app: portainer
spec:
containers:
- name: portainer
image: portainer/portainer-ce:latest
args:
- "--http-enabled"
- "--http-bind-address=0.0.0.0"
ports:
- containerPort: 9443
- containerPort: 8000
volumeMounts:
- name: portainer-data
mountPath: /data
volumes:
- name: portainer-data
persistentVolumeClaim:
claimName: portainer-data

View File

@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: portainer
namespace: portainer
annotations:
kubernetes.io/ingress.class: traefik
cert-manager.io/cluster-issuer: letsencrypt-http
spec:
tls:
- hosts:
- portainer.thedevops.dev
secretName: portainer-tls
rules:
- host: portainer.thedevops.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: portainer
port:
number: 9443

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: portainer

View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: portainer-data
namespace: portainer
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: longhorn
resources:
requests:
storage: 5Gi

View File

@@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: portainer
namespace: portainer
spec:
type: ClusterIP
selector:
app: portainer
ports:
- name: https
port: 9443
targetPort: 9443
- name: edge
port: 8000
targetPort: 8000

View File

@@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: semaphore
namespace: argocd
spec:
project: default
source:
repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops
path: apps/semaphore
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: semaphore
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@@ -0,0 +1,34 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: semaphore
namespace: semaphore
spec:
replicas: 1
selector:
matchLabels:
app: semaphore
template:
metadata:
labels:
app: semaphore
spec:
containers:
- name: semaphore
image: semaphoreui/semaphore:latest
env:
- name: SEMAPHORE_DB_DIALECT
value: bolt
- name: SEMAPHORE_DB_PATH
value: /var/lib/semaphore/semaphore.db
- name: SEMAPHORE_PLAYBOOK_PATH
value: /tmp/semaphore/
ports:
- containerPort: 3000
volumeMounts:
- name: semaphore-data
mountPath: /var/lib/semaphore
volumes:
- name: semaphore-data
persistentVolumeClaim:
claimName: semaphore-data

View File

@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: semaphore
namespace: semaphore
annotations:
kubernetes.io/ingress.class: traefik
cert-manager.io/cluster-issuer: letsencrypt-http
spec:
tls:
- hosts:
- semaphore.thedevops.dev
secretName: semaphore-tls
rules:
- host: semaphore.thedevops.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: semaphore
port:
number: 3000

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: semaphore

View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: semaphore-data
namespace: semaphore
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: longhorn
resources:
requests:
storage: 10Gi

View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: semaphore
namespace: semaphore
spec:
type: ClusterIP
selector:
app: semaphore
ports:
- name: http
port: 3000
targetPort: 3000

View File

@@ -0,0 +1,20 @@
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: vault
namespace: argocd
spec:
project: default
source:
repoURL: http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops
path: apps/vault
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: vault
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

View File

@@ -0,0 +1,33 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: vault
namespace: vault
spec:
replicas: 1
selector:
matchLabels:
app: vault
template:
metadata:
labels:
app: vault
spec:
containers:
- name: vault
image: hashicorp/vault:1.17
args:
- "server"
env:
- name: VAULT_LOCAL_CONFIG
value: |
{"backend": {"file": {"path": "/vault/file"}}, "listener": {"tcp": {"address": "0.0.0.0:8200", "tls_disable": 1}}, "ui": true}
ports:
- containerPort: 8200
volumeMounts:
- name: vault-data
mountPath: /vault/file
volumes:
- name: vault-data
persistentVolumeClaim:
claimName: vault-data

24
apps/vault/ingress.yaml Normal file
View File

@@ -0,0 +1,24 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: vault
namespace: vault
annotations:
kubernetes.io/ingress.class: traefik
cert-manager.io/cluster-issuer: letsencrypt-http
spec:
tls:
- hosts:
- vault.thedevops.dev
secretName: vault-tls
rules:
- host: vault.thedevops.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: vault
port:
number: 8200

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: vault

11
apps/vault/pvc-vault.yaml Normal file
View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: vault-data
namespace: vault
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: longhorn
resources:
requests:
storage: 10Gi

13
apps/vault/service.yaml Normal file
View File

@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: vault
namespace: vault
spec:
type: ClusterIP
selector:
app: vault
ports:
- name: http
port: 8200
targetPort: 8200