apiVersion: v1 kind: ConfigMap metadata: name: frontend-nam-dev-config namespace: nam-frontend-dev labels: app.kubernetes.io/name: frontend-nam-dev app.kubernetes.io/instance: frontend-nam-dev data: ".env": | VITE_API_URL=https://api.example.com VITE_APP_ENV=development --- apiVersion: apps/v1 kind: Deployment metadata: name: frontend-nam-dev namespace: nam-frontend-dev labels: app.kubernetes.io/instance: frontend-nam-dev app.kubernetes.io/name: frontend-nam-dev spec: progressDeadlineSeconds: 600 replicas: 2 revisionHistoryLimit: 10 selector: matchLabels: app.kubernetes.io/instance: frontend-nam-dev app.kubernetes.io/name: frontend-nam-dev strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate template: metadata: labels: app.kubernetes.io/instance: frontend-nam-dev app.kubernetes.io/name: frontend-nam-dev spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app.kubernetes.io/instance: frontend-nam-dev app.kubernetes.io/name: frontend-nam-dev topologyKey: "kubernetes.io/hostname" containers: - name: web image: git.winteraccess.id/winter-access/frontend-nam:dev imagePullPolicy: Always resources: limits: cpu: "250m" memory: 512M requests: cpu: "100m" memory: 256M ports: - containerPort: 80 name: http protocol: TCP livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 5 securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] readOnlyRootFilesystem: false terminationMessagePath: /dev/termination-log terminationMessagePolicy: File envFrom: - configMapRef: name: frontend-nam-dev-config imagePullSecrets: - name: winter-registry dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: runAsNonRoot: true terminationGracePeriodSeconds: 30 --- apiVersion: v1 kind: Service metadata: name: frontend-nam-dev namespace: nam-frontend-dev labels: app.kubernetes.io/name: frontend-nam-dev app.kubernetes.io/instance: frontend-nam-dev spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app.kubernetes.io/instance: frontend-nam-dev app.kubernetes.io/name: frontend-nam-dev sessionAffinity: None type: ClusterIP --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/router.entrypoints: web traefik.ingress.kubernetes.io/router.middlewares: default-https-redirect@kubernetescrd labels: app.kubernetes.io/instance: frontend-nam-dev app.kubernetes.io/name: frontend-nam-dev name: frontend-nam-dev-http namespace: nam-frontend-dev spec: ingressClassName: traefik rules: - host: dev-nam-frontend.winteraccess.id http: paths: - backend: service: name: frontend-nam-dev port: number: 80 path: / pathType: Prefix --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: cert-manager.io/cluster-issuer: letsencrypt-production kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/router.entrypoints: websecure labels: app.kubernetes.io/instance: frontend-nam-dev app.kubernetes.io/name: frontend-nam-dev name: frontend-nam-dev-https namespace: nam-frontend-dev spec: ingressClassName: traefik rules: - host: dev-nam-frontend.winteraccess.id http: paths: - backend: service: name: frontend-nam-dev port: number: 80 path: / pathType: Prefix tls: - hosts: - dev-nam-frontend.winteraccess.id secretName: frontend-nam-dev-tls