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

أنماط موثوقية المنصة

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

تضمن موثوقية المنصة تقديم خدمة متسقة لفرق التطوير. يغطي هذا الدرس تعدد المستأجرين وعزل مساحات الأسماء والمجموعات الافتراضية لمرونة المنصة.

تحديات تعدد المستأجرين

تخدم فرق المنصة فرق تطوير متعددة بمتطلبات متنوعة. يقدم تعدد المستأجرين تحديات حول عزل الموارد وحدود الأمان والتوزيع العادل للموارد.

نماذج الإيجار

┌─────────────────────────────────────────────────────────────────────┐
│                     نماذج تعدد المستأجرين                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  تعدد المستأجرين الناعم       │  تعدد المستأجرين الصلب              │
│  ──────────────────           │  ────────────────────               │
│                               │                                     │
│  ┌─────────────────────┐      │  ┌─────────┐ ┌─────────┐ ┌─────────┐│
│  │  المجموعة المشتركة  │      │  │مجموعة أ │ │مجموعة ب │ │مجموعة ج ││
│  │  ┌─────┐ ┌─────┐   │      │  │ فريق أ  │ │ فريق ب  │ │ فريق ج  ││
│  │  │NS-A │ │NS-B │   │      │  └─────────┘ └─────────┘ └─────────┘│
│  │  └─────┘ └─────┘   │      │                                     │
│  │  ┌─────┐ ┌─────┐   │      │  • عزل كامل                         │
│  │  │NS-C │ │NS-D │   │      │  • تكلفة موارد أعلى                 │
│  │  └─────┘ └─────┘   │      │  • ترقيات مستقلة                    │
│  └─────────────────────┘      │                                     │
│                               │                                     │
│  • عزل مساحة الاسم            │                                     │
│  • كفاءة في الموارد           │                                     │
│  • مستوى تحكم مشترك          │                                     │
│                               │                                     │
└─────────────────────────────────────────────────────────────────────┘

عزل مساحة الاسم مع سياسات الشبكة

تتحكم سياسات الشبكة في تدفق حركة المرور بين مساحات الأسماء والـ pods.

سياسة الرفض الافتراضية

# network-policy-default-deny.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: team-alpha
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress

السماح بحركة المرور داخل مساحة الاسم

# network-policy-allow-same-namespace.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-same-namespace
  namespace: team-alpha
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - podSelector: {}
  egress:
    - to:
        - podSelector: {}
    # السماح بحل DNS
    - to:
        - namespaceSelector: {}
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53

السماح بحركة المرور من متحكم الدخول

# network-policy-allow-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress-controller
  namespace: team-alpha
spec:
  podSelector:
    matchLabels:
      app.kubernetes.io/component: api
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: ingress-nginx
          podSelector:
            matchLabels:
              app.kubernetes.io/name: ingress-nginx
      ports:
        - protocol: TCP
          port: 8080

حصص الموارد والحدود

تمنع حصص الموارد أي فريق واحد من استهلاك موارد المجموعة بشكل مفرط.

حصة موارد مساحة الاسم

# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-quota
  namespace: team-alpha
spec:
  hard:
    # موارد الحوسبة
    requests.cpu: "20"
    requests.memory: 40Gi
    limits.cpu: "40"
    limits.memory: 80Gi

    # موارد التخزين
    requests.storage: 100Gi
    persistentvolumeclaims: "10"

    # عدد الكائنات
    pods: "50"
    services: "20"
    secrets: "50"
    configmaps: "50"

    # الخدمات حسب النوع
    services.loadbalancers: "2"
    services.nodeports: "5"

نطاقات الحدود للحدود الافتراضية

# limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
  namespace: team-alpha
spec:
  limits:
    - type: Container
      default:
        cpu: "500m"
        memory: 512Mi
      defaultRequest:
        cpu: "100m"
        memory: 128Mi
      min:
        cpu: "50m"
        memory: 64Mi
      max:
        cpu: "4"
        memory: 8Gi

    - type: PersistentVolumeClaim
      min:
        storage: 1Gi
      max:
        storage: 50Gi

المجموعات الافتراضية مع vCluster

ينشئ vCluster مجموعات Kubernetes افتراضية تعمل بكامل وظائفها داخل مساحات الأسماء. يحصل كل فريق على مستوى تحكم معزول مع مشاركة البنية التحتية الأساسية.

بنية vCluster

