مراقبة وموثوقية المنصة

إدارة التكاليف وFinOps

3 دقيقة للقراءة

فرق المنصة مسؤولة عن تكاليف البنية التحتية. ممارسات FinOps (العمليات المالية) تساعد على تحسين الإنفاق مع الحفاظ على قدرات المنصة. يغطي هذا الدرس رؤية التكاليف والتخصيص واستراتيجيات التحسين.

لماذا FinOps لفرق المنصة

بدون FinOps:
┌─────────────────────────────────────────────────────────┐
│  فاتورة السحابة الشهرية: $500,000                       │
│                                                          │
│  "أين تذهب هذه الأموال؟"                                │
│  "أي الفرق تنفق أكثر؟"                                  │
│  "هل لدينا موارد زائدة؟"                                │
│  "كيف نضع ميزانية للعام القادم؟"                        │
└─────────────────────────────────────────────────────────┘

مع FinOps:
┌─────────────────────────────────────────────────────────┐
│  فاتورة السحابة الشهرية: $500,000                       │
│                                                          │
│  فريق الطلبات:    $150,000 (30%)  ↓ 5% مقابل الشهر الماضي│
│  فريق المستخدمين: $120,000 (24%)  ↑ 8% - ميزة جديدة    │
│  فريق المنصة:     $ 80,000 (16%)  = مستقر              │
│  موارد خاملة:     $ 50,000 (10%)  ← يحتاج إجراء        │
│  خدمات مشتركة:    $100,000 (20%)                       │
└─────────────────────────────────────────────────────────┘

تثبيت Kubecost

Kubecost يوفر رؤية تكاليف Kubernetes:

# تثبيت Kubecost مع Helm
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm repo update

helm install kubecost kubecost/cost-analyzer \
  --namespace kubecost \
  --create-namespace \
  --set kubecostToken="YOUR_TOKEN" \
  --set prometheus.server.retention="15d"

# الوصول لواجهة Kubecost
kubectl port-forward -n kubecost deployment/kubecost-cost-analyzer 9090
# افتح http://localhost:9090

تخصيص التكاليف

وسم الموارد للإسناد الدقيق للتكاليف:

# تسميات Kubernetes لتخصيص التكاليف
cost_labels:

  required:
    - team: "orders|users|platform|data"
    - environment: "production|staging|development"
    - product: "checkout|search|recommendations"

  optional:
    - cost-center: "CC-12345"
    - project: "project-name"

# مثال deployment مع تسميات التكلفة
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
  labels:
    team: orders
    environment: production
    product: checkout
    cost-center: CC-12345
spec:
  template:
    metadata:
      labels:
        team: orders
        environment: production
        product: checkout

وسم تكلفة Crossplane

وسم تكاليف البنية التحتية تلقائيًا:

# composition-with-cost-tags.yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: database-aws-with-tags
spec:
  compositeTypeRef:
    apiVersion: platform.acme.com/v1alpha1
    kind: XDatabase

  resources:
    - name: rds-instance
      base:
        apiVersion: rds.aws.upbound.io/v1beta1
        kind: Instance
        spec:
          forProvider:
            tags:
              ManagedBy: crossplane
              Platform: internal-developer-platform
      patches:
        # إضافة وسم الفريق من المطالبة
        - type: FromCompositeFieldPath
          fromFieldPath: metadata.labels[team]
          toFieldPath: spec.forProvider.tags.Team

        # إضافة وسم البيئة
        - type: FromCompositeFieldPath
          fromFieldPath: metadata.labels[environment]
          toFieldPath: spec.forProvider.tags.Environment

        # إضافة مركز التكلفة
        - type: FromCompositeFieldPath
          fromFieldPath: spec.costCenter
          toFieldPath: spec.forProvider.tags.CostCenter

لوحة مراقبة التكاليف

# قواعد Prometheus لمقاييس التكلفة
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: cost-metrics
  namespace: monitoring
spec:
  groups:
    - name: cost.metrics
      rules:
        # التكلفة لكل فريق (من Kubecost)
        - record: cost:team:monthly
          expr: |
            sum by (team) (
              kubecost_cluster_cost_total{aggregation="team"}
            ) * 720  # ساعات في الشهر

        # التكلفة لكل مساحة اسم
        - record: cost:namespace:monthly
          expr: |
            sum by (namespace) (
              kubecost_namespace_cost_total
            ) * 720

        # تكلفة الموارد الخاملة
        - record: cost:idle:daily
          expr: |
            sum(kubecost_idle_cost_total) * 24

        # نسبة كفاءة التكلفة
        - record: cost:efficiency:ratio
          expr: |
            1 - (sum(kubecost_idle_cost_total) /
                 sum(kubecost_total_cost))

