{"id":4446,"date":"2025-11-11T08:22:42","date_gmt":"2025-11-11T01:22:42","guid":{"rendered":"https:\/\/www.jagowebdesign.com\/website\/?p=4446"},"modified":"2025-11-11T08:22:42","modified_gmt":"2025-11-11T01:22:42","slug":"devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure","status":"publish","type":"post","link":"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/","title":{"rendered":"DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure"},"content":{"rendered":"<p>Di era digital transformation, DevOps dan Cloud Native practices telah menjadi fundamental untuk delivering software dengan cepat, reliable, dan scalable. Organisasi yang mengadopsi Cloud Native dapat mencapai deployment frequency hingga 100x lebih cepat dengan failure rate 60x lebih rendah. Artikel ini akan membahas secara mendalam tentang DevOps best practices dan Cloud Native deployment strategies di tahun 2025.<\/p>\n<p>Understanding DevOps Culture dan Principles<\/p>\n<p>1. Core DevOps Principles<br \/>\nDevOps bukan hanya tentang tools, melainkan cultural philosophy yang menggabungkan development (Dev) dan operations (Ops):<\/p>\n<p>\u2022 Collaboration: Break down silos antar teams<br \/>\n\u2022 Automation: Automate repetitive tasks dan processes<br \/>\n\u2022 Continuous Improvement: Kaizen philosophy untuk incremental improvements<br \/>\n\u2022 Customer Centricity: Focus pada delivering value ke customers<br \/>\n\u2022 Measurement: Data-driven decision making<br \/>\n\u2022 Sharing: Knowledge sharing dan collective ownership<\/p>\n<p>2. CALMS Framework untuk DevOps Success<br \/>\n\u2022 Culture: Shared ownership dan blameless culture<br \/>\n\u2022 Automation: Toolchains untuk automating entire lifecycle<br \/>\n\u2022 Lean: Optimizing flow dan eliminating waste<br \/>\n\u2022 Measurement: Metrics dan monitoring untuk continuous improvement<br \/>\n\u2022 Sharing: Collaborative environment dan knowledge sharing<\/p>\n<p>3. DevOps Evolution Stages<br \/>\n&#8220;`javascript<br \/>\n\/\/ DevOps Maturity Assessment Framework<br \/>\nclass DevOpsMaturityAssessment {<br \/>\n  constructor() {<br \/>\n    this.stages = {<br \/>\n      initial: {<br \/>\n        name: &#8216;Initial&#8217;,<br \/>\n        characteristics: [&#8216;Manual processes&#8217;, &#8216;Siloed teams&#8217;, &#8216;Ad-hoc deployments&#8217;],<br \/>\n        deploymentFrequency: &#8216;monthly&#8217;,<br \/>\n        leadTime: &#8216;months&#8217;,<br \/>\n        mttr: &#8216;weeks&#8217;<br \/>\n      },<br \/>\n      managed: {<br \/>\n        name: &#8216;Managed&#8217;,<br \/>\n        characteristics: [&#8216;Basic automation&#8217;, &#8216;Defined processes&#8217;, &#8216;Limited visibility&#8217;],<br \/>\n        deploymentFrequency: &#8216;weekly&#8217;,<br \/>\n        leadTime: &#8216;weeks&#8217;,<br \/>\n        mttr: &#8216;days&#8217;<br \/>\n      },<br \/>\n      defined: {<br \/>\n        name: &#8216;Defined&#8217;,<br \/>\n        characteristics: [&#8216;CI\/CD pipelines&#8217;, &#8216;Infrastructure as Code&#8217;, &#8216;Monitoring&#8217;],<br \/>\n        deploymentFrequency: &#8216;daily&#8217;,<br \/>\n        leadTime: &#8216;days&#8217;,<br \/>\n        mttr: &#8216;hours&#8217;<br \/>\n      },<br \/>\n      optimized: {<br \/>\n        name: &#8216;Optimized&#8217;,<br \/>\n        characteristics: [&#8216;Full automation&#8217;, &#8216;GitOps&#8217;, &#8216;Self-healing systems&#8217;],<br \/>\n        deploymentFrequency: &#8216;multiple daily&#8217;,<br \/>\n        leadTime: &#8216;hours&#8217;,<br \/>\n        mttr: &#8216;minutes&#8217;<br \/>\n      }<br \/>\n    };<br \/>\n  }<\/p>\n<p>  assessOrganization(organizationData) {<br \/>\n    const score = this.calculateScore(organizationData);<br \/>\n    const stage = this.determineStage(score);<\/p>\n<p>    return {<br \/>\n      currentStage: stage,<br \/>\n      score,<br \/>\n      recommendations: this.getRecommendations(stage),<br \/>\n      roadmap: this.createRoadmap(stage)<br \/>\n    };<br \/>\n  }<\/p>\n<p>  calculateScore(data) {<br \/>\n    let score = 0;<\/p>\n<p>    \/\/ Automation maturity (0-100)<br \/>\n    score += data.automationLevel * 0.25;<\/p>\n<p>    \/\/ Collaboration maturity (0-100)<br \/>\n    score += data.collaborationLevel * 0.20;<\/p>\n<p>    \/\/ Monitoring maturity (0-100)<br \/>\n    score += data.monitoringLevel * 0.20;<\/p>\n<p>    \/\/ Security integration (0-100)<br \/>\n    score += data.securityLevel * 0.15;<\/p>\n<p>    \/\/ Cloud adoption (0-100)<br \/>\n    score += data.cloudLevel * 0.20;<\/p>\n<p>    return Math.round(score);<br \/>\n  }<\/p>\n<p>  determineStage(score) {<br \/>\n    if (score &lt; 25) return this.stages.initial;<br \/>\n    if (score &lt; 50) return this.stages.managed;<br \/>\n    if (score  Dockerfile &lt; k8s\/dev-deployment.yaml &lt; k8s\/prod-deployment.yaml &lt;-<br \/>\n          &#8211;health-cmd pg_isready<br \/>\n          &#8211;health-interval 10s<br \/>\n          &#8211;health-timeout 5s<br \/>\n          &#8211;health-retries 5<br \/>\n        ports:<br \/>\n          &#8211; 5432:5432<\/p>\n<p>      redis:<br \/>\n        image: redis:7-alpine<br \/>\n        options: &gt;-<br \/>\n          &#8211;health-cmd &#8220;redis-cli ping&#8221;<br \/>\n          &#8211;health-interval 10s<br \/>\n          &#8211;health-timeout 5s<br \/>\n          &#8211;health-retries 5<br \/>\n        ports:<br \/>\n          &#8211; 6379:6379<\/p>\n<p>    steps:<br \/>\n      &#8211; name: Checkout code<br \/>\n        uses: actions\/checkout@v4<\/p>\n<p>      &#8211; name: Setup Node.js<br \/>\n        uses: actions\/setup-node@v4<br \/>\n        with:<br \/>\n          node-version: &#8217;18&#8217;<br \/>\n          cache: &#8216;npm&#8217;<\/p>\n<p>      &#8211; name: Install dependencies<br \/>\n        run: npm ci<\/p>\n<p>      &#8211; name: Run unit tests<br \/>\n        run: npm run test:unit<br \/>\n        env:<br \/>\n          DATABASE_URL: postgresql:\/\/postgres:postgres@localhost:5432\/test_db<br \/>\n          REDIS_URL: redis:\/\/localhost:6379<\/p>\n<p>      &#8211; name: Upload coverage reports<br \/>\n        uses: codecov\/codecov-action@v3<br \/>\n        with:<br \/>\n          file: .\/coverage\/lcov.info<\/p>\n<p>  # Build dan Push<br \/>\n  build-and-push:<br \/>\n    needs: [quality-check, security-scan, test]<br \/>\n    runs-on: ubuntu-latest<br \/>\n    if: github.event_name == &#8216;push&#8217;<br \/>\n    outputs:<br \/>\n      image-digest: ${{ steps.build.outputs.digest }}<br \/>\n      image-tag: ${{ steps.meta.outputs.tags }}<br \/>\n    steps:<br \/>\n      &#8211; name: Checkout code<br \/>\n        uses: actions\/checkout@v4<\/p>\n<p>      &#8211; name: Set up Docker Buildx<br \/>\n        uses: docker\/setup-buildx-action@v3<\/p>\n<p>      &#8211; name: Log in to Container Registry<br \/>\n        uses: docker\/login-action@v3<br \/>\n        with:<br \/>\n          registry: ${{ env.REGISTRY }}<br \/>\n          username: ${{ github.actor }}<br \/>\n          password: ${{ secrets.GITHUB_TOKEN }}<\/p>\n<p>      &#8211; name: Extract metadata<br \/>\n        id: meta<br \/>\n        uses: docker\/metadata-action@v5<br \/>\n        with:<br \/>\n          images: ${{ env.REGISTRY }}\/${{ env.IMAGE_NAME }}<br \/>\n          tags: |<br \/>\n            type=ref,event=branch<br \/>\n            type=ref,event=pr<br \/>\n            type=sha,prefix={{branch}}-<br \/>\n            type=raw,value=latest,enable={{is_default_branch}}<\/p>\n<p>      &#8211; name: Build and push Docker image<br \/>\n        id: build<br \/>\n        uses: docker\/build-push-action@v5<br \/>\n        with:<br \/>\n          context: .<br \/>\n          platforms: linux\/amd64,linux\/arm64<br \/>\n          push: true<br \/>\n          tags: ${{ steps.meta.outputs.tags }}<br \/>\n          labels: ${{ steps.meta.outputs.labels }}<br \/>\n          cache-from: type=gha<br \/>\n          cache-to: type=gha,mode=max<\/p>\n<p>  # Deploy to Development<br \/>\n  deploy-dev:<br \/>\n    needs: build-and-push<br \/>\n    runs-on: ubuntu-latest<br \/>\n    if: github.ref == &#8216;refs\/heads\/develop&#8217;<br \/>\n    environment:<br \/>\n      name: development<br \/>\n      url: https:\/\/dev.yourapp.com<br \/>\n    steps:<br \/>\n      &#8211; name: Checkout code<br \/>\n        uses: actions\/checkout@v4<\/p>\n<p>      &#8211; name: Configure kubectl<br \/>\n        uses: azure\/k8s-set-context@v3<br \/>\n        with:<br \/>\n          method: kubeconfig<br \/>\n          kubeconfig: ${{ secrets.KUBE_CONFIG_DEV }}<\/p>\n<p>      &#8211; name: Deploy to development<br \/>\n        run: |<br \/>\n          sed -i &#8216;s|IMAGE_PLACEHOLDER|${{ needs.build-and-push.outputs.image-tag }}|&#8217; k8s\/dev-deployment.yaml<br \/>\n          kubectl apply -f k8s\/dev-deployment.yaml<br \/>\n          kubectl rollout status deployment\/yourapp-dev -n development<\/p>\n<p>      &#8211; name: Run integration tests<br \/>\n        run: |<br \/>\n          npm run test:integration &#8212; &#8211;baseUrl=https:\/\/dev.yourapp.com<\/p>\n<p>  # Deploy to Production<br \/>\n  deploy-prod:<br \/>\n    needs: build-and-push<br \/>\n    runs-on: ubuntu-latest<br \/>\n    if: github.ref == &#8216;refs\/heads\/main&#8217;<br \/>\n    environment:<br \/>\n      name: production<br \/>\n      url: https:\/\/yourapp.com<br \/>\n    steps:<br \/>\n      &#8211; name: Checkout code<br \/>\n        uses: actions\/checkout@v4<\/p>\n<p>      &#8211; name: Configure kubectl<br \/>\n        uses: azure\/k8s-set-context@v3<br \/>\n        with:<br \/>\n          method: kubeconfig<br \/>\n          kubeconfig: ${{ secrets.KUBE_CONFIG_PROD }}<\/p>\n<p>      &#8211; name: Deploy to production<br \/>\n        run: |<br \/>\n          # Canary deployment strategy<br \/>\n          sed -i &#8216;s|IMAGE_PLACEHOLDER|${{ needs.build-and-push.outputs.image-tag }}|&#8217; k8s\/canary-deployment.yaml<br \/>\n          kubectl apply -f k8s\/canary-deployment.yaml<\/p>\n<p>          # Wait for canary to be ready<br \/>\n          kubectl rollout status deployment\/yourapp-canary -n production<\/p>\n<p>          # Run smoke tests<br \/>\n          npm run test:smoke &#8212; &#8211;baseUrl=https:\/\/canary.yourapp.com<\/p>\n<p>          # Promote canary to production<br \/>\n          sed -i &#8216;s|IMAGE_PLACEHOLDER|${{ needs.build-and-push.outputs.image-tag }}|&#8217; k8s\/prod-deployment.yaml<br \/>\n          kubectl apply -f k8s\/prod-deployment.yaml<br \/>\n          kubectl rollout status deployment\/yourapp-prod -n production<\/p>\n<p>      &#8211; name: Notify deployment<br \/>\n        uses: 8398a7\/action-slack@v3<br \/>\n        with:<br \/>\n          status: ${{ job.status }}<br \/>\n          channel: &#8216;#deployments&#8217;<br \/>\n          webhook_url: ${{ secrets.SLACK_WEBHOOK }}<br \/>\n&#8220;`<\/p>\n<p>Kubernetes dan Container Orchestration<\/p>\n<p>1. Multi-Environment Kubernetes Configuration<br \/>\n&#8220;`yaml<br \/>\n# k8s\/namespace.yaml<br \/>\napiVersion: v1<br \/>\nkind: Namespace<br \/>\nmetadata:<br \/>\n  name: development<br \/>\n  labels:<br \/>\n    environment: development<br \/>\n&#8212;<br \/>\napiVersion: v1<br \/>\nkind: Namespace<br \/>\nmetadata:<br \/>\n  name: staging<br \/>\n  labels:<br \/>\n    environment: staging<br \/>\n&#8212;<br \/>\napiVersion: v1<br \/>\nkind: Namespace<br \/>\nmetadata:<br \/>\n  name: production<br \/>\n  labels:<br \/>\n    environment: production<\/p>\n<p>&#8212;<br \/>\n# k8s\/configmap.yaml<br \/>\napiVersion: v1<br \/>\nkind: ConfigMap<br \/>\nmetadata:<br \/>\n  name: yourapp-config<br \/>\n  namespace: development<br \/>\ndata:<br \/>\n  NODE_ENV: &#8220;development&#8221;<br \/>\n  LOG_LEVEL: &#8220;debug&#8221;<br \/>\n  API_BASE_URL: &#8220;https:\/\/dev-api.yourapp.com&#8221;<br \/>\n  REDIS_HOST: &#8220;redis-service&#8221;<br \/>\n  REDIS_PORT: &#8220;6379&#8221;<br \/>\n&#8212;<br \/>\napiVersion: v1<br \/>\nkind: ConfigMap<br \/>\nmetadata:<br \/>\n  name: yourapp-config<br \/>\n  namespace: staging<br \/>\ndata:<br \/>\n  NODE_ENV: &#8220;staging&#8221;<br \/>\n  LOG_LEVEL: &#8220;info&#8221;<br \/>\n  API_BASE_URL: &#8220;https:\/\/staging-api.yourapp.com&#8221;<br \/>\n  REDIS_HOST: &#8220;redis-service&#8221;<br \/>\n  REDIS_PORT: &#8220;6379&#8221;<br \/>\n&#8212;<br \/>\napiVersion: v1<br \/>\nkind: ConfigMap<br \/>\nmetadata:<br \/>\n  name: yourapp-config<br \/>\n  namespace: production<br \/>\ndata:<br \/>\n  NODE_ENV: &#8220;production&#8221;<br \/>\n  LOG_LEVEL: &#8220;warn&#8221;<br \/>\n  API_BASE_URL: &#8220;https:\/\/api.yourapp.com&#8221;<br \/>\n  REDIS_HOST: &#8220;redis-service&#8221;<br \/>\n  REDIS_PORT: &#8220;6379&#8221;<\/p>\n<p>&#8212;<br \/>\n# k8s\/secrets.yaml<br \/>\napiVersion: v1<br \/>\nkind: Secret<br \/>\nmetadata:<br \/>\n  name: yourapp-secrets<br \/>\n  namespace: development<br \/>\ntype: Opaque<br \/>\ndata:<br \/>\n  DATABASE_URL:<br \/>\n  JWT_SECRET:<br \/>\n  REDIS_PASSWORD:<br \/>\n&#8212;<br \/>\napiVersion: v1<br \/>\nkind: Secret<br \/>\nmetadata:<br \/>\n  name: yourapp-secrets<br \/>\n  namespace: production<br \/>\ntype: Opaque<br \/>\ndata:<br \/>\n  DATABASE_URL:<br \/>\n  JWT_SECRET:<br \/>\n  REDIS_PASSWORD: <\/p>\n<p>&#8212;<br \/>\n# k8s\/hpa.yaml &#8211; Horizontal Pod Autoscaler<br \/>\napiVersion: autoscaling\/v2<br \/>\nkind: HorizontalPodAutoscaler<br \/>\nmetadata:<br \/>\n  name: yourapp-hpa<br \/>\n  namespace: production<br \/>\nspec:<br \/>\n  scaleTargetRef:<br \/>\n    apiVersion: apps\/v1<br \/>\n    kind: Deployment<br \/>\n    name: yourapp-prod<br \/>\n  minReplicas: 3<br \/>\n  maxReplicas: 50<br \/>\n  metrics:<br \/>\n  &#8211; type: Resource<br \/>\n    resource:<br \/>\n      name: cpu<br \/>\n      target:<br \/>\n        type: Utilization<br \/>\n        averageUtilization: 70<br \/>\n  &#8211; type: Resource<br \/>\n    resource:<br \/>\n      name: memory<br \/>\n      target:<br \/>\n        type: Utilization<br \/>\n        averageUtilization: 80<br \/>\n  &#8211; type: Pods<br \/>\n    pods:<br \/>\n      metric:<br \/>\n        name: http_requests_per_second<br \/>\n      target:<br \/>\n        type: AverageValue<br \/>\n        averageValue: &#8220;100&#8221;<br \/>\n  behavior:<br \/>\n    scaleDown:<br \/>\n      stabilizationWindowSeconds: 300<br \/>\n      policies:<br \/>\n      &#8211; type: Percent<br \/>\n        value: 10<br \/>\n        periodSeconds: 60<br \/>\n    scaleUp:<br \/>\n      stabilizationWindowSeconds: 60<br \/>\n      policies:<br \/>\n      &#8211; type: Percent<br \/>\n        value: 50<br \/>\n        periodSeconds: 60<br \/>\n      &#8211; type: Pods<br \/>\n        value: 5<br \/>\n        periodSeconds: 60<br \/>\n      selectPolicy: Max<\/p>\n<p>&#8212;<br \/>\n# k8s\/network-policy.yaml<br \/>\napiVersion: networking.k8s.io\/v1<br \/>\nkind: NetworkPolicy<br \/>\nmetadata:<br \/>\n  name: yourapp-network-policy<br \/>\n  namespace: production<br \/>\nspec:<br \/>\n  podSelector:<br \/>\n    matchLabels:<br \/>\n      app: yourapp<br \/>\n  policyTypes:<br \/>\n  &#8211; Ingress<br \/>\n  &#8211; Egress<br \/>\n  ingress:<br \/>\n  &#8211; from:<br \/>\n    &#8211; namespaceSelector:<br \/>\n        matchLabels:<br \/>\n          name: ingress-nginx<br \/>\n    ports:<br \/>\n    &#8211; protocol: TCP<br \/>\n      port: 3000<br \/>\n  egress:<br \/>\n  &#8211; to:<br \/>\n    &#8211; namespaceSelector:<br \/>\n        matchLabels:<br \/>\n          name: database<br \/>\n    ports:<br \/>\n    &#8211; protocol: TCP<br \/>\n      port: 5432<br \/>\n  &#8211; to:<br \/>\n    &#8211; namespaceSelector:<br \/>\n        matchLabels:<br \/>\n          name: cache<br \/>\n    ports:<br \/>\n    &#8211; protocol: TCP<br \/>\n      port: 6379<br \/>\n  &#8211; to: []<br \/>\n    ports:<br \/>\n    &#8211; protocol: TCP<br \/>\n      port: 53<br \/>\n    &#8211; protocol: UDP<br \/>\n      port: 53<\/p>\n<p>&#8212;<br \/>\n# k8s\/pod-disruption-budget.yaml<br \/>\napiVersion: policy\/v1<br \/>\nkind: PodDisruptionBudget<br \/>\nmetadata:<br \/>\n  name: yourapp-pdb<br \/>\n  namespace: production<br \/>\nspec:<br \/>\n  minAvailable: 2<br \/>\n  selector:<br \/>\n    matchLabels:<br \/>\n      app: yourapp<br \/>\n      environment: production<br \/>\n&#8220;`<\/p>\n<p>2. Helm Charts untuk Template Management<br \/>\n&#8220;`yaml<br \/>\n# helm\/yourapp\/Chart.yaml<br \/>\napiVersion: v2<br \/>\nname: yourapp<br \/>\ndescription: A Helm chart for YourApp<br \/>\ntype: application<br \/>\nversion: 0.1.0<br \/>\nappVersion: &#8220;1.0.0&#8221;<br \/>\nkeywords:<br \/>\n  &#8211; web<br \/>\n  &#8211; application<br \/>\n  &#8211; nodejs<br \/>\nhome: https:\/\/github.com\/yourorg\/yourapp<br \/>\nsources:<br \/>\n  &#8211; https:\/\/github.com\/yourorg\/yourapp<br \/>\nmaintainers:<br \/>\n  &#8211; name: YourTeam<br \/>\n    email: team@yourapp.com<\/p>\n<p>&#8212;<br \/>\n# helm\/yourapp\/values.yaml<br \/>\n# Default values for yourapp.<br \/>\nreplicaCount: 1<\/p>\n<p>image:<br \/>\n  repository: yourapp<br \/>\n  pullPolicy: IfNotPresent<br \/>\n  tag: &#8220;&#8221;<\/p>\n<p>imagePullSecrets: []<br \/>\nnameOverride: &#8220;&#8221;<br \/>\nfullnameOverride: &#8220;&#8221;<\/p>\n<p>serviceAccount:<br \/>\n  create: true<br \/>\n  annotations: {}<br \/>\n  name: &#8220;&#8221;<\/p>\n<p>podAnnotations: {}<\/p>\n<p>podSecurityContext:<br \/>\n  fsGroup: 1001<\/p>\n<p>securityContext:<br \/>\n  allowPrivilegeEscalation: false<br \/>\n  runAsNonRoot: true<br \/>\n  runAsUser: 1001<br \/>\n  readOnlyRootFilesystem: true<br \/>\n  capabilities:<br \/>\n    drop:<br \/>\n    &#8211; ALL<\/p>\n<p>service:<br \/>\n  type: ClusterIP<br \/>\n  port: 80<br \/>\n  targetPort: 3000<\/p>\n<p>ingress:<br \/>\n  enabled: false<br \/>\n  className: &#8220;&#8221;<br \/>\n  annotations: {}<br \/>\n    # kubernetes.io\/ingress.class: nginx<br \/>\n    # cert-manager.io\/cluster-issuer: letsencrypt-prod<br \/>\n  hosts:<br \/>\n    &#8211; host: yourapp.local<br \/>\n      paths:<br \/>\n        &#8211; path: \/<br \/>\n          pathType: Prefix<br \/>\n  tls: []<br \/>\n    # &#8211; secretName: yourapp-tls<br \/>\n    #   hosts:<br \/>\n    #     &#8211; yourapp.local<\/p>\n<p>resources:<br \/>\n  limits:<br \/>\n    cpu: 500m<br \/>\n    memory: 512Mi<br \/>\n  requests:<br \/>\n    cpu: 250m<br \/>\n    memory: 256Mi<\/p>\n<p>autoscaling:<br \/>\n  enabled: false<br \/>\n  minReplicas: 1<br \/>\n  maxReplicas: 100<br \/>\n  targetCPUUtilizationPercentage: 80<br \/>\n  # targetMemoryUtilizationPercentage: 80<\/p>\n<p>nodeSelector: {}<\/p>\n<p>tolerations: []<\/p>\n<p>affinity: {}<\/p>\n<p># Custom configurations<br \/>\nconfig:<br \/>\n  nodeEnv: &#8220;production&#8221;<br \/>\n  logLevel: &#8220;info&#8221;<br \/>\n  database:<br \/>\n    host: &#8220;&#8221;<br \/>\n    port: 5432<br \/>\n    name: yourapp<br \/>\n    ssl: true<br \/>\n  redis:<br \/>\n    host: &#8220;&#8221;<br \/>\n    port: 6379<br \/>\n    database: 0<\/p>\n<p>secrets:<br \/>\n  databaseUrl: &#8220;&#8221;<br \/>\n  jwtSecret: &#8220;&#8221;<br \/>\n  redisPassword: &#8220;&#8221;<\/p>\n<p># Health check configurations<br \/>\nlivenessProbe:<br \/>\n  httpGet:<br \/>\n    path: \/health<br \/>\n    port: http<br \/>\n  initialDelaySeconds: 30<br \/>\n  periodSeconds: 10<br \/>\n  timeoutSeconds: 5<br \/>\n  failureThreshold: 3<\/p>\n<p>readinessProbe:<br \/>\n  httpGet:<br \/>\n    path: \/ready<br \/>\n    port: http<br \/>\n  initialDelaySeconds: 5<br \/>\n  periodSeconds: 5<br \/>\n  timeoutSeconds: 3<br \/>\n  failureThreshold: 3<\/p>\n<p># Monitoring and observability<br \/>\nmonitoring:<br \/>\n  enabled: false<br \/>\n  serviceMonitor:<br \/>\n    enabled: false<br \/>\n    namespace: monitoring<br \/>\n    labels: {}<br \/>\n    annotations: {}<br \/>\n    interval: 30s<br \/>\n    scrapeTimeout: 10s<\/p>\n<p># Logging configuration<br \/>\nlogging:<br \/>\n  enabled: true<br \/>\n  fluentd:<br \/>\n    enabled: false<br \/>\n    config: {}<\/p>\n<p># Backup configuration<br \/>\nbackup:<br \/>\n  enabled: false<br \/>\n  schedule: &#8220;0 2 * * *&#8221;<br \/>\n  retention: &#8220;7d&#8221;<\/p>\n<p>&#8212;<br \/>\n# helm\/yourapp\/templates\/deployment.yaml<br \/>\napiVersion: apps\/v1<br \/>\nkind: Deployment<br \/>\nmetadata:<br \/>\n  name: {{ include &#8220;yourapp.fullname&#8221; . }}<br \/>\n  labels:<br \/>\n    {{- include &#8220;yourapp.labels&#8221; . | nindent 4 }}<br \/>\nspec:<br \/>\n  {{- if not .Values.autoscaling.enabled }}<br \/>\n  replicas: {{ .Values.replicaCount }}<br \/>\n  {{- end }}<br \/>\n  selector:<br \/>\n    matchLabels:<br \/>\n      {{- include &#8220;yourapp.selectorLabels&#8221; . | nindent 6 }}<br \/>\n  template:<br \/>\n    metadata:<br \/>\n      annotations:<br \/>\n        checksum\/config: {{ include (print $.Template.BasePath &#8220;\/configmap.yaml&#8221;) . | sha256sum }}<br \/>\n        checksum\/secret: {{ include (print $.Template.BasePath &#8220;\/secret.yaml&#8221;) . | sha256sum }}<br \/>\n        {{- with .Values.podAnnotations }}<br \/>\n        {{- toYaml . | nindent 8 }}<br \/>\n        {{- end }}<br \/>\n      labels:<br \/>\n        {{- include &#8220;yourapp.selectorLabels&#8221; . | nindent 8 }}<br \/>\n    spec:<br \/>\n      {{- with .Values.imagePullSecrets }}<br \/>\n      imagePullSecrets:<br \/>\n        {{- toYaml . | nindent 8 }}<br \/>\n      {{- end }}<br \/>\n      serviceAccountName: {{ include &#8220;yourapp.serviceAccountName&#8221; . }}<br \/>\n      securityContext:<br \/>\n        {{- toYaml .Values.podSecurityContext | nindent 8 }}<br \/>\n      containers:<br \/>\n        &#8211; name: {{ .Chart.Name }}<br \/>\n          securityContext:<br \/>\n            {{- toYaml .Values.securityContext | nindent 12 }}<br \/>\n          image: &#8220;{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}&#8221;<br \/>\n          imagePullPolicy: {{ .Values.image.pullPolicy }}<br \/>\n          ports:<br \/>\n            &#8211; name: http<br \/>\n              containerPort: 3000<br \/>\n              protocol: TCP<br \/>\n          livenessProbe:<br \/>\n            {{- toYaml .Values.livenessProbe | nindent 12 }}<br \/>\n          readinessProbe:<br \/>\n            {{- toYaml .Values.readinessProbe | nindent 12 }}<br \/>\n          resources:<br \/>\n            {{- toYaml .Values.resources | nindent 12 }}<br \/>\n          env:<br \/>\n            &#8211; name: NODE_ENV<br \/>\n              value: {{ .Values.config.nodeEnv }}<br \/>\n            &#8211; name: LOG_LEVEL<br \/>\n              value: {{ .Values.config.logLevel }}<br \/>\n            &#8211; name: DATABASE_URL<br \/>\n              valueFrom:<br \/>\n                secretKeyRef:<br \/>\n                  name: {{ include &#8220;yourapp.fullname&#8221; . }}<br \/>\n                  key: database-url<br \/>\n            &#8211; name: JWT_SECRET<br \/>\n              valueFrom:<br \/>\n                secretKeyRef:<br \/>\n                  name: {{ include &#8220;yourapp.fullname&#8221; . }}<br \/>\n                  key: jwt-secret<br \/>\n            &#8211; name: REDIS_HOST<br \/>\n              value: {{ .Values.config.redis.host }}<br \/>\n            &#8211; name: REDIS_PORT<br \/>\n              value: {{ .Values.config.redis.port | quote }}<br \/>\n            &#8211; name: REDIS_PASSWORD<br \/>\n              valueFrom:<br \/>\n                secretKeyRef:<br \/>\n                  name: {{ include &#8220;yourapp.fullname&#8221; . }}<br \/>\n                  key: redis-password<br \/>\n          volumeMounts:<br \/>\n            &#8211; name: tmp<br \/>\n              mountPath: \/tmp<br \/>\n      volumes:<br \/>\n        &#8211; name: tmp<br \/>\n          emptyDir: {}<br \/>\n      {{- with .Values.nodeSelector }}<br \/>\n      nodeSelector:<br \/>\n        {{- toYaml . | nindent 8 }}<br \/>\n      {{- end }}<br \/>\n      {{- with .Values.affinity }}<br \/>\n      affinity:<br \/>\n        {{- toYaml . | nindent 8 }}<br \/>\n      {{- end }}<br \/>\n      {{- with .Values.tolerations }}<br \/>\n      tolerations:<br \/>\n        {{- toYaml . | nindent 8 }}<br \/>\n      {{- end }}<br \/>\n&#8220;`<\/p>\n<p>Infrastructure as Code (IaC) dengan Terraform<\/p>\n<p>1. Multi-Cloud Infrastructure Setup<br \/>\n&#8220;`hcl<br \/>\n# terraform\/main.tf<br \/>\nterraform {<br \/>\n  required_version = &#8220;&gt;= 1.0&#8221;<br \/>\n  required_providers {<br \/>\n    aws = {<br \/>\n      source  = &#8220;hashicorp\/aws&#8221;<br \/>\n      version = &#8220;~&gt; 5.0&#8221;<br \/>\n    }<br \/>\n    kubernetes = {<br \/>\n      source  = &#8220;hashicorp\/kubernetes&#8221;<br \/>\n      version = &#8220;~&gt; 2.20&#8221;<br \/>\n    }<br \/>\n    helm = {<br \/>\n      source  = &#8220;hashicorp\/helm&#8221;<br \/>\n      version = &#8220;~&gt; 2.10&#8221;<br \/>\n    }<br \/>\n    random = {<br \/>\n      source  = &#8220;hashicorp\/random&#8221;<br \/>\n      version = &#8220;~&gt; 3.5&#8221;<br \/>\n    }<br \/>\n  }<\/p>\n<p>  backend &#8220;s3&#8221; {<br \/>\n    bucket         = &#8220;yourapp-terraform-state&#8221;<br \/>\n    key            = &#8220;production\/terraform.tfstate&#8221;<br \/>\n    region         = &#8220;ap-southeast-1&#8221;<br \/>\n    encrypt        = true<br \/>\n    dynamodb_table = &#8220;terraform-locks&#8221;<br \/>\n  }<br \/>\n}<\/p>\n<p># terraform\/provider.tf<br \/>\nprovider &#8220;aws&#8221; {<br \/>\n  region = var.aws_region<\/p>\n<p>  default_tags {<br \/>\n    tags = {<br \/>\n      Environment = var.environment<br \/>\n      Project     = &#8220;yourapp&#8221;<br \/>\n      ManagedBy   = &#8220;terraform&#8221;<br \/>\n    }<br \/>\n  }<br \/>\n}<\/p>\n<p>provider &#8220;kubernetes&#8221; {<br \/>\n  host                   = module.eks.cluster_endpoint<br \/>\n  cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)<br \/>\n  exec {<br \/>\n    api_version = &#8220;client.authentication.k8s.io\/v1beta1&#8221;<br \/>\n    command     = &#8220;aws&#8221;<br \/>\n    args        = [&#8220;eks&#8221;, &#8220;get-token&#8221;, &#8220;&#8211;cluster-name&#8221;, module.eks.cluster_name]<br \/>\n  }<br \/>\n}<\/p>\n<p>provider &#8220;helm&#8221; {<br \/>\n  kubernetes {<br \/>\n    host                   = module.eks.cluster_endpoint<br \/>\n    cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)<br \/>\n    exec {<br \/>\n      api_version = &#8220;client.authentication.k8s.io\/v1beta1&#8221;<br \/>\n      command     = &#8220;aws&#8221;<br \/>\n      args        = [&#8220;eks&#8221;, &#8220;get-token&#8221;, &#8220;&#8211;cluster-name&#8221;, module.eks.cluster_name]<br \/>\n    }<br \/>\n  }<br \/>\n}<\/p>\n<p># terraform\/variables.tf<br \/>\nvariable &#8220;environment&#8221; {<br \/>\n  description = &#8220;Environment name&#8221;<br \/>\n  type        = string<br \/>\n  default     = &#8220;production&#8221;<br \/>\n}<\/p>\n<p>variable &#8220;aws_region&#8221; {<br \/>\n  description = &#8220;AWS region&#8221;<br \/>\n  type        = string<br \/>\n  default     = &#8220;ap-southeast-1&#8221;<br \/>\n}<\/p>\n<p>variable &#8220;project_name&#8221; {<br \/>\n  description = &#8220;Project name&#8221;<br \/>\n  type        = string<br \/>\n  default     = &#8220;yourapp&#8221;<br \/>\n}<\/p>\n<p>variable &#8220;domain_name&#8221; {<br \/>\n  description = &#8220;Root domain name&#8221;<br \/>\n  type        = string<br \/>\n  default     = &#8220;yourapp.com&#8221;<br \/>\n}<\/p>\n<p># terraform\/eks.tf<br \/>\nmodule &#8220;eks&#8221; {<br \/>\n  source  = &#8220;terraform-aws-modules\/eks\/aws&#8221;<br \/>\n  version = &#8220;~&gt; 19.15&#8221;<\/p>\n<p>  cluster_name    = &#8220;${var.project_name}-${var.environment}&#8221;<br \/>\n  cluster_version = &#8220;1.28&#8221;<\/p>\n<p>  vpc_id          = module.vpc.vpc_id<br \/>\n  subnet_ids      = module.vpc.private_subnets<\/p>\n<p>  cluster_endpoint_private_access = true<br \/>\n  cluster_endpoint_public_access  = true<\/p>\n<p>  cluster_addons = {<br \/>\n    coredns = {<br \/>\n      most_recent = true<br \/>\n    }<br \/>\n    kube-proxy = {<br \/>\n      most_recent = true<br \/>\n    }<br \/>\n    vpc-cni = {<br \/>\n      most_recent = true<br \/>\n    }<br \/>\n    aws-ebs-csi-driver = {<br \/>\n      most_recent = true<br \/>\n    }<br \/>\n  }<\/p>\n<p>  cluster_security_group_id = module.eks.cluster_security_group_id<br \/>\n  node_security_group_id    = module.eks.node_security_group_id<\/p>\n<p>  self_managed_node_groups = {<br \/>\n    app_nodes = {<br \/>\n      instance_type = &#8220;m5.large&#8221;<br \/>\n      min_size     = 3<br \/>\n      max_size     = 10<br \/>\n      desired_size = 3<\/p>\n<p>      k8s_labels = {<br \/>\n        Environment = var.environment<br \/>\n        Application = var.project_name<br \/>\n      }<\/p>\n<p>      additional_tags = {<br \/>\n        Name        = &#8220;${var.project_name}-app-nodes&#8221;<br \/>\n        Environment = var.environment<br \/>\n      }<br \/>\n    }<br \/>\n  }<\/p>\n<p>  manage_aws_auth_configmap = true<br \/>\n  aws_auth_roles = [<br \/>\n    {<br \/>\n      rolearn  = &#8220;arn:aws:iam::${data.aws_caller_identity.current.account_id}:role\/yourapp-admin-role&#8221;<br \/>\n      username = &#8220;yourapp-admin&#8221;<br \/>\n      groups   = [&#8220;system:masters&#8221;]<br \/>\n    }<br \/>\n  ]<br \/>\n}<\/p>\n<p># terraform\/vpc.tf<br \/>\nmodule &#8220;vpc&#8221; {<br \/>\n  source  = &#8220;terraform-aws-modules\/vpc\/aws&#8221;<br \/>\n  version = &#8220;~&gt; 5.0&#8221;<\/p>\n<p>  name = &#8220;${var.project_name}-${var.environment}-vpc&#8221;<br \/>\n  cidr = &#8220;10.0.0.0\/16&#8221;<\/p>\n<p>  azs             = [&#8220;ap-southeast-1a&#8221;, &#8220;ap-southeast-1b&#8221;, &#8220;ap-southeast-1c&#8221;]<br \/>\n  private_subnets = [&#8220;10.0.1.0\/24&#8221;, &#8220;10.0.2.0\/24&#8221;, &#8220;10.0.3.0\/24&#8221;]<br \/>\n  public_subnets  = [&#8220;10.0.101.0\/24&#8221;, &#8220;10.0.102.0\/24&#8221;, &#8220;10.0.103.0\/24&#8221;]<\/p>\n<p>  enable_nat_gateway = true<br \/>\n  single_nat_gateway = true<\/p>\n<p>  tags = {<br \/>\n    Name        = &#8220;${var.project_name}-${var.environment}-vpc&#8221;<br \/>\n    Environment = var.environment<br \/>\n  }<br \/>\n}<\/p>\n<p># terraform\/rds.tf<br \/>\nmodule &#8220;rds&#8221; {<br \/>\n  source  = &#8220;terraform-aws-modules\/rds\/aws&#8221;<br \/>\n  version = &#8220;~&gt; 6.0&#8221;<\/p>\n<p>  identifier = &#8220;${var.project_name}-${var.environment}-db&#8221;<\/p>\n<p>  engine         = &#8220;postgres&#8221;<br \/>\n  engine_version = &#8220;15.3&#8221;<br \/>\n  instance_class = &#8220;db.t3.medium&#8221;<\/p>\n<p>  allocated_storage     = 100<br \/>\n  max_allocated_storage = 1000<br \/>\n  storage_encrypted     = true<br \/>\n  storage_type          = &#8220;gp2&#8221;<\/p>\n<p>  db_name  = &#8220;yourapp&#8221;<br \/>\n  username = &#8220;yourapp_user&#8221;<br \/>\n  port     = 5432<\/p>\n<p>  vpc_security_group_ids = [module.eks.node_security_group_id]<\/p>\n<p>  create_db_subnet_group = true<br \/>\n  subnet_ids             = module.vpc.private_subnets<\/p>\n<p>  maintenance_window = &#8220;Mon:00:00-Mon:03:00&#8221;<br \/>\n  backup_window      = &#8220;03:00-06:00&#8221;<br \/>\n  backup_retention_period = 7<\/p>\n<p>  skip_final_snapshot = false<br \/>\n  final_snapshot_identifier = &#8220;${var.project_name}-${var.environment}-final-snapshot&#8221;<\/p>\n<p>  tags = {<br \/>\n    Name        = &#8220;${var.project_name}-${var.environment}-rds&#8221;<br \/>\n    Environment = var.environment<br \/>\n  }<br \/>\n}<\/p>\n<p># terraform\/redis.tf<br \/>\nmodule &#8220;elasticache&#8221; {<br \/>\n  source  = &#8220;terraform-aws-modules\/elasticache\/aws&#8221;<br \/>\n  version = &#8220;~&gt; 1.0&#8221;<\/p>\n<p>  create_replication_group = true<br \/>\n  replication_group_id     = &#8220;${var.project_name}-${var.environment}-redis&#8221;<br \/>\n  replication_group_description = &#8220;Redis cluster for ${var.project_name}&#8221;<\/p>\n<p>  node_type = &#8220;cache.t3.micro&#8221;<\/p>\n<p>  port = 6379<br \/>\n  parameter_group_name = &#8220;default.redis7&#8221;<\/p>\n<p>  subnet_ids  = module.vpc.private_subnets<br \/>\n  vpc_id      = module.vpc.vpc_id<\/p>\n<p>  at_rest_encryption_enabled = true<br \/>\n  transit_encryption_enabled = true<br \/>\n  auth_token                   = random_password.redis_auth_token.result<\/p>\n<p>  automatic_failover_enabled = true<br \/>\n  multi_az_enabled          = true<br \/>\n  num_cache_clusters        = 2<\/p>\n<p>  tags = {<br \/>\n    Name        = &#8220;${var.project_name}-${var.environment}-redis&#8221;<br \/>\n    Environment = var.environment<br \/>\n  }<br \/>\n}<\/p>\n<p># terraform\/outputs.tf<br \/>\noutput &#8220;cluster_endpoint&#8221; {<br \/>\n  description = &#8220;EKS cluster endpoint&#8221;<br \/>\n  value       = module.eks.cluster_endpoint<br \/>\n}<\/p>\n<p>output &#8220;cluster_name&#8221; {<br \/>\n  description = &#8220;EKS cluster name&#8221;<br \/>\n  value       = module.eks.cluster_name<br \/>\n}<\/p>\n<p>output &#8220;database_endpoint&#8221; {<br \/>\n  description = &#8220;RDS endpoint&#8221;<br \/>\n  value       = module.rds.db_instance_endpoint<br \/>\n}<\/p>\n<p>output &#8220;redis_endpoint&#8221; {<br \/>\n  description = &#8220;Redis endpoint&#8221;<br \/>\n  value       = module.elasticache.replication_group_primary_endpoint_address<br \/>\n}<\/p>\n<p>output &#8220;vpc_id&#8221; {<br \/>\n  description = &#8220;VPC ID&#8221;<br \/>\n  value       = module.vpc.vpc_id<br \/>\n}<\/p>\n<p>output &#8220;private_subnets&#8221; {<br \/>\n  description = &#8220;Private subnet IDs&#8221;<br \/>\n  value       = module.vpc.private_subnets<br \/>\n}<br \/>\n&#8220;`<\/p>\n<p>Monitoring dan Observability<\/p>\n<p>1. Prometheus dan Grafana Stack<br \/>\n&#8220;`yaml<br \/>\n# monitoring\/prometheus-operator.yaml<br \/>\napiVersion: source.toolkit.fluxcd.io\/v1beta2<br \/>\nkind: HelmRepository<br \/>\nmetadata:<br \/>\n  name: prometheus-community<br \/>\n  namespace: monitoring<br \/>\nspec:<br \/>\n  interval: 1h<br \/>\n  url: https:\/\/prometheus-community.github.io\/helm-charts<\/p>\n<p>&#8212;<br \/>\napiVersion: helm.toolkit.fluxcd.io\/v2beta1<br \/>\nkind: HelmRelease<br \/>\nmetadata:<br \/>\n  name: kube-prometheus-stack<br \/>\n  namespace: monitoring<br \/>\nspec:<br \/>\n  interval: 5m<br \/>\n  chart:<br \/>\n    spec:<br \/>\n      chart: kube-prometheus-stack<br \/>\n      version: &#8220;48.0.0&#8221;<br \/>\n      sourceRef:<br \/>\n        kind: HelmRepository<br \/>\n        name: prometheus-community<br \/>\n        namespace: monitoring<br \/>\n  releaseName: prometheus<br \/>\n  values:<br \/>\n    prometheus:<br \/>\n      prometheusSpec:<br \/>\n        storageSpec:<br \/>\n          volumeClaimTemplate:<br \/>\n            spec:<br \/>\n              storageClassName: gp3<br \/>\n              accessModes: [&#8220;ReadWriteOnce&#8221;]<br \/>\n              resources:<br \/>\n                requests:<br \/>\n                  storage: 100Gi<br \/>\n        resources:<br \/>\n          requests:<br \/>\n            cpu: 1000m<br \/>\n            memory: 4Gi<br \/>\n          limits:<br \/>\n            cpu: 2000m<br \/>\n            memory: 8Gi<\/p>\n<p>    grafana:<br \/>\n      adminPassword: &#8220;secure-password&#8221;<br \/>\n      persistence:<br \/>\n        enabled: true<br \/>\n        storageClassName: gp3<br \/>\n        size: 20Gi<br \/>\n      resources:<br \/>\n        requests:<br \/>\n          cpu: 500m<br \/>\n          memory: 2Gi<br \/>\n        limits:<br \/>\n          cpu: 1000m<br \/>\n          memory: 4Gi<br \/>\n      dashboardProviders:<br \/>\n        dashboardproviders.yaml:<br \/>\n          apiVersion: 1<br \/>\n          providers:<br \/>\n          &#8211; name: &#8216;default&#8217;<br \/>\n              orgId: 1<br \/>\n              folder: &#8221;<br \/>\n              type: file<br \/>\n              disableDeletion: false<br \/>\n              editable: true<br \/>\n              options:<br \/>\n                path: \/var\/lib\/grafana\/dashboards\/default<\/p>\n<p>    alertmanager:<br \/>\n      alertmanagerSpec:<br \/>\n        storage:<br \/>\n          volumeClaimTemplate:<br \/>\n            spec:<br \/>\n              storageClassName: gp3<br \/>\n              accessModes: [&#8220;ReadWriteOnce&#8221;]<br \/>\n              resources:<br \/>\n                requests:<br \/>\n                  storage: 20Gi<\/p>\n<p>    defaultRules:<br \/>\n      rules:<br \/>\n        etcd: true<br \/>\n        k8s: true<br \/>\n        kubeScheduler: true<br \/>\n        kubeControllerManager: true<br \/>\n        node: true<br \/>\n        prometheusOperator: true<br \/>\n        prometheus: true<br \/>\n        general: true<\/p>\n<p>    additionalPrometheusRulesMap:<br \/>\n      &#8211; name: yourapp-rules<br \/>\n        rules:<br \/>\n          &#8211; alert: YourAppHighErrorRate<br \/>\n            expr: rate(http_requests_total{status=~&#8221;5..&#8221;}[5m]) \/ rate(http_requests_total[5m]) &gt; 0.05<br \/>\n            for: 10m<br \/>\n            labels:<br \/>\n              severity: critical<br \/>\n            annotations:<br \/>\n              summary: &#8220;High error rate detected&#8221;<br \/>\n              description: &#8220;Error rate is {{ $value | humanizePercentage }} for {{ $labels.job }}&#8221;<\/p>\n<p>          &#8211; alert: YourAppHighResponseTime<br \/>\n            expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) &gt; 1<br \/>\n            for: 10m<br \/>\n            labels:<br \/>\n              severity: warning<br \/>\n            annotations:<br \/>\n              summary: &#8220;High response time detected&#8221;<br \/>\n              description: &#8220;95th percentile response time is {{ $value }}s for {{ $labels.job }}&#8221;<\/p>\n<p>          &#8211; alert: YourAppPodRestart<br \/>\n            expr: rate(kube_pod_container_status_restarts_total[15m]) &gt; 0<br \/>\n            for: 5m<br \/>\n            labels:<br \/>\n              severity: warning<br \/>\n            annotations:<br \/>\n              summary: &#8220;Pod restarting frequently&#8221;<br \/>\n              description: &#8220;Pod {{ $labels.pod }} is restarting frequently&#8221;<\/p>\n<p>&#8212;<br \/>\n# monitoring\/servicemonitor.yaml<br \/>\napiVersion: monitoring.coreos.com\/v1<br \/>\nkind: ServiceMonitor<br \/>\nmetadata:<br \/>\n  name: yourapp-metrics<br \/>\n  namespace: production<br \/>\n  labels:<br \/>\n    app: yourapp<br \/>\nspec:<br \/>\n  selector:<br \/>\n    matchLabels:<br \/>\n      app: yourapp<br \/>\n  endpoints:<br \/>\n    &#8211; port: metrics<br \/>\n      path: \/metrics<br \/>\n      interval: 30s<br \/>\n      scrapeTimeout: 10s<\/p>\n<p>&#8212;<br \/>\n# monitoring\/grafana-dashboards.yaml<br \/>\napiVersion: v1<br \/>\nkind: ConfigMap<br \/>\nmetadata:<br \/>\n  name: yourapp-dashboards<br \/>\n  namespace: monitoring<br \/>\n  labels:<br \/>\n    grafana_dashboard: &#8220;1&#8221;<br \/>\ndata:<br \/>\n  yourapp-overview.json: |<br \/>\n    {<br \/>\n      &#8220;dashboard&#8221;: {<br \/>\n        &#8220;id&#8221;: null,<br \/>\n        &#8220;title&#8221;: &#8220;YourApp Overview&#8221;,<br \/>\n        &#8220;tags&#8221;: [&#8220;yourapp&#8221;, &#8220;overview&#8221;],<br \/>\n        &#8220;timezone&#8221;: &#8220;browser&#8221;,<br \/>\n        &#8220;panels&#8221;: [<br \/>\n          {<br \/>\n            &#8220;title&#8221;: &#8220;Request Rate&#8221;,<br \/>\n            &#8220;type&#8221;: &#8220;graph&#8221;,<br \/>\n            &#8220;targets&#8221;: [<br \/>\n              {<br \/>\n                &#8220;expr&#8221;: &#8220;rate(http_requests_total[5m])&#8221;,<br \/>\n                &#8220;legendFormat&#8221;: &#8220;{{ method }} {{ status }}&#8221;<br \/>\n              }<br \/>\n            ],<br \/>\n            &#8220;gridPos&#8221;: {&#8220;h&#8221;: 8, &#8220;w&#8221;: 12, &#8220;x&#8221;: 0, &#8220;y&#8221;: 0}<br \/>\n          },<br \/>\n          {<br \/>\n            &#8220;title&#8221;: &#8220;Response Time&#8221;,<br \/>\n            &#8220;type&#8221;: &#8220;graph&#8221;,<br \/>\n            &#8220;targets&#8221;: [<br \/>\n              {<br \/>\n                &#8220;expr&#8221;: &#8220;histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))&#8221;,<br \/>\n                &#8220;legendFormat&#8221;: &#8220;95th percentile&#8221;<br \/>\n              },<br \/>\n              {<br \/>\n                &#8220;expr&#8221;: &#8220;histogram_quantile(0.50, rate(http_request_duration_seconds_bucket[5m]))&#8221;,<br \/>\n                &#8220;legendFormat&#8221;: &#8220;50th percentile&#8221;<br \/>\n              }<br \/>\n            ],<br \/>\n            &#8220;gridPos&#8221;: {&#8220;h&#8221;: 8, &#8220;w&#8221;: 12, &#8220;x&#8221;: 12, &#8220;y&#8221;: 0}<br \/>\n          }<br \/>\n        ],<br \/>\n        &#8220;time&#8221;: {&#8220;from&#8221;: &#8220;now-1h&#8221;, &#8220;to&#8221;: &#8220;now&#8221;},<br \/>\n        &#8220;refresh&#8221;: &#8220;30s&#8221;<br \/>\n      }<br \/>\n    }<br \/>\n&#8220;`<\/p>\n<p>Kesimpulan<\/p>\n<p>DevOps dan Cloud Native deployment telah menjadi essential untuk modern software development. Dengan proper implementation dari CI\/CD pipelines, container orchestration, infrastructure as code, dan comprehensive monitoring, organizations dapat achieve unprecedented deployment velocity dan reliability.<\/p>\n<p>Key success factors:<br \/>\n\u2022 Cultural Transformation: Adopt DevOps culture sebelum tools<br \/>\n\u2022 Automation: Automate everything yang bisa di-automate<br \/>\n\u2022 Measurement: Measure everything untuk continuous improvement<br \/>\n\u2022 Security Integrate: Shift security left (DevSecOps)<br \/>\n\u2022 Observability: Implement comprehensive monitoring dan logging<\/p>\n<p>Investasi dalam DevOps capabilities akan memberikan ROI yang signifikan melalui:<br \/>\n&#8211; Faster time to market<br \/>\n&#8211; Higher deployment success rates<br \/>\n&#8211; Reduced failure recovery time<br \/>\n&#8211; Improved team productivity<br \/>\n&#8211; Better customer satisfaction<\/p>\n<p>Start small, iterate continuously, dan focus pada delivering value ke customers. DevOps journey adalah marathon, bukan sprint.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Di era digital transformation, DevOps dan Cloud Native practices telah menjadi fundamental untuk delivering software dengan cepat, reliable, dan scalable. Organisasi yang mengadopsi Cloud Native dapat mencapai deployment frequency hingga 100x lebih cepat dengan failure rate 60x lebih rendah. Artikel ini akan membahas secara mendalam tentang DevOps best practices dan Cloud Native deployment strategies di [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":4420,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure - Demo Website<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure - Demo Website\" \/>\n<meta property=\"og:description\" content=\"Di era digital transformation, DevOps dan Cloud Native practices telah menjadi fundamental untuk delivering software dengan cepat, reliable, dan scalable. Organisasi yang mengadopsi Cloud Native dapat mencapai deployment frequency hingga 100x lebih cepat dengan failure rate 60x lebih rendah. Artikel ini akan membahas secara mendalam tentang DevOps best practices dan Cloud Native deployment strategies di [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/\" \/>\n<meta property=\"og:site_name\" content=\"Demo Website\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-11T01:22:42+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.jagowebdesign.com\/website\/wp-content\/uploads\/2025\/11\/website-9.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"redakturjagowebdesign\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"redakturjagowebdesign\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/\",\"url\":\"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/\",\"name\":\"DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure - Demo Website\",\"isPartOf\":{\"@id\":\"https:\/\/www.jagowebdesign.com\/website\/#website\"},\"datePublished\":\"2025-11-11T01:22:42+00:00\",\"dateModified\":\"2025-11-11T01:22:42+00:00\",\"author\":{\"@id\":\"https:\/\/www.jagowebdesign.com\/website\/#\/schema\/person\/9c4f0b34abafcb25285cfc51e9459095\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.jagowebdesign.com\/website\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.jagowebdesign.com\/website\/#website\",\"url\":\"https:\/\/www.jagowebdesign.com\/website\/\",\"name\":\"Demo Website\",\"description\":\"Jagowebdesign.Com\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.jagowebdesign.com\/website\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.jagowebdesign.com\/website\/#\/schema\/person\/9c4f0b34abafcb25285cfc51e9459095\",\"name\":\"redakturjagowebdesign\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.jagowebdesign.com\/website\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cf55dfe07e97818622d2a46e2c6de4b1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cf55dfe07e97818622d2a46e2c6de4b1?s=96&d=mm&r=g\",\"caption\":\"redakturjagowebdesign\"},\"url\":\"https:\/\/www.jagowebdesign.com\/website\/author\/redakturjagowebdesign\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure - Demo Website","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/","og_locale":"en_US","og_type":"article","og_title":"DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure - Demo Website","og_description":"Di era digital transformation, DevOps dan Cloud Native practices telah menjadi fundamental untuk delivering software dengan cepat, reliable, dan scalable. Organisasi yang mengadopsi Cloud Native dapat mencapai deployment frequency hingga 100x lebih cepat dengan failure rate 60x lebih rendah. Artikel ini akan membahas secara mendalam tentang DevOps best practices dan Cloud Native deployment strategies di [&hellip;]","og_url":"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/","og_site_name":"Demo Website","article_published_time":"2025-11-11T01:22:42+00:00","og_image":[{"width":1024,"height":1024,"url":"http:\/\/www.jagowebdesign.com\/website\/wp-content\/uploads\/2025\/11\/website-9.jpg","type":"image\/jpeg"}],"author":"redakturjagowebdesign","twitter_card":"summary_large_image","twitter_misc":{"Written by":"redakturjagowebdesign"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/","url":"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/","name":"DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure - Demo Website","isPartOf":{"@id":"https:\/\/www.jagowebdesign.com\/website\/#website"},"datePublished":"2025-11-11T01:22:42+00:00","dateModified":"2025-11-11T01:22:42+00:00","author":{"@id":"https:\/\/www.jagowebdesign.com\/website\/#\/schema\/person\/9c4f0b34abafcb25285cfc51e9459095"},"breadcrumb":{"@id":"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.jagowebdesign.com\/website\/devops-dan-cloud-native-deployment-panduan-lengkap-modern-infrastructure\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.jagowebdesign.com\/website\/"},{"@type":"ListItem","position":2,"name":"DevOps dan Cloud Native Deployment: Panduan Lengkap Modern Infrastructure"}]},{"@type":"WebSite","@id":"https:\/\/www.jagowebdesign.com\/website\/#website","url":"https:\/\/www.jagowebdesign.com\/website\/","name":"Demo Website","description":"Jagowebdesign.Com","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.jagowebdesign.com\/website\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.jagowebdesign.com\/website\/#\/schema\/person\/9c4f0b34abafcb25285cfc51e9459095","name":"redakturjagowebdesign","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.jagowebdesign.com\/website\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cf55dfe07e97818622d2a46e2c6de4b1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cf55dfe07e97818622d2a46e2c6de4b1?s=96&d=mm&r=g","caption":"redakturjagowebdesign"},"url":"https:\/\/www.jagowebdesign.com\/website\/author\/redakturjagowebdesign\/"}]}},"_links":{"self":[{"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/posts\/4446"}],"collection":[{"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/comments?post=4446"}],"version-history":[{"count":1,"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/posts\/4446\/revisions"}],"predecessor-version":[{"id":4447,"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/posts\/4446\/revisions\/4447"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/media\/4420"}],"wp:attachment":[{"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/media?parent=4446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/categories?post=4446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jagowebdesign.com\/website\/wp-json\/wp\/v2\/tags?post=4446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}