Sdílet prostřednictvím


Pokyny k migraci pro konfigurace Open Service Mesh (OSM) do Istio

Důležité

Cílem tohoto článku je lépe pochopit, jak identifikovat konfigurace OSM a přeložit je na ekvivalentní konfigurace Istio pro migraci úloh z OSM na Istio. To není žádným způsobem považováno za vyčerpávající podrobného průvodce.

Tento článek obsahuje praktické pokyny pro mapování zásad OSM na zásady Istio , které vám pomůžou migrovat nasazení mikroslužeb spravovaných osmem na správu istio. Ukázkovou aplikaci osm Bookstore používáme jako základní referenci pro aktuální uživatele OSM. Následující návod nasadí aplikaci Bookstore. Následují se stejné kroky a vysvětlují, jak použít zásady provozu OSM SMI pomocí ekvivalentu Istio.

Pokud osm nepoužíváte a s Istio začínáte, začněte vlastním průvodcem Začínáme istio a zjistěte, jak používat síť služeb Istio pro vaše aplikace. Pokud aktuálně používáte OSM, ujistěte se, že znáte ukázkovou aplikaci OSM Bookstore, jak OSM konfiguruje zásady provozu. Následující názorný postup nezduplikuje aktuální dokumentaci a v případě relevantních odkazů na konkrétní témata. Než budete pokračovat, měli byste být obeznámeni s architekturou aplikací knihkupectví.

Požadavky

Úpravy potřebné pro ukázkovou aplikaci osm knihkupectví

Aby mohla istio spravovat aplikaci osm knihkupectví, v existujících manifestech je potřeba provést několik změn. Tyto změny jsou v knihkupectví a službách mysql.

Úpravy knihkupectví

V návodu osm Bookstore se služba knihkupectví nasadí spolu s jinou službou bookstore-v2, která ukazuje, jak OSM zajišťuje posun provozu. Tyto nasazené služby umožňují rozdělit provoz klienta (bookbuyer) mezi několik koncových bodů služby. První nový koncept, který vám umožní pochopit, jak Istio zpracovává to, co označuje jako posun provozu.

Osm implementace posunu provozu je založená na specifikaci SMI Traffic Split. Specifikace SMI Traffic Split vyžaduje existenci několika služeb nejvyšší úrovně, které se přidají jako back-endy s požadovanou váhu metrikou pro přesun požadavků klientů z jedné služby do druhé. Istio provádí přesun provozu pomocí kombinace virtuální služby a cílového pravidla. Důrazně doporučujeme seznámit se s koncepty virtuální služby i cílového pravidla.

Jednoduše řečeno, virtuální služba Istio definuje pravidla směrování pro klienty, kteří požadují hostitele (název služby). Virtuální služby umožňují přidružit několik verzí nasazení k jednomu názvu hostitele virtuální služby, aby klienti mohli cílit. Pro stejnou službu lze označit více nasazení, která představují různé verze aplikace za stejným názvem hostitele. Virtuální služba Istio se pak dá nakonfigurovat tak, aby vážila požadavek na konkrétní verzi služby. Dostupné verze služby jsou nakonfigurované tak, aby používaly subsets atribut v cílovém pravidle Istio.

Změna služby a nasazení knihkupectví pro Istio odebere potřebu explicitní druhé služby pro cíl, kterou potřebuje SMI Traffic Split. Pro službu knihkupectví v2 není třeba provádět další účet služby, protože je třeba konsolidovat v rámci služby knihkupectví. Původní úprava manifestu OSM traffic-access-v1.yaml pro Istio pro bookstore verze 1 i v2 se zobrazí v následující části Vytvoření podů, služeb a účtů služeb. Ukážeme si, jak rozdělíme provoz, označovaný jako posun provozu později v průchozím postupu:

Úpravy MySql

Změny stavové sady mysql jsou potřeba jenom v konfiguraci služby. V rámci specifikace služby osm potřebovalo atributy targetPort a appProtocol atributy. Tyto atributy nejsou pro Istio potřeba. Následující aktualizovaná služba pro mysqldb vypadá takto:

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

Nasazení upravené aplikace Bookstore

Podobně jako v návodu osm Bookstore začneme novou instalací aplikace knihkupectví.

Vytvoření oborů názvů

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

Přidání popisku oboru názvů pro injektáž Istio sidecar