┌─────────────────────────────────────────────────────────────────────┐
│                    المجموعة المضيفة                                 │
│  ┌───────────────────────────────────────────────────────────────┐ │
│  │                 مساحة الاسم: vcluster-team-a                   │ │
│  │  ┌─────────────────────────────────────────────────────────┐  │ │
│  │  │             مستوى تحكم vCluster                          │  │ │
│  │  │  ┌──────────┐  ┌──────────┐  ┌──────────────────────┐  │  │ │
│  │  │  │ خادم     │  │ المزامن  │  │ CoreDNS              │  │  │ │
│  │  │  │ API      │  │          │  │                      │  │  │ │
│  │  │  └──────────┘  └──────────┘  └──────────────────────┘  │  │ │
│  │  │  ┌──────────────────────────────────────────────────┐  │  │ │
│  │  │  │ etcd (أو SQLite)                                 │  │  │ │
│  │  │  └──────────────────────────────────────────────────┘  │  │ │
│  │  └─────────────────────────────────────────────────────────┘  │ │
│  │                                                               │ │
│  │  الموارد الافتراضية ← مزامنة للمضيف ← جدولة على العقد         │ │
│  └───────────────────────────────────────────────────────────────┘ │
│                                                                     │
│  ┌───────────────────────────────────────────────────────────────┐ │
│  │                 مساحة الاسم: vcluster-team-b                   │ │
│  │  ┌─────────────────────────────────────────────────────────┐  │ │
│  │  │             مستوى تحكم vCluster                          │  │ │
│  │  │                   (نفس البنية)                           │  │ │
│  │  └─────────────────────────────────────────────────────────┘  │ │
│  └───────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘

تثبيت واجهة سطر أوامر vCluster

# macOS
brew install loft-sh/tap/vcluster

# Linux
curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-amd64"
chmod +x vcluster
sudo mv vcluster /usr/local/bin/

# التحقق من التثبيت
vcluster --version

إنشاء vCluster

# إنشاء vCluster لـ team-alpha
vcluster create team-alpha \
  --namespace vcluster-team-alpha \
  --connect=false

# الاتصال بـ vCluster
vcluster connect team-alpha \
  --namespace vcluster-team-alpha \
  --update-current=false \
  -- kubectl get namespaces

تكوين vCluster

# vcluster-values.yaml
vcluster:
  image: rancher/k3s:v1.28.4-k3s1

  resources:
    limits:
      cpu: "2"
      memory: 4Gi
    requests:
      cpu: "200m"
      memory: 256Mi

syncer:
  extraArgs:
    - --sync-all-nodes

sync:
  # مزامنة الخدمات للمجموعة المضيفة
  services:
    enabled: true

  # مزامنة الدخول
  ingresses:
    enabled: true

  # مزامنة مطالبات وحدة التخزين الدائمة
  persistentvolumeclaims:
    enabled: true

  # عدم مزامنة سياسات الشبكة (استخدام سياسات المضيف)
  networkpolicies:
    enabled: false

# إعدادات العزل
isolation:
  enabled: true

  resourceQuota:
    enabled: true
    quota:
      requests.cpu: "10"
      requests.memory: 20Gi
      limits.cpu: "20"
      limits.memory: 40Gi
      pods: "100"

  limitRange:
    enabled: true
    default:
      cpu: "500m"
      memory: 512Mi
    defaultRequest:
      cpu: "100m"
      memory: 128Mi

# استخدام SQLite بدلاً من etcd لبصمة أصغر
storage:
  persistence: true
  size: 5Gi

نشر vCluster مع Helm

# إضافة مستودع Loft Helm
helm repo add loft https://charts.loft.sh
helm repo update

# إنشاء مساحة الاسم
kubectl create namespace vcluster-team-alpha

# تثبيت vCluster
helm upgrade --install team-alpha loft/vcluster \
  --namespace vcluster-team-alpha \
  --values vcluster-values.yaml \
  --wait

# إنشاء kubeconfig للفريق
vcluster connect team-alpha \
  --namespace vcluster-team-alpha \
  --update-current=false \
  --kube-config ./team-alpha-kubeconfig.yaml

فرض السياسات مع Kyverno

يفرض Kyverno السياسات عبر المجموعات باستخدام أنماط Kubernetes الأصلية.

تثبيت Kyverno

# إضافة مستودع Kyverno Helm
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update

# تثبيت Kyverno
helm upgrade --install kyverno kyverno/kyverno \
  --namespace kyverno \
  --create-namespace \
  --set replicaCount=3

سياسة طلب حدود الموارد

# policy-require-limits.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resource-limits
  annotations:
    policies.kyverno.io/title: طلب حدود الموارد
    policies.kyverno.io/description: >-
      يجب على جميع الحاويات تحديد حدود CPU والذاكرة.
spec:
  validationFailureAction: Enforce
  background: true
  rules:
    - name: validate-resources
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "حدود CPU والذاكرة مطلوبة لجميع الحاويات."
        pattern:
          spec:
            containers:
              - resources:
                  limits:
                    memory: "?*"
                    cpu: "?*"

سياسة طلب التسميات

