توفير البنية التحتية مع Crossplane

المزودون والموارد المُدارة

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

المزودون هم قلب Crossplane، يتصلون بـ APIs السحابية ويديرون موارد البنية التحتية. فهم كيفية تكوين المزودين والعمل مع الموارد المُدارة ضروري لبناء منصتك.

أنواع المزودين

يدعم Crossplane مزودين للمنصات السحابية والخدمات الرئيسية:

# فئات المزودين المتاحة
providers:

  cloud_platforms:
    - name: provider-aws
      resources: "EC2, RDS, S3, VPC, EKS, Lambda, إلخ"
      package: xpkg.upbound.io/upbound/provider-family-aws

    - name: provider-gcp
      resources: "Compute, CloudSQL, GCS, VPC, GKE, إلخ"
      package: xpkg.upbound.io/upbound/provider-family-gcp

    - name: provider-azure
      resources: "VMs, SQL, Storage, VNet, AKS, إلخ"
      package: xpkg.upbound.io/upbound/provider-family-azure

  kubernetes:
    - name: provider-kubernetes
      resources: "Deployments, Services, ConfigMaps, إلخ"
      use_case: "نشر التطبيقات مع البنية التحتية"

    - name: provider-helm
      resources: "إصدارات Helm"
      use_case: "نشر مخططات Helm كجزء من التركيبات"

  other:
    - name: provider-terraform
      use_case: "استخدام وحدات Terraform في Crossplane"

    - name: provider-sql
      use_case: "إدارة قواعد البيانات، المستخدمين، الصلاحيات"

تثبيت مزودين متعددين

للمنصة الحقيقية، ستحتاج مزودين متعددين:

# providers.yaml - تثبيت مزودات عائلة AWS
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-ec2
spec:
  package: xpkg.upbound.io/upbound/provider-aws-ec2:v1.1.0
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-rds
spec:
  package: xpkg.upbound.io/upbound/provider-aws-rds:v1.1.0
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-s3
spec:
  package: xpkg.upbound.io/upbound/provider-aws-s3:v1.1.0
---
apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-iam
spec:
  package: xpkg.upbound.io/upbound/provider-aws-iam:v1.1.0
# تطبيق جميع المزودين
kubectl apply -f providers.yaml

# انتظار أن يصبح المزودون صحيين
kubectl wait provider --all --for=condition=Healthy --timeout=300s

# قائمة المزودين المثبتين
kubectl get providers
# NAME               INSTALLED   HEALTHY   PACKAGE                                        AGE
# provider-aws-ec2   True        True      xpkg.upbound.io/upbound/provider-aws-ec2:v1.1.0   2m
# provider-aws-rds   True        True      xpkg.upbound.io/upbound/provider-aws-rds:v1.1.0   2m
# provider-aws-s3    True        True      xpkg.upbound.io/upbound/provider-aws-s3:v1.1.0    2m
# provider-aws-iam   True        True      xpkg.upbound.io/upbound/provider-aws-iam:v1.1.0   2m

خيارات تكوين المزود

تكوين بيانات الاعتماد بأمان:

# الخيار 1: بيانات اعتماد قائمة على Secret (التطوير)
---
apiVersion: v1
kind: Secret
metadata:
  name: aws-creds
  namespace: crossplane-system
type: Opaque
stringData:
  credentials: |
    [default]
    aws_access_key_id = AKIAIOSFODNN7EXAMPLE
    aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
---
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds
      key: credentials

---
# الخيار 2: IRSA (الإنتاج - AWS)
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: IRSA

---
# الخيار 3: Workload Identity (الإنتاج - GCP)
apiVersion: gcp.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  projectID: my-gcp-project
  credentials:
    source: InjectedIdentity

---
# الخيار 4: تكوينات متعددة (حسابات متعددة)
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: production
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds-prod
      key: credentials
---
apiVersion: aws.upbound.io/v1beta1
kind: ProviderConfig
metadata:
  name: development
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: aws-creds-dev
      key: credentials

أمثلة الموارد المُدارة

قاعدة بيانات RDS

# rds-instance.yaml
apiVersion: rds.aws.upbound.io/v1beta1
kind: Instance
metadata:
  name: production-postgres
spec:
  forProvider:
    region: us-east-1
    allocatedStorage: 20
    autoMinorVersionUpgrade: true
    backupRetentionPeriod: 7
    backupWindow: "03:00-04:00"
    dbInstanceClass: db.t3.micro
    dbName: appdb
    engine: postgres
    engineVersion: "15.4"
    instanceIdentifier: production-postgres
    maintenanceWindow: "Mon:04:00-Mon:05:00"
    multiAz: false
    passwordSecretRef:
      key: password
      name: db-password
      namespace: default
    publiclyAccessible: false
    skipFinalSnapshot: true
    storageEncrypted: true
    storageType: gp3
    username: dbadmin
    vpcSecurityGroupIdRefs:
      - name: db-security-group
    dbSubnetGroupNameRef:
      name: db-subnet-group
  providerConfigRef:
    name: default
  writeConnectionSecretToRef:
    name: postgres-connection
    namespace: default

