إرشادات الترحيل لتكوينات شبكة الخدمة المفتوحة (OSM) إلى Istio

هام

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

توفر هذه المقالة إرشادات عملية لتعيين نهج OSM إلى نهج Istio للمساعدة في ترحيل عمليات توزيع الخدمات المصغرة التي تديرها OSM إلى التي تديرها Istio. نحن نستخدم نموذج تطبيق مكتبة OSM كمرجع أساسي لمستخدمي OSM الحاليين. تنشر عملية المعاينة التالية تطبيق Bookstore. يتم اتباع نفس الخطوات وشرح كيفية تطبيق نهج حركة مرور OSM SMI باستخدام ما يعادل Istio.

إذا كنت لا تستخدم OSM وكنت جديدا على Istio، فابدأ بدليل بدء الاستخدام الخاص ب Istio لمعرفة كيفية استخدام شبكة خدمة Istio لتطبيقاتك. إذا كنت تستخدم OSM حاليا، فتأكد من أنك على دراية بنموذج تطبيق OSM Bookstore للتعرف على كيفية تكوين OSM لسياسات حركة المرور. لا يكرر العرض التالي الوثائق الحالية، ويشير إلى مواضيع محددة عند الاقتضاء. يجب أن تكون مرتاحا ومدركا تماما لبنية تطبيق المكتبة قبل المتابعة.

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

التعديلات اللازمة لتطبيق مكتبة نموذج OSM

للسماح ل Istio بإدارة تطبيق مكتبة OSM، هناك بعض التغييرات المطلوبة في البيانات الموجودة. هذه التغييرات مع المكتبة وخدمات mysql.

تعديلات مكتبة

في معاينة مكتبة OSM، يتم نشر خدمة المكتبة جنبا إلى جنب مع خدمة bookstore-v2 أخرى لتوضيح كيفية توفير OSM لتحويل نسبة استخدام الشبكة. سمحت لك هذه الخدمات الموزعة بتقسيم نسبة استخدام الشبكة للعميل (bookbuyer) بين نقاط نهاية خدمة متعددة. المفهوم الجديد الأول لفهم كيفية تعامل Istio مع ما يشيرون إليه باسم Traffic Shifting.

يعتمد تنفيذ OSM لتحويل حركة المرور على مواصفات تقسيم حركة مرور SMI. تتطلب مواصفات SMI Traffic Split وجود خدمات متعددة من المستوى الأعلى تتم إضافتها كخلفيات مع مقياس الوزن المطلوب لتحويل طلبات العميل من خدمة إلى أخرى. يحقق Istio تحول حركة المرور باستخدام مزيج من خدمة ظاهرية وقاعدة الوجهة. يوصى بشدة بأن تتعرف على كل من مفهومي الخدمة الظاهرية وقاعدة الوجهة.

ببساطة، تحدد الخدمة الظاهرية Istio قواعد التوجيه للعملاء الذين يطلبون المضيف (اسم الخدمة). تسمح الخدمات الظاهرية بربط إصدارات متعددة من التوزيع باسم مضيف خدمة ظاهرية واحد للعملاء لاستهدافه. يمكن تسمية عمليات نشر متعددة لنفس الخدمة، تمثل إصدارات مختلفة من التطبيق خلف نفس اسم المضيف. يمكن بعد ذلك تكوين خدمة Istio الظاهرية لترجيح الطلب إلى إصدار معين من الخدمة. يتم تكوين الإصدارات المتوفرة من الخدمة لاستخدام السمة subsets في قاعدة وجهة Istio.

يزيل التعديل الذي تم إجراؤه على خدمة المكتبة ونشر Istio الحاجة إلى وجود خدمة ثانية صريحة لاستهدافها، والتي يحتاجها SMI Traffic Split. ليست هناك حاجة لحساب خدمة آخر لخدمة المكتبة v2 أيضا، حيث سيتم دمجه ضمن خدمة المكتبة. يتم عرض تعديل بيان OSM traffic-access-v1.yaml الأصلي إلى Istio لكل من المكتبة v1 وv2 في القسم إنشاء Pods والخدمات وحسابات الخدمة أدناه. نوضح كيف نقوم بتقسيم نسبة استخدام الشبكة، والمعروفة باسم نقل البيانات في وقت لاحق في التنقل:

