مراقبة وموثوقية المنصة
أنماط موثوقية المنصة
تضمن موثوقية المنصة تقديم خدمة متسقة لفرق التطوير. يغطي هذا الدرس تعدد المستأجرين وعزل مساحات الأسماء والمجموعات الافتراضية لمرونة المنصة.
تحديات تعدد المستأجرين
تخدم فرق المنصة فرق تطوير متعددة بمتطلبات متنوعة. يقدم تعدد المستأجرين تحديات حول عزل الموارد وحدود الأمان والتوزيع العادل للموارد.
نماذج الإيجار
┌─────────────────────────────────────────────────────────────────────┐
│ نماذج تعدد المستأجرين │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ تعدد المستأجرين الناعم │ تعدد المستأجرين الصلب │
│ ────────────────── │ ──────────────────── │
│ │ │
│ ┌─────────────────────┐ │ ┌─────────┐ ┌─────────┐ ┌─────────┐│
│ │ المجموعة المشتركة │ │ │مجموعة أ │ │مجموعة ب │ │مجموعة ج ││
│ │ ┌─────┐ ┌─────┐ │ │ │ فريق أ │ │ فريق ب │ │ فريق ج ││
│ │ │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 عمليات فريق المنصة والنضج، بما في ذلك بناء فريق منصة واستراتيجيات التبني.
:::