Pro OSM pomocí příkazu osm namespace add <namespace> vytvořil potřebné poznámky k oboru názvů pro kontroleru OSM pro přidání automatické injektáže sajdkáru. U Istio stačí jen označit obor názvů, který umožní kontroleru Istio být instruován, aby automaticky injektoval proxy proxy sajdkáru Envoy.

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

Nasazení virtuálního pravidla a cílové služby Istio pro knihkupectví

Jak jsme zmínili dříve v části Úpravy knihkupectví, Istio zpracovává posun provozu pomocí atributu váhy služby VirtualService, který nakonfigurujeme později v návodu. Nasadíme virtuální službu a cílové pravidlo pro službu bookstore. Nasadíme pouze bookstore verze 1, i když je nasazena bookstore verze 2. Virtuální služba Istio poskytuje pouze trasu do verze 1 knihkupectví. Jiné než způsob, jakým OSM zpracovává posun provozu (rozdělení provozu), osm nasadil pro aplikaci bookstore verze 2 jinou službu. OSM potřebuje k nastavení provozu, který se má rozdělit mezi požadavky klientů pomocí TrafficSplit. Při použití posunu provozu s Istio můžeme odkazovat na přesun provozu do několika nasazení aplikací Kubernetes (verze) označených pro stejnou službu.

V tomto návodu se nasazení obou verzí knihkupectví (v1 a v2) nasadí současně. Kvůli konfiguraci virtuální služby je dostupná pouze verze 1. Není nutné nasazovat jinou službu pro bookstore verze 2. Později povolíme trasu do knihkupectví verze 2, když aktualizujeme virtuální službu knihkupectví a poskytneme potřebný atribut váhy pro přesun provozu.

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

Vytváření podů, služeb a účtů služeb

Používáme jeden soubor manifestu, který obsahuje úpravy probírané dříve v návodu k nasazení bookbuyer, bookthief, bookstore, bookwarehousea mysql aplikací.

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

Pokud chcete zobrazit tyto prostředky v clusteru, spusťte následující příkazy:

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

Zobrazení uživatelských rozhraní aplikace

Podobně jako u původního návodu OSM, pokud máte naklonované úložiště OSM, můžete využít skripty pro předávání portů k zobrazení uživatelských rozhraní jednotlivých aplikací zde. Prozatím se zajímáme pouze o zobrazení bookbuyer uživatelského rozhraní a bookthief uživatelského rozhraní.

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

V prohlížeči otevřete následující adresy URL:

http://localhost:8080 - bookbuyer

http://localhost:8083 - Bookthief

Konfigurace zásad provozu Istio

Abychom zachovali kontinuitu s původním návodem k knihkupectví OSM pro překlad do Istio, probereme režim zásad provozního provozu OSM. Režim zásad podmíněného provozu osm byl koncept povolení nebo zamítnutí provozu v síti bez nasazení konkrétního pravidla řízení přístupu k provozu SMI. Existuje konfigurace režimu provozu, která uživatelům umožňuje připojit aplikace do sítě a současně získat šifrování mTLS, aniž by bylo nutné explicitní pravidla umožňující komunikaci aplikací v síti. Funkce režimu provozu pro uživatele byla proto, aby se zabránilo narušení komunikace vaší aplikace, jakmile ji osm spravoval, a poskytla čas na definování pravidel a zároveň zajistit, aby byla komunikace aplikace šifrovaná pomocí MTLS. Toto nastavení může být nastaveno na true síť MeshConfig nebo false přes osm.

Istio zpracovává vynucení mTLS odlišně. Jiný než OSM, istio režim permissive automaticky konfiguruje proxy sajdkáru tak, aby používal mTLS, ale umožňuje službě přijímat přenosy ve formátu prostého textu i mTLS. Ekvivalentem konfigurace režimu osm je využití nastavení Istio PeerAuthentication . PeerAuthentication lze provádět podrobné kroky v oboru názvů nebo pro celou síť. Další informace o vynucení MTLS istio najdete v článku o vzájemné migraci tls istio.

Vynucení přísného režimu Istio u oborů názvů knihkupectví

Je důležité si uvědomit, že stejně jako režim permissivního režimu OSM souvisí konfigurace Istio PeerAuthentication pouze s použitím vynucení mTLS. Skutečné zásady vrstvy 7, podobně jako ty, které se používají v httpRouteGroups osm, se zpracovávají pomocí konfigurací AuthorizationPolicy istio, které se zobrazí později v návodu.

