Skip to content

add all k8s files#33

Open
abhihkX8 wants to merge 1 commit intoLondheShubham153:mainfrom
abhihkX8:my-branch
Open

add all k8s files#33
abhihkX8 wants to merge 1 commit intoLondheShubham153:mainfrom
abhihkX8:my-branch

Conversation

@abhihkX8
Copy link
Copy Markdown

@abhihkX8 abhihkX8 commented Aug 19, 2025

Summary by CodeRabbit

  • New Features

    • Added autoscaling for the backend.
    • Introduced ingress routing with a public host.
    • Provided a Kind cluster config for local testing.
  • Improvements

    • Upgraded backend runtime to Node 18.
    • Frontend image now builds for production and serves static assets.
    • Updated Kubernetes deployments/services, increased replicas, set resource limits, and improved persistent storage.
  • Refactor

    • Reorganized Kubernetes manifests and renamed services for clarity.
  • Chores

    • Removed legacy CI/CD pipelines and Terraform infrastructure files.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Aug 19, 2025

Walkthrough

Updates backend and frontend Dockerfiles; removes Jenkins pipelines and Terraform infrastructure for Jenkins server; deletes older Kubernetes manifests; adds new k8s manifests for backend, database, frontend, ingress, HPA, PVC/PV, and a Kind cluster definition.

Changes