VPC مع شبكات فرعية

# vpc.yaml
apiVersion: ec2.aws.upbound.io/v1beta1
kind: VPC
metadata:
  name: platform-vpc
spec:
  forProvider:
    region: us-east-1
    cidrBlock: 10.0.0.0/16
    enableDnsHostnames: true
    enableDnsSupport: true
    tags:
      Name: platform-vpc
      Environment: production
  providerConfigRef:
    name: default

---
# subnet.yaml
apiVersion: ec2.aws.upbound.io/v1beta1
kind: Subnet
metadata:
  name: platform-subnet-a
spec:
  forProvider:
    region: us-east-1
    availabilityZone: us-east-1a
    cidrBlock: 10.0.1.0/24
    vpcIdRef:
      name: platform-vpc
    mapPublicIpOnLaunch: false
    tags:
      Name: platform-subnet-a
  providerConfigRef:
    name: default

حاوية S3 مع التشفير

# s3-bucket-secure.yaml
apiVersion: s3.aws.upbound.io/v1beta1
kind: Bucket
metadata:
  name: app-data-bucket
spec:
  forProvider:
    region: us-east-1
    tags:
      Environment: production
  providerConfigRef:
    name: default

---
apiVersion: s3.aws.upbound.io/v1beta1
kind: BucketServerSideEncryptionConfiguration
metadata:
  name: app-data-bucket-encryption
spec:
  forProvider:
    region: us-east-1
    bucketRef:
      name: app-data-bucket
    rule:
      - applyServerSideEncryptionByDefault:
          - sseAlgorithm: AES256

---
apiVersion: s3.aws.upbound.io/v1beta1
kind: BucketVersioning
metadata:
  name: app-data-bucket-versioning
spec:
  forProvider:
    region: us-east-1
    bucketRef:
      name: app-data-bucket
    versioningConfiguration:
      - status: Enabled

---
apiVersion: s3.aws.upbound.io/v1beta1
kind: BucketPublicAccessBlock
metadata:
  name: app-data-bucket-public-access
spec:
  forProvider:
    region: us-east-1
    bucketRef:
      name: app-data-bucket
    blockPublicAcls: true
    blockPublicPolicy: true
    ignorePublicAcls: true
    restrictPublicBuckets: true

أسرار الاتصال

يمكن لـ Crossplane كتابة تفاصيل الاتصال إلى Kubernetes Secrets:

# المورد مع سر الاتصال
apiVersion: rds.aws.upbound.io/v1beta1
kind: Instance
metadata:
  name: my-database
spec:
  forProvider:
    # ... التكوين
  writeConnectionSecretToRef:
    name: db-connection-secret
    namespace: default

---
# السر الناتج يحتوي:
# apiVersion: v1
# kind: Secret
# metadata:
#   name: db-connection-secret
# data:
#   endpoint: <base64-encoded-endpoint>
#   port: <base64-encoded-port>
#   username: <base64-encoded-username>
#   password: <base64-encoded-password>
# عرض تفاصيل الاتصال
kubectl get secret db-connection-secret -o yaml

# الاستخدام في تطبيقك
kubectl get secret db-connection-secret -o jsonpath='{.data.endpoint}' | base64 -d

مراجع الموارد

ربط الموارد معًا باستخدام المراجع:

# أنماط المراجع
references:

  # بالاسم (في نفس مساحة الاسم)
  vpcIdRef:
    name: my-vpc

  # بالمحدد (مطابقة التسميات)
  vpcIdSelector:
    matchLabels:
      environment: production
      team: platform

  # بالاسم الخارجي (مورد موجود)
  vpcId: vpc-0123456789abcdef0

  # مرجع السر (للقيم الحساسة)
  passwordSecretRef:
    key: password
    name: db-credentials
    namespace: crossplane-system
# مثال: مجموعة أمان تشير إلى VPC
apiVersion: ec2.aws.upbound.io/v1beta1
kind: SecurityGroup
metadata:
  name: db-security-group
spec:
  forProvider:
    region: us-east-1
    description: "مجموعة أمان قاعدة البيانات"
    vpcIdRef:
      name: platform-vpc  # يشير إلى VPC بالاسم
    ingress:
      - fromPort: 5432
        toPort: 5432
        protocol: tcp
        cidrBlocks:
          - 10.0.0.0/16
    tags:
      Name: db-security-group

مراقبة الموارد

مراقبة مواردك المُدارة:

# قائمة جميع الموارد المُدارة
kubectl get managed

# فحص نوع مورد محدد
kubectl get instance.rds.aws.upbound.io

# مراقبة حالة المورد
kubectl get bucket -w

# الحصول على حالة مفصلة
kubectl describe instance.rds.aws.upbound.io my-database

# فحص الأحداث
kubectl get events --field-selector involvedObject.name=my-database

# عرض سجلات Crossplane للتصحيح
kubectl logs -n crossplane-system -l pkg.crossplane.io/provider=provider-aws-rds

في الدرس التالي، سنبني على هذه الأساسيات لإنشاء التركيبات وXRDs—مفتاح البنية التحتية ذاتية الخدمة. :::