تحسين الموارد

تحديد وإصلاح الموارد المهدرة:

# استراتيجيات تحسين الموارد
optimization:

  right_sizing:
    description: "مطابقة طلبات الموارد للاستخدام الفعلي"
    tools:
      - توصيات Kubecost
      - VPA (المقياس العمودي التلقائي للـ Pod)
    prometheus_query: |
      # CPU زائد التخصيص (الطلب > 2x الفعلي)
      (
        sum by (namespace, pod) (kube_pod_container_resource_requests{resource="cpu"})
        /
        sum by (namespace, pod) (rate(container_cpu_usage_seconds_total[1h]))
      ) > 2

  idle_resources:
    description: "موارد تعمل ولكن لا تُستخدم"
    checks:
      - "Deployments بدون حركة مرور"
      - "PVCs غير مركبة"
      - "موازنات تحميل بدون اتصالات"

  spot_instances:
    description: "استخدام spot/preemptible للأحمال غير الحرجة"
    candidates:
      - بيئات التطوير
      - مشغلات CI/CD
      - المعالجة الدفعية

  reserved_capacity:
    description: "الالتزام بالتوفير للأحمال المتوقعة"
    targets:
      - قواعد بيانات الإنتاج
      - خدمات المنصة الأساسية

سياسات FinOps

تنفيذ حواجز التكلفة:

# سياسة Kyverno لضوابط التكلفة
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resource-limits
spec:
  validationFailureAction: enforce
  rules:
    - name: require-limits
      match:
        resources:
          kinds:
            - Pod
      validate:
        message: "حدود CPU والذاكرة مطلوبة"
        pattern:
          spec:
            containers:
              - resources:
                  limits:
                    memory: "?*"
                    cpu: "?*"

---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-cost-labels
spec:
  validationFailureAction: enforce
  rules:
    - name: require-team-label
      match:
        resources:
          kinds:
            - Deployment
            - StatefulSet
      validate:
        message: "تسمية الفريق مطلوبة لتخصيص التكلفة"
        pattern:
          metadata:
            labels:
              team: "?*"

تقارير التكلفة

توليد تقارير تكلفة الفريق:

# تكوين تقارير التكلفة
cost_reports:

  weekly:
    recipients: "team-leads@acme.com"
    content:
      - "التكلفة لكل فريق (تغيير أسبوع على أسبوع)"
      - "أعلى 10 موارد تكلفة"
      - "توصيات التحسين"

  monthly:
    recipients: "finance@acme.com, engineering-vp@acme.com"
    content:
      - "التكلفة لكل فريق ومنتج"
      - "تحليل الاتجاه"
      - "الميزانية مقابل الفعلي"
      - "التوقعات للشهر القادم"

  alerts:
    - name: "تجاوز الميزانية"
      condition: "team_cost > budget * 1.1"
      action: "إخطار قائد الفريق"

    - name: "اكتشاف شذوذ"
      condition: "daily_cost > avg_daily_cost * 2"
      action: "تنبيه فريق المنصة"

Showback مقابل Chargeback

# نماذج تخصيص التكلفة
allocation_models:

  showback:
    description: "إظهار تكاليف الفرق دون فرض رسوم"
    use_case: "بناء ثقافة الوعي بالتكلفة"
    implementation:
      - تقارير التكلفة الشهرية لكل فريق
      - رؤية لوحة التحكم
      - بدون إنفاذ الميزانية

  chargeback:
    description: "تحصيل من الفرق للاستخدام الفعلي"
    use_case: "المؤسسات الناضجة مع ملكية الميزانية"
    implementation:
      - نظام فوترة داخلي
      - تنبيهات وإنفاذ الميزانية
      - سير عمل الموافقة للطلبات الكبيرة

  recommendation: |
    ابدأ بـ showback لبناء الوعي،
    ثم انتقل إلى chargeback عندما تكون الفرق جاهزة

في الدرس التالي، سنستكشف أنماط موثوقية المنصة بما في ذلك الإيجار المتعدد والعزل. :::

اختبار

الوحدة 5: مراقبة وموثوقية المنصة

خذ الاختبار