Cohort / File(s) Summary
Backend container build
Application-Code/backend/Dockerfile
Base image switched to node:18-alpine; WORKDIR changed to /app; build steps unchanged in new dir; newline added.
Frontend container build
Application-Code/frontend/Dockerfile
WORKDIR /app; production install; add serve and build steps; EXPOSE 3000; serve built assets via CMD.
Jenkins pipelines removed
Jenkins-Pipeline-Code/Jenkinsfile-Backend, Jenkins-Pipeline-Code/Jenkinsfile-Frontend
Deleted backend and frontend Jenkins declarative pipelines including code checkout, scans, builds, ECR push, and manifest updates.
Terraform for Jenkins server removed
Jenkins-Server-TF/*
Deleted provider/backend config, VPC/networking, EC2, IAM role/profile/policy, AMI data, variables and tfvars, lockfile, install script.
Legacy Kubernetes manifests removed
Kubernetes-Manifests-file/Backend/deployment.yaml, .../Database/*, .../Frontend/service.yaml, Kubernetes-Manifests-file/ingress.yaml
Removed prior Deployment/Service/Secret/PV/Ingress resources for the three-tier app.
K8s backend (new/updated)
k8s-manifests/backend/deployment.yml, k8s-manifests/backend/service.yml
Added backend Deployment (app: backend, probes, resources, secret refs); Service renamed to backend-svc and selector updated to app: backend.
K8s database (new/updated)
k8s-manifests/database/deployment.yml, k8s-manifests/database/service.yml, k8s-manifests/database/pvc.yml, k8s-manifests/database/pv.yml, k8s-manifests/database/secrets.yml, k8s-manifests/database/namespace.yml
Added namespace; MongoDB Deployment (2 replicas) with PVC mount; Service mongo-svc; Secret mongo-secrets; PV (5Gi hostPath) and PVC renamed to mongo-pvc with standard storage class and 2Gi request.
K8s frontend (new/updated)
k8s-manifests/frontend/deployment.yml, k8s-manifests/frontend/service.yml
Frontend Deployment image changed, replicas 2, removed imagePullSecrets/env; Service frontend-svc (ClusterIP 3000, selector role: frontend).
K8s ingress and autoscaling
k8s-manifests/ingress.yml, k8s-manifests/hpa.yml
Added Ingress routing host 13.126.110.2.nip.io to backend-svc:3500 and frontend-svc:3000; HPA for backend-dep (1–5 replicas, 50% CPU).
Kind cluster definition
k8s-manifests/cluster.yml
Added Kind cluster with 1 control-plane and 3 workers (kindest/node:v1.32.2).

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant U as User
  participant I as Ingress
  participant F as frontend-svc
  participant B as backend-svc
  participant FE as Frontend Pod(s)
  participant BE as Backend Pod(s)
  participant DB as MongoDB (mongo-svc)

  rect rgb(245,248,250)
  note over U,I: HTTP requests via host 13.126.110.2.nip.io
  U->>I: GET /
  I->>F: Route to port 3000
  F->>FE: Forward request
  FE-->>U: Serve static UI
  end

  rect rgb(245,250,245)
  U->>I: GET /api/...
  I->>B: Route to port 3500
  B->>BE: Forward request
  BE->>DB: Query using mongo-secrets creds
  DB-->>BE: Data
  BE-->>U: JSON response
  end

  note right of BE: HPA monitors CPU (50% target)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

A bunny taps deploy with quiet cheer,
Old vines pruned, new shoots appear.
Pods now hop behind an ingress gate,
Secrets tucked, services relate.
Kind clouds cradle this meadow bright—
Scale when sunny, rest at night.
Onward, nibbling bytes just right. 🐇✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@abhihkX8
Copy link
Copy Markdown
Author

add modified files

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
k8s-manifests/frontend/deployment.yml (2)

24-30: Harden the container and add basic health checks/resources.

Address Checkov findings and improve operability with probes and resource requests/limits.

       containers:
       - name: frontend
         image: abhimaske/frontend-image:latest
         imagePullPolicy: Always
-        ports:
-        - containerPort: 3000
+        securityContext:
+          allowPrivilegeEscalation: false
+          readOnlyRootFilesystem: true
+          runAsNonRoot: true
+          capabilities:
+            drop: ["ALL"]
+        resources:
+          requests:
+            cpu: "100m"
+            memory: "128Mi"
+          limits:
+            cpu: "250m"
+            memory: "256Mi"
+        ports:
+          - containerPort: 3000
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 3000
+          initialDelaySeconds: 5
+          periodSeconds: 10
+        livenessProbe:
+          httpGet:
+            path: /
+            port: 3000
+          initialDelaySeconds: 15
+          periodSeconds: 20

24-30: Ensure removal of runtime REACT_APP_BACKEND_URL or inject it at build time

We still see a runtime reference to REACT_APP_BACKEND_URL in your frontend code. Either switch to hard-coded relative endpoints (e.g. /api/tasks) or rebuild the image with the correct REACT_APP_BACKEND_URL baked in.

• Application-Code/frontend/src/services/taskServices.js
– Line 2: const apiUrl = process.env.REACT_APP_BACKEND_URL
– Console log and subsequent calls rely on this value

Suggested fix:

- const apiUrl = process.env.REACT_APP_BACKEND_URL
+ const apiUrl = "/api/tasks"

—or— ensure your Docker build sets REACT_APP_BACKEND_URL to the cluster’s ingress endpoint so the value is available at runtime.

🧹 Nitpick comments (18)
k8s-manifests/cluster.yml (1)

1-15: Kind cluster: add name and extraPortMappings for Ingress/HTTP access

If you plan to access services via an Ingress inside kind, map host ports 80/443. Also consider naming the cluster for clarity.

Apply this diff to the control-plane node:

 kind: Cluster
 apiVersion: kind.x-k8s.io/v1alpha4

 nodes:
 - role: control-plane
   image: kindest/node:v1.32.2
+  extraPortMappings:
+    - containerPort: 80
+      hostPort: 80
+      protocol: TCP
+    - containerPort: 443
+      hostPort: 443
+      protocol: TCP

Optionally, add a name:

 kind: Cluster
 apiVersion: kind.x-k8s.io/v1alpha4
+name: three-tier-kind
Application-Code/backend/Dockerfile (1)

1-13: Harden and optimize Node image (LTS, prod deps only, non-root, EXPOSE)

Current image (Node 18) is EOL. Also, install only production deps, run as non-root, and expose the app port (3500 per k8s deployment).

Apply:

-FROM node:18-alpine
+FROM node:20-alpine

 WORKDIR /app

-COPY package*.json ./
-RUN npm install
+ENV NODE_ENV=production
+COPY package*.json ./
+# Prefer reproducible installs; falls back if no lockfile
+RUN if [ -f package-lock.json ]; then npm ci --omit=dev; else npm install --omit=dev; fi

 COPY . .

-CMD ["node", "index.js"]
+EXPOSE 3500
+# Drop root privileges (node user exists in upstream image)
+USER node
+CMD ["node", "index.js"]

Additionally, ensure a .dockerignore exists to keep the image small (node_modules, logs, build artifacts). I can draft it if you want.

k8s-manifests/database/pv.yml (1)

11-15: Fix YAML lint issues and indentation

Trailing spaces and wrong indentation on accessModes.

Apply:

 spec:
   storageClassName: standard

   capacity:
-    storage: 5Gi
-      
+    storage: 5Gi
+
   accessModes:
-      - ReadWriteOnce
+    - ReadWriteOnce

Also remove trailing spaces on lines with hostPath and any blank extra line at the end.

k8s-manifests/frontend/service.yml (1)

1-18: Tidy YAML (trailing spaces, spacing, and explicit targetPort/name)

Minor YAML lint issues and small clarity tweaks.

Apply:

 metadata:
- name: frontend-svc
- namespace: three-tier
+  name: frontend-svc
+  namespace: three-tier

 spec:
- ports:
-  - port: 3000
-    protocol: TCP
+  ports:
+    - name: http
+      port: 3000
+      targetPort: 3000
+      protocol: TCP
- type: ClusterIP
+  type: ClusterIP
   selector:
-  role: frontend  
+    role: frontend

Rationale:

  • Indentation normalized.
  • Removed trailing spaces.
  • Explicit port name/targetPort improves readability and future-proofing (e.g., when using Ingress backends by name).
k8s-manifests/database/secrets.yml (1)

8-14: Normalize Secret type and fix YAML lint issues.

Use the canonical type and clean spacing to avoid drift and linter noise.

Apply this diff:

 type: opaque
+type: Opaque
 data:
   password: YWJoaTEyMw==      # abhi123
-  username:  YWJoaW1hc2tl     # abhimaske
+  username: YWJoaW1hc2tl     # abhimaske
-    
-
-
+
k8s-manifests/backend/service.yml (1)

6-6: Trim trailing whitespace and consider explicit targetPort/port name.

No functional impact, but keeps diffs/lint clean and improves clarity.

Apply this diff to fix trailing space and optionally add explicit fields:

-spec: 
+spec:
   ports:
-  - port: 3500
+  - name: http
+    port: 3500
+    targetPort: 3500
     protocol: TCP
k8s-manifests/database/service.yml (3)

6-6: Remove trailing space after namespace.

Minor lint fix.

-  namespace: three-tier  
+  namespace: three-tier

12-15: Port name “mongo-pvc” is misleading; rename to a protocol/port purpose.

Port names are for protocol discovery, not storage. Use “mongo” or “mongodb”.

-    - name: mongo-pvc
+    - name: mongo
       protocol: TCP
       port: 27017
       targetPort: 27017

16-17: Drop extra blank line at end of file.

Keeps YAML tidy and satisfies linters.

-
 
k8s-manifests/hpa.yml (1)

14-15: Align min/max with Deployment’s replica expectations.

Your backend Deployment defaults to 2 replicas; HPA minReplicas: 1 will allow scaling down below current baseline. If you want to maintain at least 2, set minReplicas: 2.

-  minReplicas: 1
+  minReplicas: 2
k8s-manifests/ingress.yml (1)

6-8: Consider specifying ingressClassName and TLS for production.

  • Add ingressClassName: nginx to bind explicitly to the NGINX controller.
  • Add TLS with a host and secretName for HTTPS.

Example:

 metadata:
   name: three-tier-ingress
   namespace: three-tier
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /
+ingressClassName: nginx
 spec:
   rules:
     - host: "13.126.110.2.nip.io"
+  tls:
+    - hosts:
+        - "13.126.110.2.nip.io"
+      secretName: three-tier-tls
k8s-manifests/frontend/deployment.yml (2)

8-10: Trim trailing whitespace to satisfy linters.

Lines 8–9 contain trailing spaces flagged by yamllint.

Apply:

-    
-spec: 
+spec:

26-26: Avoid using the latest tag for images.

Pin to a version or digest to ensure repeatable deploys.

Example:

-        image: abhimaske/frontend-image:latest
+        image: abhimaske/frontend-image:v1.0.0
# or pin by digest
+# image: abhimaske/frontend-image@sha256:<digest>
k8s-manifests/database/deployment.yml (2)

24-46: Harden Mongo container and add health probes.

Improve security posture and resilience.

     spec:
       containers:
        - name: mongo
          image: mongo:4.4.6
+         securityContext:
+           runAsNonRoot: true
+           allowPrivilegeEscalation: false
+           readOnlyRootFilesystem: true
+           capabilities:
+             drop: ["ALL"]
+         # If the image requires a specific uid/gid, set them explicitly
+         # runAsUser: 999
+         # runAsGroup: 999
+         # fsGroup: 999
          ports:
           - containerPort: 27017
+         readinessProbe:
+           exec:
+             command: ["mongosh", "--eval", "db.adminCommand('ping')"]
+           initialDelaySeconds: 15
+           periodSeconds: 10
+         livenessProbe:
+           tcpSocket:
+             port: 27017
+           initialDelaySeconds: 30
+           periodSeconds: 20

Note: mongosh must be present in the image; otherwise switch readinessProbe to a TCP check as well.


1-53: Fix indentation, trailing spaces, and stray blank lines flagged by yamllint.

Numerous indentation issues and trailing spaces (e.g., lines 36, 41, 42, 46, 50, 51) will cause CI/style failures and can hinder readability.

Happy to push a cleaned YAML if you’d like.

k8s-manifests/backend/deployment.yml (2)

20-40: Harden the backend container to address Checkov findings.

Add a container securityContext to avoid running as root and block privilege escalation.

       containers:
         - name: three-tier-app
           image: abhimaske/backend-image:latest
           imagePullPolicy: Always
+          securityContext:
+            allowPrivilegeEscalation: false
+            readOnlyRootFilesystem: true
+            runAsNonRoot: true
+            capabilities:
+              drop: ["ALL"]

3-3: Trim trailing whitespace and extra blank lines.

Yamllint flagged trailing spaces on lines 3, 15, 54, 56 and an extra blank line at the end.

Also applies to: 15-15, 54-54, 56-56, 69-69

k8s-manifests/database/pvc.yml (1)

8-8: Clean trailing spaces and extra blank lines in PVC manifest.

Minor formatting issues flagged by yamllint.

-spec: 
+spec:
@@
-      
+

Also applies to: 17-17

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 82f9f75 and 2e9a066.

📒 Files selected for processing (36)
  • Application-Code/backend/Dockerfile (1 hunks)
  • Application-Code/frontend/Dockerfile (1 hunks)
  • Jenkins-Pipeline-Code/Jenkinsfile-Backend (0 hunks)
  • Jenkins-Pipeline-Code/Jenkinsfile-Frontend (0 hunks)
  • Jenkins-Server-TF/.terraform.lock.hcl (0 hunks)
  • Jenkins-Server-TF/backend.tf (0 hunks)
  • Jenkins-Server-TF/ec2.tf (0 hunks)
  • Jenkins-Server-TF/gather.tf (0 hunks)
  • Jenkins-Server-TF/iam-instance-profile.tf (0 hunks)
  • Jenkins-Server-TF/iam-policy.tf (0 hunks)
  • Jenkins-Server-TF/iam-role.tf (0 hunks)
  • Jenkins-Server-TF/provider.tf (0 hunks)
  • Jenkins-Server-TF/tools-install.sh (0 hunks)
  • Jenkins-Server-TF/variables.tf (0 hunks)
  • Jenkins-Server-TF/variables.tfvars (0 hunks)
  • Jenkins-Server-TF/vpc.tf (0 hunks)
  • Kubernetes-Manifests-file/Backend/deployment.yaml (0 hunks)
  • Kubernetes-Manifests-file/Database/deployment.yaml (0 hunks)
  • Kubernetes-Manifests-file/Database/pv.yaml (0 hunks)
  • Kubernetes-Manifests-file/Database/secrets.yaml (0 hunks)
  • Kubernetes-Manifests-file/Database/service.yaml (0 hunks)
  • Kubernetes-Manifests-file/Frontend/service.yaml (0 hunks)
  • Kubernetes-Manifests-file/ingress.yaml (0 hunks)
  • k8s-manifests/backend/deployment.yml (1 hunks)
  • k8s-manifests/backend/service.yml (1 hunks)
  • k8s-manifests/cluster.yml (1 hunks)
  • k8s-manifests/database/deployment.yml (1 hunks)
  • k8s-manifests/database/namespace.yml (1 hunks)
  • k8s-manifests/database/pv.yml (1 hunks)
  • k8s-manifests/database/pvc.yml (1 hunks)
  • k8s-manifests/database/secrets.yml (1 hunks)
  • k8s-manifests/database/service.yml (1 hunks)
  • k8s-manifests/frontend/deployment.yml (2 hunks)
  • k8s-manifests/frontend/service.yml (1 hunks)
  • k8s-manifests/hpa.yml (1 hunks)
  • k8s-manifests/ingress.yml (1 hunks)
💤 Files with no reviewable changes (21)
  • Jenkins-Server-TF/.terraform.lock.hcl
  • Kubernetes-Manifests-file/Frontend/service.yaml
  • Jenkins-Server-TF/provider.tf
  • Jenkins-Server-TF/iam-role.tf
  • Kubernetes-Manifests-file/Database/service.yaml
  • Jenkins-Server-TF/iam-policy.tf
  • Kubernetes-Manifests-file/ingress.yaml
  • Jenkins-Server-TF/ec2.tf
  • Jenkins-Server-TF/gather.tf
  • Jenkins-Pipeline-Code/Jenkinsfile-Frontend
  • Jenkins-Server-TF/vpc.tf
  • Jenkins-Server-TF/variables.tf
  • Jenkins-Server-TF/iam-instance-profile.tf
  • Jenkins-Server-TF/variables.tfvars
  • Kubernetes-Manifests-file/Backend/deployment.yaml
  • Kubernetes-Manifests-file/Database/pv.yaml
  • Jenkins-Server-TF/tools-install.sh
  • Jenkins-Server-TF/backend.tf
  • Kubernetes-Manifests-file/Database/secrets.yaml
  • Jenkins-Pipeline-Code/Jenkinsfile-Backend
  • Kubernetes-Manifests-file/Database/deployment.yaml
🧰 Additional context used
🪛 YAMLlint (1.37.1)
k8s-manifests/database/service.yml

[error] 6-6: trailing spaces

(trailing-spaces)


[warning] 16-16: too many blank lines (1 > 0)

(empty-lines)

k8s-manifests/backend/service.yml

[error] 6-6: trailing spaces

(trailing-spaces)

k8s-manifests/frontend/service.yml

[error] 14-14: trailing spaces

(trailing-spaces)


[warning] 17-17: too many blank lines (3 > 0)

(empty-lines)

k8s-manifests/backend/deployment.yml

[error] 3-3: trailing spaces

(trailing-spaces)


[error] 15-15: trailing spaces

(trailing-spaces)


[error] 54-54: trailing spaces

(trailing-spaces)


[error] 56-56: trailing spaces

(trailing-spaces)


[warning] 69-69: too many blank lines (1 > 0)

(empty-lines)

k8s-manifests/database/deployment.yml

[warning] 8-8: wrong indentation: expected 2 but found 3

(indentation)


[warning] 11-11: wrong indentation: expected 1 but found 2

(indentation)


[warning] 13-13: wrong indentation: expected 3 but found 4

(indentation)


[warning] 14-14: wrong indentation: expected 5 but found 6

(indentation)


[warning] 17-17: wrong indentation: expected 3 but found 4

(indentation)


[warning] 18-18: wrong indentation: expected 5 but found 6

(indentation)


[warning] 21-21: wrong indentation: expected 7 but found 8

(indentation)


[warning] 25-25: wrong indentation: expected 5 but found 6

(indentation)


[warning] 31-31: wrong indentation: expected 10 but found 11

(indentation)


[warning] 33-33: wrong indentation: expected 14 but found 15

(indentation)


[warning] 34-34: wrong indentation: expected 16 but found 17

(indentation)


[error] 36-36: trailing spaces

(trailing-spaces)


[warning] 39-39: wrong indentation: expected 14 but found 15

(indentation)


[warning] 40-40: wrong indentation: expected 16 but found 18

(indentation)


[error] 41-41: trailing spaces

(trailing-spaces)


[error] 42-42: trailing spaces

(trailing-spaces)


[warning] 44-44: wrong indentation: expected 10 but found 12

(indentation)


[error] 46-46: trailing spaces

(trailing-spaces)


[warning] 48-48: wrong indentation: expected 7 but found 8

(indentation)


[warning] 50-50: wrong indentation: expected 11 but found 12

(indentation)


[error] 50-50: trailing spaces

(trailing-spaces)


[error] 51-51: trailing spaces

(trailing-spaces)


[warning] 52-52: too many blank lines (1 > 0)

(empty-lines)

k8s-manifests/ingress.yml

[warning] 23-23: wrong indentation: expected 10 but found 9

(indentation)


[warning] 24-24: wrong indentation: expected 11 but found 10

(indentation)


[warning] 26-26: wrong indentation: expected 12 but found 11

(indentation)


[error] 26-26: trailing spaces

(trailing-spaces)

k8s-manifests/database/secrets.yml

[warning] 11-11: too many spaces after colon

(colons)


[error] 12-12: trailing spaces

(trailing-spaces)


[warning] 14-14: too many blank lines (2 > 0)

(empty-lines)

k8s-manifests/database/pv.yml

[error] 6-6: trailing spaces

(trailing-spaces)


[error] 13-13: trailing spaces

(trailing-spaces)


[warning] 15-15: wrong indentation: expected 4 but found 6

(indentation)


[error] 17-17: trailing spaces

(trailing-spaces)


[warning] 19-19: too many blank lines (1 > 0)

(empty-lines)

k8s-manifests/frontend/deployment.yml

[error] 8-8: trailing spaces

(trailing-spaces)


[error] 9-9: trailing spaces

(trailing-spaces)

k8s-manifests/database/pvc.yml

[error] 8-8: trailing spaces

(trailing-spaces)


[warning] 17-17: too many blank lines (3 > 0)

(empty-lines)

🪛 Checkov (3.2.334)
k8s-manifests/backend/deployment.yml

[MEDIUM] 1-68: Containers should not run with allowPrivilegeEscalation

(CKV_K8S_20)


[MEDIUM] 1-68: Minimize the admission of root containers

(CKV_K8S_23)

k8s-manifests/database/deployment.yml

[MEDIUM] 1-50: Containers should not run with allowPrivilegeEscalation

(CKV_K8S_20)


[MEDIUM] 1-50: Minimize the admission of root containers

(CKV_K8S_23)

k8s-manifests/frontend/deployment.yml

[MEDIUM] 1-29: Containers should not run with allowPrivilegeEscalation

(CKV_K8S_20)


[MEDIUM] 1-29: Minimize the admission of root containers

(CKV_K8S_23)

🔇 Additional comments (8)
k8s-manifests/database/namespace.yml (1)

1-7: Namespace manifest looks good

Simple, correct, and consistent with the rest of the PR.

k8s-manifests/frontend/service.yml (1)

13-14: Service selector matches Deployment labels
Verified that the Service’s selector role: frontend aligns with the Deployment’s labels in k8s-manifests/frontend/deployment.yml:

  • metadata.labels.role: frontend (line 7)
  • spec.selector.matchLabels.role: frontend (line 18)
  • template.metadata.labels.role: frontend (line 22)

No changes required.

k8s-manifests/backend/service.yml (1)

4-4: Service rename and selector alignment look good.

Name matches Ingress backend reference and selector matches backend Deployment labels.

Also applies to: 12-12

k8s-manifests/hpa.yml (1)

17-23: CPU requests confirmed in backend Deployment

The backend Deployment (k8s-manifests/backend/deployment.yml) already specifies:

  • resources.requests.cpu: "250m" (line 43)

HPA’s averageUtilization target will work as expected.

Application-Code/frontend/Dockerfile (1)

18-18: Ensure backend URL is baked into the build

Detected use of process.env.REACT_APP_BACKEND_URL at runtime, which CRA only inlines at build time. Since CMD ["serve", "-s", "build", "-l", "3000"] simply serves static files (no runtime templating), confirm one of the following:

  • You pass REACT_APP_BACKEND_URL into the build step (e.g.,
    docker build --build-arg REACT_APP_BACKEND_URL=$BACKEND_URL ...)
  • You switch to relative API paths (e.g., fetch(/api/tasks)) and handle routing via ingress rewriting.

Locations to review:

  • Application-Code/frontend/src/services/taskServices.js:2
k8s-manifests/backend/deployment.yml (2)

41-48: Good resource requests/limits and well-defined probes.

The resource section looks reasonable for a starter profile, and probes on /ok are in place.


26-37: Verify Kubernetes secret keys
Please confirm that the mongo-secrets secret in the three-tier namespace contains both username and password keys, as referenced by the MONGO_USERNAME and MONGO_PASSWORD environment variables.

k8s-manifests/database/pvc.yml (1)

1-15: PVC configuration aligns with PV storageClass and size.

Name, storageClassName, and requested size changes look consistent with the PV. This should bind successfully.

Comment on lines +7 to +15
RUN npm install --only=production

# Install 'serve' globally (for serving static files)
RUN npm install -g serve

COPY . .
CMD [ "npm", "start" ]

RUN npm run build

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Build will likely fail: devDependencies are not installed before npm run build.

npm install --only=production excludes devDependencies (e.g., react-scripts), which are required for the build step. This will break npm run build. Also, Node 14 is EOL; consider upgrading and using a multi-stage build to reduce image size and improve security.

Apply this multi-stage refactor:

-FROM node:14
-
-WORKDIR /app
-
-COPY package*.json ./
-
-RUN npm install --only=production
-
-# Install 'serve' globally (for serving static files)
-RUN npm install -g serve
-
-COPY . .
-
-RUN npm run build
-
-EXPOSE 3000
-
-CMD ["serve", "-s", "build", "-l", "3000"]
+FROM node:18-alpine AS builder
+WORKDIR /app
+COPY package*.json ./
+# Install all deps (including dev) for build determinism and speed
+RUN npm ci
+COPY . .
+RUN npm run build
+
+# Runtime stage
+FROM node:18-alpine AS runtime
+WORKDIR /app
+RUN npm install -g serve@14
+# Copy only the built assets
+COPY --from=builder /app/build /app/build
+EXPOSE 3000
+# Drop root
+USER node
+CMD ["serve", "-s", "build", "-l", "3000"]

Also applies to: 1-20

🤖 Prompt for AI Agents
In Application-Code/frontend/Dockerfile around lines 7 to 15, the Dockerfile
runs npm install --only=production before npm run build which omits
devDependencies (like build toolchains) and will break the build; refactor to a
multi-stage build: use a modern Node LTS base (e.g., node:18) in the builder
stage, copy package.json and package-lock.json, run npm install (full dev deps)
and run npm run build, then create a smaller production stage (node:18-alpine or
nginx) that copies only the build output, installs only production deps if
needed, and does not include devDependencies; optionally install a lightweight
static server in the final stage or use nginx and avoid global serve in builder
to minimize image size and surface attack surface.

Comment on lines +11 to +12
replicas: 2
selector:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

PVC is ReadWriteOnce; 2 replicas will fail to mount. Use 1 replica or migrate to StatefulSet.

With a single RWO PVC (mongo-pvc), multiple pods cannot mount the same volume across nodes. Either set replicas to 1 or switch to a StatefulSet with per-pod PVCs.

Minimal safe fix:

 spec:
-  replicas: 2
+  replicas: 1

Optional, recommended follow-up: convert to StatefulSet with volumeClaimTemplates and a Headless Service for a proper MongoDB replicaset.

Also applies to: 47-50

🧰 Tools
🪛 YAMLlint (1.37.1)

[warning] 11-11: wrong indentation: expected 1 but found 2

(indentation)

Comment on lines +18 to +22
name: mongo-pod
namespace: three-tier
labels:
app: mongodb

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Invalid fields in Pod template metadata (name and namespace).

template.metadata must not set name or namespace. These will be rejected by the API.

Remove them:

     metadata:
-      name: mongo-pod
-      namespace: three-tier
       labels:
         app: mongodb
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
name: mongo-pod
namespace: three-tier
labels:
app: mongodb
metadata:
labels:
app: mongodb
🧰 Tools
🪛 YAMLlint (1.37.1)

[warning] 18-18: wrong indentation: expected 5 but found 6

(indentation)


[warning] 21-21: wrong indentation: expected 7 but found 8

(indentation)

🤖 Prompt for AI Agents
In k8s-manifests/database/deployment.yml around lines 18 to 22, the Pod template
metadata incorrectly includes the name and namespace fields which are not
allowed; remove the name and namespace entries from template.metadata so the
Deployment only sets labels/annotations there and relies on the Deployment's
metadata.name and metadata.namespace instead, ensuring the manifest validates
against the Kubernetes API.

Comment on lines +4 to +7
metadata:
name: mongo-pv
namespace: three-tier

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

PersistentVolume is cluster-scoped; remove metadata.namespace

PV objects cannot be namespaced. This will fail validation in many setups.

Apply:

 metadata:
   name: mongo-pv
-  namespace: three-tier  
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
metadata:
name: mongo-pv
namespace: three-tier
metadata:
name: mongo-pv
🧰 Tools
🪛 YAMLlint (1.37.1)

[error] 6-6: trailing spaces

(trailing-spaces)

🤖 Prompt for AI Agents
In k8s-manifests/database/pv.yml around lines 4 to 7, the PersistentVolume
manifest incorrectly includes a metadata.namespace field (PV objects are
cluster-scoped and must not have a namespace). Remove the namespace line from
the metadata section so the PV has only metadata.name (and any
labels/annotations if needed) and validate the file to ensure no other namespace
fields remain.

Comment on lines +8 to +19
spec:
storageClassName: standard

capacity:
storage: 5Gi

accessModes:
- ReadWriteOnce

hostPath:
path: /mnt/data

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Storage design will break with multiple MongoDB replicas and hostPath

  • hostPath PV + ReadWriteOnce cannot be mounted by 2 Mongo pods simultaneously.
  • hostPath on a multi-node kind cluster is node-local and not suitable for HA/stateful multi-replica setups.

Recommended:

  • Use a StatefulSet with volumeClaimTemplates and set replicas: 1 for MongoDB; or
  • Provide a RWX-capable storage class (e.g., NFS) if you truly need multiple replicas; or
  • In kind, prefer dynamic provisioning via the cluster’s default StorageClass and just create a PVC (no static PV), letting the provisioner handle it.

If you stick with hostPath for local dev:

  • Keep a single Mongo replica and pin the pod to one node via nodeSelector or tolerations to avoid accidental rescheduling data loss.

I can provide a Mongo StatefulSet + PVC patch aligned to your decision.

To verify the current setup across the repo (replica count and PVC usage), run:


🏁 Script executed:

#!/bin/bash
# Check Mongo deployment replicas and PVC references
rg -n -C2 -g 'k8s-manifests/**' -P '(?s)kind:\s*Deployment.*metadata:\s*name:\s*.*mongo.*?$.*?\n.*?replicas:\s*(\d+)' 
rg -n -C2 -g 'k8s-manifests/**' -P 'PersistentVolumeClaim|volumeMounts|claimName'

Length of output: 1042


🏁 Script executed:

#!/bin/bash
# Display MongoDB Deployment for replicas, node selectors, and scheduling hints
echo "=== deployment.yml ==="
sed -n '1,200p' k8s-manifests/database/deployment.yml

# Display PVC to confirm storageClassName, accessModes, and capacity
echo
echo "=== pvc.yml ==="
sed -n '1,200p' k8s-manifests/database/pvc.yml

Length of output: 1421


MongoDB Deployment with hostPath PV and 2 replicas will break

We’ve confirmed your mongo-dep Deployment is set to replicas: 2 and mounts a hostPath-backed PVC (mongo-pvc). A hostPath PV with ReadWriteOnce only supports single-node access and cannot reliably share data across pods on different nodes:

• Location:
– k8s-manifests/database/pv.yml (hostPath PV + RWO)
– k8s-manifests/database/deployment.yml (replicas: 2, mounts mongo-pvc)

Recommendations (choose one):

  • Convert to a StatefulSet with volumeClaimTemplates and keep replicas: 1 for local dev, or scale out against a proper RWX storage class.
  • Switch to a RWX-capable storage class (e.g., NFS) if you need multiple Mongo replicas concurrently.
  • Use dynamic provisioning via the cluster’s default StorageClass—remove the static PV and let the provisioner handle PV creation.

If you must stick with hostPath for local development:

  • Reduce to a single Mongo replica (replicas: 1)
  • Pin the pod to one node via nodeSelector or tolerations to prevent cross-node scheduling

Let me know which approach you’d like—I can draft a StatefulSet + PVC patch accordingly.

🧰 Tools
🪛 YAMLlint (1.37.1)

[error] 13-13: trailing spaces

(trailing-spaces)


[warning] 15-15: wrong indentation: expected 4 but found 6

(indentation)


[error] 17-17: trailing spaces

(trailing-spaces)


[warning] 19-19: too many blank lines (1 > 0)

(empty-lines)

🤖 Prompt for AI Agents
k8s-manifests/database/pv.yml lines 8-19: the current PV uses hostPath with
accessMode ReadWriteOnce which cannot support your Deployment's replicas:2; fix
by one of these concrete options: (A) for quick local-dev: set the Mongo
Deployment replicas to 1 (or pin pods to a single node via
nodeSelector/tolerations) and keep hostPath; (B) for multi-replica correctness:
replace the static hostPath PV with a RWX-capable StorageClass (e.g., NFS) and
reference that StorageClassName so multiple pods can mount concurrently; (C)
better for stateful workloads: convert the Deployment to a StatefulSet using
volumeClaimTemplates (one PVC per replica) and remove the hostPath static PV so
dynamic provisioning can create appropriate PVs; or (D) remove the static PV
entirely and rely on the cluster’s default StorageClass for dynamic
provisioning—choose one and update pv.yml (or deployment/statefulset)
accordingly.

Comment on lines +8 to +11
type: opaque
data:
password: YWJoaTEyMw== # abhi123
username: YWJoaW1hc2tl # abhimaske
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Do not commit plaintext credentials as Kubernetes Secret data in VCS. Rotate and externalize.

Base64 ≠ encryption. These hardcoded creds are recoverable from the repo history. Move secret creation to runtime (CI/CD or cluster), rotate the Mongo credentials, and remove this file from git. Options:

  • Use SealedSecrets or External Secrets (preferred).
  • Or generate/apply at deploy time: kubectl create secret ... --dry-run=client -o yaml | kubectl apply -f -

I can provide SealedSecret/ExternalSecret templates and a migration checklist if you want.

🧰 Tools
🪛 YAMLlint (1.37.1)

[warning] 11-11: too many spaces after colon

(colons)

🤖 Prompt for AI Agents
In k8s-manifests/database/secrets.yml around lines 8 to 11, the file contains
base64-encoded plaintext Mongo credentials committed to VCS; remove these
secrets from the repo, rotate the Mongo user/password immediately, and stop
committing secrets. Replace the tracked file with a mechanism that injects
secrets at deploy/runtime: either adopt SealedSecrets or ExternalSecrets
(preferred) or generate the Secret in CI/CD/cluster using kubectl create secret
... --dry-run=client -o yaml | kubectl apply -f -; update manifests to reference
the external/sealed secret name, add the file to .gitignore, and purge the
leaked credentials from git history (use git filter-repo or BFG) after rotating
credentials.

Comment on lines +13 to +26
- path: /
pathType: Prefix
backend:
service:
name: backend-svc
port:
number: 3500
- path: /
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 3000
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Two identical “/” paths will shadow one another; frontend or backend becomes unreachable.

NGINX will only route one of these. Use distinct paths or hosts (e.g., “/api” for backend, “/” for frontend).

Apply this diff to separate routes and fix indentation/trailing space:

       paths:
-      - path: /
+      - path: /api
         pathType: Prefix
         backend:
           service:
             name: backend-svc
             port:
               number: 3500
       - path: /
         pathType: Prefix
         backend:
-         service:
-          name: frontend-svc
-          port:
-           number: 3000    
+          service:
+            name: frontend-svc
+            port:
+              number: 3000
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- path: /
pathType: Prefix
backend:
service:
name: backend-svc
port:
number: 3500
- path: /
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 3000
- path: /api
pathType: Prefix
backend:
service:
name: backend-svc
port:
number: 3500
- path: /
pathType: Prefix
backend:
service:
name: frontend-svc
port:
number: 3000
🧰 Tools
🪛 YAMLlint (1.37.1)

[warning] 23-23: wrong indentation: expected 10 but found 9

(indentation)


[warning] 24-24: wrong indentation: expected 11 but found 10

(indentation)


[warning] 26-26: wrong indentation: expected 12 but found 11

(indentation)


[error] 26-26: trailing spaces

(trailing-spaces)

🤖 Prompt for AI Agents
In k8s-manifests/ingress.yml around lines 13 to 26, there are two identical "/"
path entries which shadow each other; change the backend route to a distinct
path or host (for example use "/api" for the backend and keep "/" for the
frontend), correct YAML indentation for the backend service block so keys
(service, name, port, number) align properly, ensure pathType: Prefix is present
for both, and remove trailing spaces on lines to produce valid, unambiguous
ingress routing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants