diff --git a/apps/monitoring/grafana.yaml b/apps/monitoring/grafana.yaml new file mode 100644 index 0000000..52e24cf --- /dev/null +++ b/apps/monitoring/grafana.yaml @@ -0,0 +1,127 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: grafana + name: grafana + namespace: monitoring +spec: + selector: + matchLabels: + app: grafana + template: + metadata: + labels: + app: grafana + spec: + securityContext: + fsGroup: 472 + supplementalGroups: + - 0 + containers: + - name: grafana + image: grafana/grafana:latest + imagePullPolicy: Always + ports: + - containerPort: 3000 + name: http-grafana + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /robots.txt + port: 3000 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 30 + successThreshold: 1 + timeoutSeconds: 2 + livenessProbe: + failureThreshold: 3 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + tcpSocket: + port: 3000 + timeoutSeconds: 1 + resources: + requests: + cpu: 250m + memory: 750Mi + limits: + memory: 1Gi + cpu: 500m + volumeMounts: + - mountPath: /var/lib/grafana + name: grafana-pv + volumes: + - name: grafana-pv + persistentVolumeClaim: + claimName: grafana-pvc +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: grafana-pvc + namespace: monitoring + annotations: + nfs.io/storage-path: "grafana-data" +spec: + storageClassName: "nfs-client" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: Service +metadata: + namespace: monitoring + name: grafana +spec: + ports: + - port: 3000 + protocol: TCP + targetPort: http-grafana + selector: + app: grafana + type: ClusterIP +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + namespace: monitoring + name: grafana +spec: + ingressClassName: nginx + rules: + - host: grafana.haven + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: grafana + port: + number: 3000 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + namespace: monitoring + name: grafana-public +spec: + ingressClassName: nginx + rules: + - host: grafanah.ivanch.me + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: grafana + port: + number: 3000 diff --git a/apps/monitoring/kube-state-metrics.yaml b/apps/monitoring/kube-state-metrics.yaml new file mode 100644 index 0000000..75d2945 --- /dev/null +++ b/apps/monitoring/kube-state-metrics.yaml @@ -0,0 +1,145 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: kube-state-metrics + namespace: monitoring + labels: + app: kube-state-metrics + app.kubernetes.io/component: exporter + app.kubernetes.io/name: kube-state-metrics + app.kubernetes.io/version: 2.19.1 +automountServiceAccountToken: false +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: kube-state-metrics + labels: + app: kube-state-metrics + app.kubernetes.io/component: exporter + app.kubernetes.io/name: kube-state-metrics + app.kubernetes.io/version: 2.19.1 +rules: + - apiGroups: [""] + resources: + - nodes + - pods + - persistentvolumeclaims + verbs: ["list", "watch"] + - apiGroups: ["apps"] + resources: + - statefulsets + - daemonsets + - deployments + - replicasets + verbs: ["list", "watch"] + - apiGroups: ["batch"] + resources: + - cronjobs + - jobs + verbs: ["list", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: kube-state-metrics + labels: + app: kube-state-metrics + app.kubernetes.io/component: exporter + app.kubernetes.io/name: kube-state-metrics + app.kubernetes.io/version: 2.19.1 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: kube-state-metrics +subjects: + - kind: ServiceAccount + name: kube-state-metrics + namespace: monitoring +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kube-state-metrics + namespace: monitoring + labels: + app: kube-state-metrics + app.kubernetes.io/component: exporter + app.kubernetes.io/name: kube-state-metrics + app.kubernetes.io/version: 2.19.1 +spec: + replicas: 1 + selector: + matchLabels: + app: kube-state-metrics + template: + metadata: + labels: + app: kube-state-metrics + app.kubernetes.io/component: exporter + app.kubernetes.io/name: kube-state-metrics + app.kubernetes.io/version: 2.19.1 + spec: + automountServiceAccountToken: true + serviceAccountName: kube-state-metrics + nodeSelector: + kubernetes.io/os: linux + containers: + - name: kube-state-metrics + image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.19.1 + imagePullPolicy: IfNotPresent + args: + - --resources=cronjobs,daemonsets,deployments,jobs,nodes,persistentvolumeclaims,pods,replicasets,statefulsets + ports: + - name: http-metrics + containerPort: 8080 + protocol: TCP + livenessProbe: + httpGet: + path: /livez + port: http-metrics + initialDelaySeconds: 5 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + timeoutSeconds: 5 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 65534 + seccompProfile: + type: RuntimeDefault + resources: + requests: + cpu: 50m + memory: 64Mi + limits: + cpu: 200m + memory: 256Mi +--- +apiVersion: v1 +kind: Service +metadata: + name: kube-state-metrics + namespace: monitoring + labels: + app: kube-state-metrics + app.kubernetes.io/component: exporter + app.kubernetes.io/name: kube-state-metrics + app.kubernetes.io/version: 2.19.1 +spec: + type: ClusterIP + selector: + app: kube-state-metrics + ports: + - name: http-metrics + port: 8080 + targetPort: http-metrics + protocol: TCP diff --git a/apps/monitoring/loki.yaml b/apps/monitoring/loki.yaml new file mode 100644 index 0000000..952a937 --- /dev/null +++ b/apps/monitoring/loki.yaml @@ -0,0 +1,108 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: loki + namespace: monitoring +spec: + replicas: 1 + selector: + matchLabels: + app: loki + template: + metadata: + labels: + app: loki + spec: + containers: + - name: loki + image: grafana/loki:3 + args: ["-config.file=/etc/loki/config/config.yaml"] + ports: + - containerPort: 3100 + volumeMounts: + - name: config + mountPath: /etc/loki/config + - name: loki-storage + mountPath: /tmp/loki + resources: + requests: + cpu: 100m + memory: 1Gi + limits: + cpu: 200m + memory: 1Gi + volumes: + - name: config + configMap: + name: loki-config + - name: loki-storage + emptyDir: + medium: Memory +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: loki-config + namespace: monitoring +data: + config.yaml: | + auth_enabled: true + server: + http_listen_port: 3100 + + common: + ring: + instance_addr: 127.0.0.1 + kvstore: + store: inmemory + replication_factor: 1 + path_prefix: /tmp/loki + querier: + multi_tenant_queries_enabled: true + + schema_config: + configs: + - from: "2024-01-01" + store: tsdb + object_store: filesystem + schema: v13 + index: + prefix: index_ + period: 24h + + storage_config: + tsdb_shipper: + active_index_directory: /tmp/loki/index + cache_location: /tmp/loki/cache + filesystem: + directory: /tmp/loki/chunks + + limits_config: + allow_structured_metadata: true + retention_period: 0 + + ingester: + lifecycler: + ring: + kvstore: + store: inmemory + replication_factor: 1 + chunk_idle_period: 1m + max_chunk_age: 5m + chunk_target_size: 1536000 + + compactor: + retention_enabled: false +--- +apiVersion: v1 +kind: Service +metadata: + name: loki + namespace: monitoring +spec: + ports: + - port: 3100 + targetPort: 3100 + name: http + selector: + app: loki diff --git a/apps/monitoring/nodeexporter.yaml b/apps/monitoring/nodeexporter.yaml new file mode 100644 index 0000000..bac150b --- /dev/null +++ b/apps/monitoring/nodeexporter.yaml @@ -0,0 +1,56 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: node-exporter + namespace: monitoring + labels: + app: node-exporter +spec: + selector: + matchLabels: + app: node-exporter + template: + metadata: + labels: + app: node-exporter + spec: + hostNetwork: true + containers: + - name: node-exporter + image: prom/node-exporter:latest + imagePullPolicy: Always + args: + - "--path.rootfs=/host" + ports: + - containerPort: 9100 + hostPort: 9100 + name: metrics + protocol: TCP + resources: + requests: + memory: "50Mi" + cpu: "100m" + limits: + memory: "100Mi" + cpu: "200m" + volumeMounts: + - name: host + mountPath: /host + readOnly: true + volumes: + - name: host + hostPath: + path: / +--- +apiVersion: v1 +kind: Service +metadata: + name: node-exporter + namespace: monitoring +spec: + selector: + app: node-exporter + ports: + - name: metrics + port: 9100 + targetPort: metrics diff --git a/apps/monitoring/prometheus.yaml b/apps/monitoring/prometheus.yaml new file mode 100644 index 0000000..b85a9e0 --- /dev/null +++ b/apps/monitoring/prometheus.yaml @@ -0,0 +1,130 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: prometheus + namespace: monitoring + labels: + app: prometheus +spec: + replicas: 1 + selector: + matchLabels: + app: prometheus + template: + metadata: + labels: + app: prometheus + spec: + serviceAccountName: prometheus + containers: + - name: prometheus + image: prom/prometheus:latest + args: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus" + - "--storage.tsdb.retention.time=1d" + - "--web.enable-lifecycle" + ports: + - containerPort: 9090 + name: web + volumeMounts: + - name: prometheus-config-volume + mountPath: /etc/prometheus + - name: prometheus-storage + mountPath: /prometheus + resources: + requests: + memory: "500Mi" + cpu: "200m" + limits: + memory: "1Gi" + cpu: "500m" + volumes: + - name: prometheus-config-volume + persistentVolumeClaim: + claimName: prometheus-pvc + - name: prometheus-storage + emptyDir: + medium: Memory + sizeLimit: 256Mi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: prometheus-pvc + namespace: monitoring + annotations: + nfs.io/storage-path: "prometheus-config" +spec: + storageClassName: "nfs-client" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi +--- +# Service URL - http://prometheus.monitoring.svc.cluster.local:9090 +apiVersion: v1 +kind: Service +metadata: + name: prometheus + namespace: monitoring + labels: + app: prometheus +spec: + ports: + - name: web + port: 9090 + targetPort: web + selector: + app: prometheus + type: ClusterIP +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: prometheus + namespace: monitoring + labels: + app: prometheus +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: prometheus + namespace: monitoring + labels: + app: prometheus +rules: +- apiGroups: [""] + resources: + - nodes + - nodes/proxy + - services + - endpoints + - pods + verbs: ["get", "list", "watch"] +- apiGroups: ["extensions"] + resources: + - ingresses + verbs: ["get", "list", "watch"] +- apiGroups: ["networking.k8s.io"] + resources: + - ingresses + verbs: ["get", "list", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: prometheus + namespace: monitoring + labels: + app: prometheus +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: prometheus +subjects: +- kind: ServiceAccount + name: prometheus + namespace: monitoring \ No newline at end of file