تعديلات MySql

لا يلزم إجراء تغييرات على مجموعة mysql ذات الحالة إلا في تكوين الخدمة. ضمن مواصفات الخدمة، يحتاج OSM إلى targetPort السمتين و appProtocol . هذه السمات غير مطلوبة ل Istio. تبدو الخدمة المحدثة التالية ل mysqldb كما يلي:

apiVersion: v1
kind: Service
metadata:
  name: mysqldb
  labels:
    app: mysqldb
    service: mysqldb
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysqldb

نشر تطبيق المكتبة المعدلة

على غرار OSM Bookstore، نبدأ بتثبيت جديد لتطبيق المكتبة.

إنشاء مساحات الأسماء

kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse

إضافة تسمية مساحة اسم لحقن Istio sidecar

بالنسبة إلى OSM، أدى استخدام الأمر osm namespace add <namespace> إلى إنشاء التعليقات التوضيحية الضرورية إلى مساحة الاسم لوحدة تحكم OSM لإضافة الحقن الجانبي التلقائي. مع Istio، تحتاج فقط إلى تسمية مساحة اسم للسماح بتوجيه وحدة تحكم Istio لإدخال وكلاء Envoy sidecar تلقائيا.

kubectl label namespace bookstore istio-injection=enabled
kubectl label namespace bookbuyer istio-injection=enabled
kubectl label namespace bookthief istio-injection=enabled
kubectl label namespace bookwarehouse istio-injection=enabled

نشر خدمة Istio الظاهرية وقاعدة الوجهة لمكتب

كما ذكرنا سابقا في قسم تعديل المكتبة، يعالج Istio تحول حركة المرور باستخدام سمة وزن VirtualService التي نقوم بتكوينها لاحقا في التنقل. نقوم بنشر الخدمة الظاهرية وقاعدة الوجهة لخدمة المكتبة. ننشر فقط مكتبة الإصدار 1 على الرغم من نشر مكتبة الإصدار 2. توفر خدمة Istio الظاهرية مسارا فقط إلى الإصدار 1 من المكتبة. يختلف عن كيفية تعامل OSM مع نقل نسبة استخدام الشبكة (تقسيم نسبة استخدام الشبكة)، نشر OSM خدمة أخرى لتطبيق الإصدار 2 من المكتبة. يحتاج OSM إلى إعداد نسبة استخدام الشبكة ليتم تقسيمها بين طلبات العميل باستخدام TrafficSplit. عند استخدام إزاحة حركة المرور مع Istio، يمكننا الرجوع إلى نقل حركة المرور إلى عمليات نشر تطبيق Kubernetes متعددة (إصدارات) مسماة لنفس الخدمة.

في هذا العرض، يتم نشر نشر إصداري المكتبة (v1 وv2) في نفس الوقت. يمكن الوصول إلى الإصدار 1 فقط بسبب تكوين الخدمة الظاهرية. ليست هناك حاجة لنشر خدمة أخرى للمكتبة الإصدار 2، ونحن تمكين مسار إلى مكتبة الإصدار 2 في وقت لاحق عندما نقوم بتحديث خدمة المكتبة الظاهرية وتوفير سمة الوزن اللازمة للقيام نقل حركة المرور.

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
        subset: v1
---
# Create bookstore destination rule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookstore-destination
  namespace: bookstore
spec:
  host: bookstore
  subsets:
  - name: v1
    labels:
      app: bookstore
      version: v1
  - name: v2
    labels:
      app: bookstore
      version: v2
EOF

إنشاء وحدات الجراب والخدمات وحسابات الخدمة

نستخدم ملف بيان واحد يحتوي على التعديلات التي تمت مناقشتها سابقا في المعاينة لنشر bookbuyerbookwarehousebookthiefbookstoreالتطبيقات و.mysql

kubectl apply -f - <<EOF
##################################################################################################
# bookbuyer service
##################################################################################################
---
# Create bookbuyer Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookbuyer
  namespace: bookbuyer