Podrobně jsme umístili bookbuyer, , bookthiefbookstorea bookwarehouse obory názvů v istio mTLS striktní režim.

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

Nasazení zásad řízení přístupu Istio

Podobně jako u prostředků SMI Traffic Target a SMI Traffic Specs definují zásady řízení přístupu a směrování, které aplikace komunikují, Istio provádí tyto podobné podrobné kontroly pomocí AuthorizationPolicy konfigurací.

Pojďme si projít překládání zásad TrafficTarget v knihkupectví, které konkrétně umožňují bookbuyer komunikaci s ní pouze s některými cestami vrstvy 7, hlavičkami a metodami. Následuje část manifestu 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

Pokud si všimnete zásad TrafficTarget, ve specifikaci můžete explicitně definovat, která zdrojová služba může komunikovat s cílovou službou. Vidíme, že umožňujeme zdroji bookbuyer , aby mohl komunikovat s cílovým knihkupectvem. Pokud přeložíme autorizaci mezi službami z konfigurace OSM TrafficTarget na Istio AuthorizationPolicy, vypadá takto:

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"]

V istio AuthorizationPolicysi všimnete, jak je cílová služba zásad OSM TrafficTarget mapována na shodu popisku selektoru a obor názvů, ve kterém se služba nachází. Zdrojová služba se zobrazuje v části pravidel, kde je atribut source/principles, který se mapuje na název účtu služby pro bookbuyer službu.

Kromě konfigurace zdroje/cíle v OSM TrafficTarget vytvoří OSM vazbu pomocí skupiny HTTPRouteGroup k dalšímu definování autorizace vrstvy 7, ke které má zdroj přístup. Můžeme vidět pouze v části skupiny HTTPRouteGroup níže. Pro povolenou zdrojovou službu existují dva 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 Existuje názevbooks-bought, který zdroji umožňuje přístup k cestě /books-bought pomocí GET metody s informacemi o uživatelském agentovi hostitele a klientské aplikaci a buy-a-book shodu, která používá výraz regulárního výrazu pro cestu obsahující .*a-book.*new metoduGET.

Tyto konfigurace HTTPRouteGroup osm můžeme definovat v části pravidel istio AuthorizationPolicy , jak je znázorněno níže:

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"]

Nyní můžeme nasadit migrovaný manifest OSM traffic-access-v1.yaml, jak je vidět níže v Istio. AuthorizationPolicy Není k dispozici kniha, takže uživatelské rozhraní bookthief by mělo přestat navyšovat knihy z knihkupectví v1:

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

Povolení přístupu k knihkupectví aplikace Bookthief

V současné době neexistuje žádná AuthorizationPolicy možnost, aby bookthief komunikovat s knihkupectví. Můžeme nasadit následující AuthorizationPolicy , abychom knihovně umožnili komunikovat s knihkupectví. Všimněte si přidání pravidla pro zásady knihkupectví, které umožňují autorizaci 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

Uživatelské rozhraní bookthief by teď mělo navýšovat knihy z knihkupectví v1.

Konfigurace posunu provozu mezi dvěma verzemi služby

Předvedení, jak vyrovnávat provoz mezi dvěma verzemi služby Kubernetes, označované jako posun provozu v Istio. Jak si vzpomínáte v předchozí části, implementace posunu provozu osm závisela na nasazení dvou různých služeb a přidání těchto názvů služeb do back-endové konfigurace TrafficTarget zásad. Tato architektura nasazení není nutná pro to, jak Istio implementuje přesouvání provozu. S istio můžeme vytvořit více nasazení, která představují každou verzi aplikace služby a přesměrovat provoz na tyto konkrétní verze prostřednictvím konfigurace Istio virtualservice .

Aktuálně nasazené virtualservice pravidlo směrování má pouze na verzi v1 knihkupectví, jak je znázorněno níže:

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

Aktualizujeme virtualservice 100 % hmotnosti na verzi v2 knihkupectví.

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

Teď byste měli vidět přírůstky bookbuyer bookthief uživatelského rozhraní pouze pro bookstore službu v2. Můžete pokračovat v experimentování změnou atributu weigth tak, aby se provoz mezi těmito dvěma bookstore verzemi přesunul.

Shrnutí

Doufáme, že tento návod poskytl nezbytné pokyny k migraci aktuálních zásad OSM na zásady Istio. Dejte si čas a projděte si vlastní příručku Začínáme pro Istio a zjistěte, jak používat síť služby Istio ke správě aplikací.