From 37a5f7be4a303f28105d4a76d81f1d7662c6c2f0 Mon Sep 17 00:00:00 2001 From: iqbalpa Date: Thu, 10 Jul 2025 09:28:06 +0700 Subject: [PATCH 1/2] feat: init k8s config --- docker-compose.yml | 2 + k8s/db-data-persistentvolumeclaim.yaml | 12 +++++ k8s/devtasker-deployment.yaml | 40 +++++++++++++++ k8s/devtasker-env-configmap.yaml | 13 +++++ k8s/devtasker-service.yaml | 16 ++++++ k8s/grafana-cm0-configmap.yaml | 17 +++++++ k8s/grafana-data-persistentvolumeclaim.yaml | 12 +++++ k8s/grafana-deployment.yaml | 55 +++++++++++++++++++++ k8s/grafana-env-configmap.yaml | 10 ++++ k8s/grafana-service.yaml | 16 ++++++ k8s/nginx-cm0-configmap.yaml | 10 ++++ k8s/nginx-deployment.yaml | 52 +++++++++++++++++++ k8s/nginx-service.yaml | 16 ++++++ k8s/postgres-deployment.yaml | 49 ++++++++++++++++++ k8s/postgres-env-configmap.yaml | 10 ++++ k8s/postgres-service.yaml | 16 ++++++ k8s/prom-data-persistentvolumeclaim.yaml | 12 +++++ k8s/prometheus-cm0-configmap.yaml | 19 +++++++ k8s/prometheus-deployment.yaml | 54 ++++++++++++++++++++ k8s/prometheus-service.yaml | 16 ++++++ 20 files changed, 447 insertions(+) create mode 100644 k8s/db-data-persistentvolumeclaim.yaml create mode 100644 k8s/devtasker-deployment.yaml create mode 100644 k8s/devtasker-env-configmap.yaml create mode 100644 k8s/devtasker-service.yaml create mode 100644 k8s/grafana-cm0-configmap.yaml create mode 100644 k8s/grafana-data-persistentvolumeclaim.yaml create mode 100644 k8s/grafana-deployment.yaml create mode 100644 k8s/grafana-env-configmap.yaml create mode 100644 k8s/grafana-service.yaml create mode 100644 k8s/nginx-cm0-configmap.yaml create mode 100644 k8s/nginx-deployment.yaml create mode 100644 k8s/nginx-service.yaml create mode 100644 k8s/postgres-deployment.yaml create mode 100644 k8s/postgres-env-configmap.yaml create mode 100644 k8s/postgres-service.yaml create mode 100644 k8s/prom-data-persistentvolumeclaim.yaml create mode 100644 k8s/prometheus-cm0-configmap.yaml create mode 100644 k8s/prometheus-deployment.yaml create mode 100644 k8s/prometheus-service.yaml diff --git a/docker-compose.yml b/docker-compose.yml index a14f5ed..a0db8fb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,6 +21,8 @@ services: postgres: image: postgres container_name: postgres + ports: + - 5432:5432 restart: unless-stopped networks: - monitor diff --git a/k8s/db-data-persistentvolumeclaim.yaml b/k8s/db-data-persistentvolumeclaim.yaml new file mode 100644 index 0000000..7d6f72e --- /dev/null +++ b/k8s/db-data-persistentvolumeclaim.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + io.kompose.service: db-data + name: db-data +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Mi diff --git a/k8s/devtasker-deployment.yaml b/k8s/devtasker-deployment.yaml new file mode 100644 index 0000000..a6d8de1 --- /dev/null +++ b/k8s/devtasker-deployment.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: devtasker + name: devtasker +spec: + replicas: 1 + selector: + matchLabels: + io.kompose.service: devtasker + template: + metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: devtasker + spec: + containers: + - envFrom: + - configMapRef: + name: devtasker-env + image: iqbalpa/go-devtasker:latest + livenessProbe: + exec: + command: + - curl + - -f + - http://localhost:3000/health + failureThreshold: 5 + periodSeconds: 10 + name: devtasker + ports: + - containerPort: 3000 + protocol: TCP + restartPolicy: Always diff --git a/k8s/devtasker-env-configmap.yaml b/k8s/devtasker-env-configmap.yaml new file mode 100644 index 0000000..c76d7c6 --- /dev/null +++ b/k8s/devtasker-env-configmap.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +data: + APP_ENV: dev + DB_HOST: postgres + DB_NAME: devtasker + DB_PASSWORD: iqbalpahlevi + DB_PORT: "5432" + DB_USER: postgres +kind: ConfigMap +metadata: + labels: + io.kompose.service: devtasker-devtasker-env + name: devtasker-env diff --git a/k8s/devtasker-service.yaml b/k8s/devtasker-service.yaml new file mode 100644 index 0000000..3ee238b --- /dev/null +++ b/k8s/devtasker-service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: devtasker + name: devtasker +spec: + ports: + - name: "3000" + port: 3000 + targetPort: 3000 + selector: + io.kompose.service: devtasker diff --git a/k8s/grafana-cm0-configmap.yaml b/k8s/grafana-cm0-configmap.yaml new file mode 100644 index 0000000..ac111c3 --- /dev/null +++ b/k8s/grafana-cm0-configmap.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +data: + datasource.yml: | + apiVersion: 1 + + datasources: + - name: Prometheus + type: prometheus + url: http://prometheus:9090 + isDefault: true + access: proxy + editable: true +kind: ConfigMap +metadata: + labels: + io.kompose.service: grafana + name: grafana-cm0 diff --git a/k8s/grafana-data-persistentvolumeclaim.yaml b/k8s/grafana-data-persistentvolumeclaim.yaml new file mode 100644 index 0000000..7a2b001 --- /dev/null +++ b/k8s/grafana-data-persistentvolumeclaim.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + io.kompose.service: grafana-data + name: grafana-data +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Mi diff --git a/k8s/grafana-deployment.yaml b/k8s/grafana-deployment.yaml new file mode 100644 index 0000000..bbd1257 --- /dev/null +++ b/k8s/grafana-deployment.yaml @@ -0,0 +1,55 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: grafana + name: grafana +spec: + replicas: 1 + selector: + matchLabels: + io.kompose.service: grafana + strategy: + type: Recreate + template: + metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: grafana + spec: + containers: + - envFrom: + - configMapRef: + name: grafana-env + image: grafana/grafana + livenessProbe: + exec: + command: + - wget + - --spider + - -q + - http://localhost:3001 + failureThreshold: 5 + periodSeconds: 10 + name: grafana + ports: + - containerPort: 3001 + protocol: TCP + volumeMounts: + - mountPath: /etc/grafana/provisioning/datasources + name: grafana-cm0 + - mountPath: /grafana + name: grafana-data + restartPolicy: Always + volumes: + - configMap: + name: grafana-cm0 + name: grafana-cm0 + - name: grafana-data + persistentVolumeClaim: + claimName: grafana-data diff --git a/k8s/grafana-env-configmap.yaml b/k8s/grafana-env-configmap.yaml new file mode 100644 index 0000000..4ce2809 --- /dev/null +++ b/k8s/grafana-env-configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + GF_SECURITY_ADMIN_PASSWORD: grafana + GF_SECURITY_ADMIN_USER: admin + GF_SERVER_HTTP_PORT: "3001" +kind: ConfigMap +metadata: + labels: + io.kompose.service: grafana-grafana-env + name: grafana-env diff --git a/k8s/grafana-service.yaml b/k8s/grafana-service.yaml new file mode 100644 index 0000000..5e46e98 --- /dev/null +++ b/k8s/grafana-service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: grafana + name: grafana +spec: + ports: + - name: "3001" + port: 3001 + targetPort: 3001 + selector: + io.kompose.service: grafana diff --git a/k8s/nginx-cm0-configmap.yaml b/k8s/nginx-cm0-configmap.yaml new file mode 100644 index 0000000..381b4e0 --- /dev/null +++ b/k8s/nginx-cm0-configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + default.conf: "# Limit each IP address can make 10 request/s\nlimit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;\n\nserver {\n listen 80;\n\n # Reverse proxy for devtasker, from localhost:3000/ to localhost/\n location / {\n proxy_pass http://devtasker:3000;\n proxy_set_header Host $host; \n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_redirect off;\n }\n\n # Apply the rate limiter for these endpoint and methods\n location /api/task {\n limit_req zone=mylimit burst=20;\n proxy_pass http://devtasker:3000;\n proxy_set_header Host $host; \n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_redirect off;\n \n }\n\n # Disable logging for /health\n location = /health {\n proxy_pass http://devtasker:3000;\n proxy_set_header Host $host; \n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_redirect off;\n access_log off;\n }\n}\n" +kind: ConfigMap +metadata: + annotations: + use-subpath: "true" + labels: + io.kompose.service: nginx + name: nginx-cm0 diff --git a/k8s/nginx-deployment.yaml b/k8s/nginx-deployment.yaml new file mode 100644 index 0000000..c2efef3 --- /dev/null +++ b/k8s/nginx-deployment.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: nginx + name: nginx +spec: + replicas: 1 + selector: + matchLabels: + io.kompose.service: nginx + strategy: + type: Recreate + template: + metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: nginx + spec: + containers: + - image: nginx:alpine + livenessProbe: + exec: + command: + - wget + - --spider + - -q + - http://devtasker:3000/health + failureThreshold: 5 + periodSeconds: 10 + name: nginx + ports: + - containerPort: 80 + protocol: TCP + volumeMounts: + - mountPath: /etc/nginx/conf.d/default.conf + name: nginx-cm0 + readOnly: true + subPath: default.conf + restartPolicy: Always + volumes: + - configMap: + items: + - key: default.conf + path: default.conf + name: nginx-cm0 + name: nginx-cm0 diff --git a/k8s/nginx-service.yaml b/k8s/nginx-service.yaml new file mode 100644 index 0000000..a43989e --- /dev/null +++ b/k8s/nginx-service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: nginx + name: nginx +spec: + ports: + - name: "80" + port: 80 + targetPort: 80 + selector: + io.kompose.service: nginx diff --git a/k8s/postgres-deployment.yaml b/k8s/postgres-deployment.yaml new file mode 100644 index 0000000..3a27b37 --- /dev/null +++ b/k8s/postgres-deployment.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: postgres + name: postgres +spec: + replicas: 1 + selector: + matchLabels: + io.kompose.service: postgres + strategy: + type: Recreate + template: + metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: postgres + spec: + containers: + - envFrom: + - configMapRef: + name: postgres-env + image: postgres + livenessProbe: + exec: + command: + - pg_isready + - -U + - postgres + failureThreshold: 5 + periodSeconds: 10 + name: postgres + ports: + - containerPort: 5432 + protocol: TCP + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: db-data + restartPolicy: Always + volumes: + - name: db-data + persistentVolumeClaim: + claimName: db-data diff --git a/k8s/postgres-env-configmap.yaml b/k8s/postgres-env-configmap.yaml new file mode 100644 index 0000000..b6965bb --- /dev/null +++ b/k8s/postgres-env-configmap.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +data: + POSTGRES_DB: devtasker + POSTGRES_PASSWORD: iqbalpahlevi + POSTGRES_USER: postgres +kind: ConfigMap +metadata: + labels: + io.kompose.service: postgres-postgres-env + name: postgres-env diff --git a/k8s/postgres-service.yaml b/k8s/postgres-service.yaml new file mode 100644 index 0000000..9f4f194 --- /dev/null +++ b/k8s/postgres-service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: postgres + name: postgres +spec: + ports: + - name: "5432" + port: 5432 + targetPort: 5432 + selector: + io.kompose.service: postgres diff --git a/k8s/prom-data-persistentvolumeclaim.yaml b/k8s/prom-data-persistentvolumeclaim.yaml new file mode 100644 index 0000000..f10006d --- /dev/null +++ b/k8s/prom-data-persistentvolumeclaim.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + io.kompose.service: prom-data + name: prom-data +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 100Mi diff --git a/k8s/prometheus-cm0-configmap.yaml b/k8s/prometheus-cm0-configmap.yaml new file mode 100644 index 0000000..958e0e7 --- /dev/null +++ b/k8s/prometheus-cm0-configmap.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +data: + prometheus.yml: | + global: + scrape_interval: 5s + scrape_configs: + - job_name: devtasker + honor_timestamps: true + scrape_interval: 5s + metrics_path: /metrics + scheme: http + static_configs: + - targets: + - devtasker:3000 +kind: ConfigMap +metadata: + labels: + io.kompose.service: prometheus + name: prometheus-cm0 diff --git a/k8s/prometheus-deployment.yaml b/k8s/prometheus-deployment.yaml new file mode 100644 index 0000000..d244872 --- /dev/null +++ b/k8s/prometheus-deployment.yaml @@ -0,0 +1,54 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: prometheus + name: prometheus +spec: + replicas: 1 + selector: + matchLabels: + io.kompose.service: prometheus + strategy: + type: Recreate + template: + metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: prometheus + spec: + containers: + - args: + - --config.file=/etc/prometheus/prometheus.yml + image: prom/prometheus + livenessProbe: + exec: + command: + - wget + - --spider + - -q + - http://localhost:9090/-/healthy + failureThreshold: 5 + periodSeconds: 10 + name: prometheus + ports: + - containerPort: 9090 + protocol: TCP + volumeMounts: + - mountPath: /etc/prometheus + name: prometheus-cm0 + - mountPath: /prometheus + name: prom-data + restartPolicy: Always + volumes: + - configMap: + name: prometheus-cm0 + name: prometheus-cm0 + - name: prom-data + persistentVolumeClaim: + claimName: prom-data diff --git a/k8s/prometheus-service.yaml b/k8s/prometheus-service.yaml new file mode 100644 index 0000000..4a7d5a5 --- /dev/null +++ b/k8s/prometheus-service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + kompose.cmd: kompose convert + kompose.version: 1.36.0 (ae2a39403) + labels: + io.kompose.service: prometheus + name: prometheus +spec: + ports: + - name: "9090" + port: 9090 + targetPort: 9090 + selector: + io.kompose.service: prometheus From 9c26de5d8a464c054d97daa660e5f59f6e63f719 Mon Sep 17 00:00:00 2001 From: iqbalpa Date: Thu, 10 Jul 2025 09:38:26 +0700 Subject: [PATCH 2/2] feat: use NodePort type for grafana, prometheus, and nginx to make it accessible from external --- k8s/grafana-service.yaml | 2 ++ k8s/nginx-service.yaml | 2 ++ k8s/prometheus-service.yaml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/k8s/grafana-service.yaml b/k8s/grafana-service.yaml index 5e46e98..a5c1f21 100644 --- a/k8s/grafana-service.yaml +++ b/k8s/grafana-service.yaml @@ -8,9 +8,11 @@ metadata: io.kompose.service: grafana name: grafana spec: + type: NodePort ports: - name: "3001" port: 3001 targetPort: 3001 + nodePort: 31001 selector: io.kompose.service: grafana diff --git a/k8s/nginx-service.yaml b/k8s/nginx-service.yaml index a43989e..a5ef95c 100644 --- a/k8s/nginx-service.yaml +++ b/k8s/nginx-service.yaml @@ -8,9 +8,11 @@ metadata: io.kompose.service: nginx name: nginx spec: + type: NodePort ports: - name: "80" port: 80 targetPort: 80 + nodePort: 31000 selector: io.kompose.service: nginx diff --git a/k8s/prometheus-service.yaml b/k8s/prometheus-service.yaml index 4a7d5a5..1de8494 100644 --- a/k8s/prometheus-service.yaml +++ b/k8s/prometheus-service.yaml @@ -8,9 +8,11 @@ metadata: io.kompose.service: prometheus name: prometheus spec: + type: NodePort ports: - name: "9090" port: 9090 targetPort: 9090 + nodePort: 31002 selector: io.kompose.service: prometheus