# policy-require-labels.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: Enforce
  rules:
    - name: require-team-label
      match:
        any:
          - resources:
              kinds:
                - Deployment
                - StatefulSet
                - DaemonSet
      validate:
        message: "التسمية 'team' مطلوبة."
        pattern:
          metadata:
            labels:
              team: "?*"

    - name: require-app-label
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "التسمية 'app.kubernetes.io/name' مطلوبة."
        pattern:
          metadata:
            labels:
              app.kubernetes.io/name: "?*"

إنشاء سياسات الشبكة تلقائياً

# policy-generate-network-policy.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-default-network-policy
spec:
  rules:
    - name: generate-default-deny
      match:
        any:
          - resources:
              kinds:
                - Namespace
              selector:
                matchLabels:
                  platform.company.com/managed: "true"
      generate:
        apiVersion: networking.k8s.io/v1
        kind: NetworkPolicy
        name: default-deny
        namespace: "{{request.object.metadata.name}}"
        synchronize: true
        data:
          spec:
            podSelector: {}
            policyTypes:
              - Ingress
              - Egress

لوحة معلومات موثوقية المنصة

مراقبة صحة المنصة واستخدام موارد المستأجرين.

قواعد تسجيل Prometheus

# platform-reliability-rules.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: platform-reliability
  namespace: monitoring
spec:
  groups:
    - name: platform.reliability
      interval: 30s
      rules:
        # استخدام موارد المستأجر
        - record: platform:tenant_cpu_utilization:ratio
          expr: |
            sum by (namespace) (
              rate(container_cpu_usage_seconds_total{namespace=~"team-.*"}[5m])
            )
            /
            sum by (namespace) (
              kube_resourcequota{resource="limits.cpu", type="hard", namespace=~"team-.*"}
            )

        - record: platform:tenant_memory_utilization:ratio
          expr: |
            sum by (namespace) (
              container_memory_working_set_bytes{namespace=~"team-.*"}
            )
            /
            sum by (namespace) (
              kube_resourcequota{resource="limits.memory", type="hard", namespace=~"team-.*"}
            )

        # صحة vCluster
        - record: platform:vcluster_api_availability:ratio
          expr: |
            avg_over_time(up{job=~"vcluster-.*"}[5m])

        # انتهاكات السياسة
        - record: platform:policy_violations:count
          expr: |
            sum by (policy) (
              increase(kyverno_policy_results_total{rule_result="fail"}[1h])
            )

لوحة Grafana لصحة المنصة

{
  "dashboard": {
    "title": "موثوقية المنصة",
    "panels": [
      {
        "title": "استخدام CPU للمستأجر",
        "type": "gauge",
        "targets": [
          {
            "expr": "platform:tenant_cpu_utilization:ratio * 100",
            "legendFormat": "{{namespace}}"
          }
        ],
        "fieldConfig": {
          "defaults": {
            "thresholds": {
              "steps": [
                {"color": "green", "value": null},
                {"color": "yellow", "value": 70},
                {"color": "red", "value": 90}
              ]
            },
            "unit": "percent",
            "max": 100
          }
        }
      },
      {
        "title": "توفر vCluster",
        "type": "stat",
        "targets": [
          {
            "expr": "avg(platform:vcluster_api_availability:ratio) * 100",
            "legendFormat": "التوفر"
          }
        ],
        "fieldConfig": {
          "defaults": {
            "unit": "percent",
            "thresholds": {
              "steps": [
                {"color": "red", "value": null},
                {"color": "yellow", "value": 99},
                {"color": "green", "value": 99.9}
              ]
            }
          }
        }
      },
      {
        "title": "انتهاكات السياسة (الساعة الأخيرة)",
        "type": "table",
        "targets": [
          {
            "expr": "topk(10, platform:policy_violations:count)",
            "format": "table"
          }
        ]
      }
    ]
  }
}

الملخص

تضمن أنماط موثوقية المنصة تقديم خدمة متسقة:

النمط الأداة الغرض
عزل مساحة الاسم سياسات الشبكة التحكم في حركة مرور pod-to-pod
حدود الموارد ResourceQuota, LimitRange منع استنفاد الموارد
المجموعات الافتراضية vCluster عزل API كامل لكل مستأجر
فرض السياسات Kyverno الامتثال الآلي

اختر مستوى العزل المناسب بناءً على متطلباتك:

  • عزل مساحة الاسم: كافٍ للفرق الداخلية الموثوقة
  • vCluster: مطلوب لأحمال العمل غير الموثوقة أو متطلبات الامتثال
  • مجموعات مخصصة: مطلوبة للفصل التنظيمي الصارم

الدرس التالي: تغطي الوحدة 6 عمليات فريق المنصة والنضج، بما في ذلك بناء فريق منصة واستراتيجيات التبني.

:::

اختبار

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

خذ الاختبار