---
# Create bookbuyer Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookbuyer
      version: v1
  template:
    metadata:
      labels:
        app: bookbuyer
        version: v1
    spec:
      serviceAccountName: bookbuyer
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookbuyer
          image: openservicemesh/bookbuyer:latest-main
          imagePullPolicy: Always
          command: ["/bookbuyer"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
---
##################################################################################################
# bookthief service
##################################################################################################
---
# Create bookthief ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookthief
  namespace: bookthief
---
# Create bookthief Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookthief
  namespace: bookthief
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookthief
  template:
    metadata:
      labels:
        app: bookthief
        version: v1
    spec:
      serviceAccountName: bookthief
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookthief
          image: openservicemesh/bookthief:latest-main
          imagePullPolicy: Always
          command: ["/bookthief"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
            - name: "BOOKTHIEF_EXPECTED_RESPONSE_CODE"
              value: "503"
---
##################################################################################################
# bookstore service version 1 & 2
##################################################################################################
---
# Create bookstore Service
apiVersion: v1
kind: Service
metadata:
  name: bookstore
  namespace: bookstore
  labels:
    app: bookstore
spec:
  ports:
    - port: 14001
      name: bookstore-port
  selector:
    app: bookstore

---
# Create bookstore Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookstore
  namespace: bookstore

---
# Create bookstore-v1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v1
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v1
  template:
    metadata:
      labels:
        app: bookstore
        version: v1
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v1

---
# Create bookstore-v2 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v2
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v2
  template:
    metadata:
      labels:
        app: bookstore
        version: v2
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v2
---
##################################################################################################
# bookwarehouse service
##################################################################################################
---
# Create bookwarehouse Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
---
# Create bookwarehouse Service
apiVersion: v1
kind: Service
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
  labels:
    app: bookwarehouse
spec:
  ports:
  - port: 14001
    name: bookwarehouse-port
  selector:
    app: bookwarehouse
---
# Create bookwarehouse Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookwarehouse
  template:
    metadata:
      labels:
        app: bookwarehouse
        version: v1
    spec:
      serviceAccountName: bookwarehouse
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookwarehouse
          image: openservicemesh/bookwarehouse:latest-main
          imagePullPolicy: Always
          command: ["/bookwarehouse"]
##################################################################################################
# mysql service
##################################################################################################
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mysql
  namespace: bookwarehouse
---
apiVersion: v1
kind: Service
metadata:
  name: mysqldb
  labels:
    app: mysqldb
    service: mysqldb
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysqldb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: bookwarehouse
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      serviceAccountName: mysql
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: mypassword
        - name: MYSQL_DATABASE
          value: booksdemo
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /mysql-data
          name: data
        readinessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 15
          periodSeconds: 10
      volumes:
        - name: data
          emptyDir: {}
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 250M
EOF

لعرض هذه الموارد على نظام المجموعة، قم بتشغيل الأوامر التالية:

kubectl get pods,deployments,serviceaccounts -n bookbuyer
kubectl get pods,deployments,serviceaccounts -n bookthief

kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookstore
kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookwarehouse

عرض واجهات المستخدم للتطبيق

على غرار إرشادات OSM الأصلية، إذا كان لديك مستودع OSM مستنسخ، يمكنك استخدام البرامج النصية لإعادة توجيه المنفذ لعرض واجهات المستخدم لكل تطبيق هنا. في الوقت الحالي، نحن مهتمون فقط بعرض bookbuyer واجهة المستخدم و bookthief .

cp .env.example .env
bash <<EOF
./scripts/port-forward-bookbuyer-ui.sh &
./scripts/port-forward-bookthief-ui.sh &
wait
EOF

في مستعرض، افتح عناوين url التالية:

http://localhost:8080 - مدقق الكتب

http://localhost:8083 - bookthief

تكوين نهج حركة المرور الخاصة ب Istio

للحفاظ على الاستمرارية مع معاينة مكتبة OSM الأصلية للترجمة إلى Istio، نناقش وضع نهج حركة المرور المتساهل في OSM. كان وضع نهج نسبة استخدام الشبكة المسموح به في OSM مفهوما للسماح بنسبة استخدام الشبكة أو رفضها في الشبكة دون نشر أي قاعدة محددة للتحكم في الوصول إلى حركة مرور SMI. يوجد تكوين وضع نسبة استخدام الشبكة المسموح به للسماح للمستخدمين بإلحاق التطبيقات في الشبكة، مع الحصول على تشفير mTLS، دون الحاجة إلى قواعد صريحة للسماح للتطبيقات في الشبكة بالاتصال. كانت ميزة وضع نسبة استخدام الشبكة المتساهلة هي تجنب قطع اتصالات التطبيق الخاص بك بمجرد أن يديره OSM، وتوفير الوقت لتحديد القواعد الخاصة بك مع التأكد من تشفير اتصالات التطبيق mTLS. يمكن تعيين هذا الإعداد إلى true أو false عبر MeshConfig الخاص ب OSM.

يتعامل Istio مع فرض mTLS بشكل مختلف. يختلف عن OSM، يقوم الوضع المتساهل في Istio تلقائيا بتكوين وكلاء sidecar لاستخدام mTLS ولكن يسمح للخدمة بقبول كل من النص العادي وحركة mTLS. ما يعادل تكوين الوضع المتساهل ل OSM هو استخدام إعدادات Istio PeerAuthentication . PeerAuthentication يمكن القيام به بشكل دقيق في مساحة الاسم أو الشبكة بأكملها. لمزيد من المعلومات حول فرض Istio ل mTLS، اقرأ مقالة Istio Mutual TLS Migration.

فرض وضع Istio الصارم على مساحات أسماء المكتبات

من المهم أن نتذكر، تماما مثل الوضع المتساهل ل OSM، يرتبط تكوين Istio PeerAuthentication فقط باستخدام إنفاذ mTLS. تتم معالجة نهج الطبقة 7 الفعلية، مثل تلك المستخدمة في HTTPRouteGroups الخاصة ب OSM، باستخدام تكوينات AuthorizationPolicy الخاصة ب Istio التي تراها لاحقا في المعاينة.

نضع بشكل دقيق bookbuyerbookthiefbookstoreمساحات الأسماء و bookwarehouse في وضع mTLS الخاص ب Istio.

kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookthief
  namespace: bookthief
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookstore
  namespace: bookstore
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  mtls:
    mode: STRICT
EOF

توزيع نهج التحكم في الوصول إلى Istio

على غرار موارد SMI Traffic Target وSMI Traffic Specs الخاصة ب OSM لتحديد نهج التحكم في الوصول والتوجيه للتطبيقات للاتصال، ينجز Istio عناصر التحكم الدقيقة المماثلة هذه باستخدام AuthorizationPolicy التكوينات.

دعونا نستعرض ترجمة نهج TrafficTarget للمكتبة، والذي يسمح bookbuyer على وجه التحديد بالاتصال به، مع مسار طبقة-7 معين فقط، ورؤوس وأساليب معينة. فيما يلي جزء من بيان traffic-access-v1.yaml .

kind: TrafficTarget
apiVersion: access.smi-spec.io/v1alpha3
metadata:
  name: bookstore
  namespace: bookstore
spec:
  destination:
    kind: ServiceAccount
    name: bookstore
    namespace: bookstore
  rules:
    - kind: HTTPRouteGroup
      name: bookstore-service-routes
      matches:
        - buy-a-book
        - books-bought
  sources:
    - kind: ServiceAccount
      name: bookbuyer
      namespace: bookbuyer
---
apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

إذا لاحظت ضمن نهج TrafficTarget، في المواصفات هو المكان الذي يمكنك فيه تحديد الخدمة المصدر التي يمكنها الاتصال بخدمة الوجهة بشكل صريح. يمكننا أن نرى أننا نسمح للمصدر bookbuyer أن يكون مخولا للتواصل مع مكتبة الوجهة. إذا ترجمنا تخويل الخدمة إلى الخدمة من تكوين OSM TrafficTarget إلى Istio AuthorizationPolicy، فإنه يبدو كما يلي:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: bookstore
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]

في Istio AuthorizationPolicy، ستلاحظ كيفية تعيين خدمة وجهة نهج OSM TrafficTarget إلى تسمية المحدد المتطابقة ومساحة الاسم التي توجد فيها الخدمة. يتم عرض الخدمة المصدر ضمن قسم القواعد حيث توجد سمة المصدر/المبادئ التي تعين إلى اسم حساب الخدمة للخدمة bookbuyer .

بالإضافة إلى تكوين المصدر/الوجهة فقط في OSM TrafficTarget، يربط OSM استخدام HTTPRouteGroup لتحديد تخويل الطبقة 7 الذي يمكن للمصدر الوصول إليه بشكل أكبر. يمكننا أن نرى في جزء HTTPRouteGroup أدناه فقط. هناك اثنان matches لخدمة المصدر المسموح بها.

apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

هناك match اسم books-bought يسمح للمصدر بالوصول إلى المسار /books-bought باستخدام GET أسلوب مع عامل مستخدم عنوان المضيف ومعلومات تطبيق العميل، ومطابقة buy-a-book تستخدم regex express لمسار يحتوي على .*a-book.*new استخدام GET أسلوب.

يمكننا تحديد تكوينات OSM HTTPRouteGroup هذه في قسم القواعد في Istio AuthorizationPolicy الموضح أدناه:

apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
        - source:
            namespaces: ["bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]

يمكننا الآن نشر بيان OSM الذي تم ترحيله من خلال traffic-access-v1.yaml كما هو مفهوم من قبل Istio أدناه. لا AuthorizationPolicy يوجد ل bookthief، لذلك يجب أن تتوقف واجهة مستخدم bookthief عن زيادة الكتب من مكتبة الإصدار 1:

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
        - source:
            namespaces: ["bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookstore/sa/bookstore"]
        - source:
            namespaces: ["bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
        - source:
            namespaces: ["bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

السماح لتطبيق Bookthief بالوصول إلى مكتبة الكتب

حاليا لا AuthorizationPolicy يوجد ما يسمح ل bookthief للتواصل مع المكتبة. يمكننا نشر ما يلي AuthorizationPolicy للسماح ل bookthief بالاتصال بالمكتبة. لاحظت إضافة قاعدة لنهج المكتبة التي تسمح بتخويل bookthief.

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer", "cluster.local/ns/bookthief/sa/bookthief"]
        - source:
            namespaces: ["bookbuyer", "bookthief"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookstore/sa/bookstore"]
        - source:
            namespaces: ["bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
        - source:
            namespaces: ["bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

يجب أن تقوم واجهة مستخدم bookthief الآن بزيادة الكتب من مكتبة الإصدار 1.

تكوين Traffic Shifting بين إصدارين من الخدمة

لتوضيح كيفية موازنة نسبة استخدام الشبكة بين إصدارين من خدمة Kubernetes، والمعروفة باسم إزاحة نسبة استخدام الشبكة في Istio. كما تتذكر في قسم سابق، اعتمد تنفيذ OSM لتحويل نسبة استخدام الشبكة على خدمتين متميزتين يتم توزيعهما وإضافة أسماء الخدمة هذه إلى تكوين الواجهة الخلفية للنهج TrafficTarget . بنية التوزيع هذه غير مطلوبة لكيفية تنفيذ Istio لتحويل نسبة استخدام الشبكة. باستخدام Istio، يمكننا إنشاء عمليات نشر متعددة تمثل كل إصدار من تطبيق الخدمة وتحويل نسبة استخدام الشبكة إلى تلك الإصدارات المحددة عبر تكوين Istio virtualservice .

يحتوي المنشور حاليا virtualservice فقط على قاعدة توجيه إلى الإصدار v1 من المكتبة الموضحة أدناه:

spec:
  hosts:
    - bookstore
  http:
    - route:
        - destination:
            host: bookstore
            subset: v1

نقوم بتحديث virtualservice لتحويل 100٪ من الوزن إلى الإصدار 2 من المكتبة.

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
        subset: v1
      weight: 0
    - destination:
        host: bookstore
        subset: v2
      weight: 100
EOF

يجب أن تشاهد الآن زيادة كل من bookbuyer وواجهة bookthief المستخدم bookstore لخدمة الإصدار 2 فقط. يمكنك الاستمرار في التجربة عن طريق تغيير السمة weigth لتحويل حركة المرور بين الإصدارين bookstore .

الملخص

نأمل أن توفر هذه الإرشادات الإرشادية الإرشادات اللازمة حول كيفية ترحيل سياسات OSM الحالية إلى سياسات Istio. خذ وقتا وراجع مفاهيم Istio وتصفح دليل بدء الاستخدام الخاص ب Istio لمعرفة كيفية استخدام شبكة خدمة Istio لإدارة تطبيقاتك.