انتقل إلى المحتوى الرئيسي

الفصل 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