الفصل 9.2 - حسابات الخدمة
أهداف التعلم
في نهاية هذا الفصل، ستكون قادرًا على:
- فهم ما هو حساب الخدمة
- إنشاء واستخدام حسابات الخدمة
- ربط حسابات الخدمة بالبودات
- فهم الرموز والأسرار
- إدارة الأذونات باستخدام RBAC
- استخدام حسابات الخدمة للوصول إلى API
مقدمة
يوفر حساب الخدمة هوية للبودات التي تعمل في الكلاستر. يتيح للتطبيقات التفاعل مع API الخاص بـ Kubernetes بطريقة آمنة.
ما هو حساب الخدمة؟
حساب الخدمة هو هوية Kubernetes تستخدمها البودات لـ:
- المصادقة مع API الخاص بـ Kubernetes
- الوصول إلى الموارد وفقًا لأذونات RBAC
- التفاعل مع الخدمات الأخرى في الكلاستر
افتراضيًا: كل namespace لديه حساب خدمة default.
إنشاء حساب خدمة
حساب خدمة أساسي
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-sa
namespace: default
حساب خدمة مع تعليقات توضيحية
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-sa
namespace: default
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-role
الاستخدام في بود
تحديد حساب الخدمة
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: my-app-sa
containers:
- name: app
image: my-app:1.0
النتيجة: يستخدم البود my-app-sa بدلاً من حساب الخدمة الافتراضي.
حساب الخدمة التلقائي
إذا لم يتم تحديد serviceAccountName، يستخدم البود حساب الخدمة default للـ namespace.
الرموز والأسرار
الرمز التلقائي
يقوم Kubernetes بإنشاء رمز (Secret) تلقائيًا لكل حساب خدمة:
# عرض الأسرار التي تم إنشاؤها تلقائيًا
kubectl get secrets | grep my-app-sa
# تفاصيل الرمز
kubectl describe secret my-app-sa-token-xxxxx
تركيب الرمز
يتم تركيب الرمز تلقائيًا في البود في /var/run/secrets/kubernetes.io/serviceaccount/:
# داخل البود
cat /var/run/secrets/kubernetes.io/serviceaccount/token
cat /var/run/secrets/kubernetes.io/serviceaccount/namespace
cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
أذونات RBAC
ربط حساب خدمة بدور
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-role-binding
namespace: default
subjects:
- kind: ServiceAccount
name: my-app-sa
namespace: default
roleRef:
kind: Role
name: app-role
apiGroup: rbac.authorization.k8s.io
مثال كامل
الخطوة 1: إنشاء حساب الخدمة
apiVersion: v1
kind: ServiceAccount
metadata:
name: pod-reader-sa
namespace: default
الخطوة 2: إنشاء الدور
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
الخطوة 3: إنشاء الربط بالدور
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default
subjects:
- kind: ServiceAccount
name: pod-reader-sa
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
الخطوة 4: الاستخدام في بود
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
serviceAccountName: pod-reader-sa
containers:
- name: app
image: my-app:1.0
النتيجة: يمكن للبود قراءة البودات في الـ namespace default.
الوصول إلى API الخاص بـ Kubernetes
استخدام الرمز في التطبيق
import os
import requests
# قراءة الرمز
with open('/var/run/secrets/kubernetes.io/serviceaccount/token', 'r') as f:
token = f.read().strip()
# قراءة الـ namespace
with open('/var/run/secrets/kubernetes.io/serviceaccount/namespace', 'r') as f:
namespace = f.read().strip()
# استدعاء API
api_url = f"https://kubernetes.default.svc/api/v1/namespaces/{namespace}/pods"
headers = {
'Authorization': f'Bearer {token}',
'Content-Type': 'application/json'
}
response = requests.get(api_url, headers=headers, verify='/var/run/secrets/kubernetes.io/serviceaccount/ca.crt')
print(response.json())
أسرار سحب الصور
يمكن لحسابات الخدمة أن تحتوي على imagePullSecrets للوصول إلى سجلات Docker الخاصة:
apiVersion: v1
kind: ServiceAccount
metadata:
name: private-registry-sa
namespace: default
imagePullSecrets:
- name: regcred
النتيجة: جميع البودات التي تستخدم هذا حساب الخدمة يمكنها سحب الصور من السجل الخاص.
حساب الخدمة الافتراضي
تعطيل التركيب التلقائي
apiVersion: v1
kind: ServiceAccount
metadata:
name: no-token-sa
namespace: default
automountServiceAccountToken: false
النتيجة: لا يتم تركيب الرمز في البودات التي تستخدم هذا حساب الخدمة.
على مستوى البود
apiVersion: v1
kind: Pod
metadata:
name: no-token-pod
spec:
serviceAccountName: my-app-sa
automountServiceAccountToken: false
containers:
- name: app
image: my-app:1.0
أفضل الممارسات
1. حساب خدمة لكل تطبيق
إنشاء حساب خدمة مخصص لكل تطبيق.
2. مبدأ الأقل امتيازًا
إعطاء الأذونات اللازمة فقط عبر RBAC.
3. عدم استخدام حساب الخدمة الافتراضي
تجنب استخدام حساب الخدمة default في الإنتاج.
4. تعطيل الرمز إذا لم يكن ضروريًا
استخدام automountServiceAccountToken: false إذا لم يكن التطبيق بحاجة للوصول إلى API.
5. تدوير الرموز
يتم تجديد الرموز تلقائيًا بواسطة Kubernetes.
أوامر مفيدة
الإدارة
# إنشاء حساب خدمة
kubectl create serviceaccount my-app-sa
# عرض حسابات الخدمة
kubectl get serviceaccounts
kubectl get sa
# التفاصيل
kubectl describe serviceaccount my-app-sa
# عرض الأسرار المرتبطة
kubectl get secrets | grep my-app-sa
الاستخدام
# إنشاء بود مع حساب خدمة
kubectl run my-pod --image=my-app:1.0 --serviceaccount=my-app-sa
# عرض الرمز في بود
kubectl exec my-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token
ملخص
في هذا الفصل، تعلمت:
حساب الخدمة: هوية للبودات في Kubernetes
الإنشاء: مورد Kubernetes بسيط
الاستخدام: عبر serviceAccountName في البودات
الرموز: تُنشأ تلقائيًا وتُركب في /var/run/secrets/kubernetes.io/serviceaccount/
RBAC: ربط حسابات الخدمة بأدوار للأذونات
الوصول إلى API: استخدام الرمز لاستدعاء API الخاص بـ Kubernetes
أسرار سحب الصور: للوصول إلى السجلات الخاصة
أفضل الممارسات: حساب خدمة لكل تطبيق، الأقل امتيازًا
الخطوات التالية
الفصل 9.3: سياسات الشبكة
الفصل 9.4: معايير أمان البود
المختبر 9.2: حسابات الخدمة والأذونات
تم إنشاء الفصل في: ديسمبر 2024