Udostępnij za pośrednictwem


Wskazówki dotyczące migracji konfiguracji open Service Mesh (OSM) do istio

Ważne

Ten artykuł ma na celu zapewnienie uproszczonego zrozumienia sposobu identyfikowania konfiguracji OSM i tłumaczenia ich na równoważne konfiguracje Istio na potrzeby migrowania obciążeń z OSM do Istio. Nie jest to w żaden sposób uważane za wyczerpujący szczegółowy przewodnik.

Ten artykuł zawiera praktyczne wskazówki dotyczące mapowania zasad OSM na zasady Istio , aby ułatwić migrowanie wdrożeń mikrousług zarządzanych przez OSM do zarządzania przez Istio. Korzystamy z przykładowej aplikacji OSM Bookstore jako podstawowego odwołania dla bieżących użytkowników OSM. Poniższy przewodnik umożliwia wdrożenie aplikacji bookstore. Te same kroki są wykonywane i wyjaśniono, jak zastosować zasady ruchu OSM SMI przy użyciu odpowiednika Istio.

Jeśli nie używasz osmu i dopiero zaczynasz korzystać z rozwiązania Istio, zacznij od własnego przewodnika Wprowadzenie istio, aby dowiedzieć się, jak używać siatki usługi Istio dla aplikacji. Jeśli obecnie używasz osmu, upewnij się, że znasz przykładową aplikację osm bookstore, aby dowiedzieć się, jak OSM konfiguruje zasady ruchu. Poniższy przewodnik nie duplikuje bieżącej dokumentacji ani nie odwołuje się do określonych tematów, jeśli jest to istotne. Przed kontynuowaniem należy dobrze i w pełni znać architekturę aplikacji księgarni.

Wymagania wstępne

Modyfikacje wymagane do aplikacji przykładowej księgarni OSM

Aby umożliwić istio zarządzanie aplikacją księgarni OSM, istnieje kilka zmian wymaganych w istniejących manifestach. Te zmiany dotyczą księgarni i usług mysql.

Modyfikacje księgarni

W przewodniku OSM Bookstore usługa księgarni jest wdrażana wraz z inną usługą księgarni-v2, aby zademonstrować sposób, w jaki OSM zapewnia zmianę ruchu. Te wdrożone usługi umożliwiają podzielenie ruchu klienta (bookbuyer) między wieloma punktami końcowymi usługi. Pierwsza nowa koncepcja, aby zrozumieć, w jaki sposób Istio obsługuje to, co odnoszą się do zmiany ruchu.

Implementacja OSM przesunięcia ruchu jest oparta na specyfikacji podziału ruchu SMI. Specyfikacja podziału ruchu SMI wymaga istnienia wielu usług najwyższego poziomu, które są dodawane jako zaplecza z żądaną metrykę wagi, aby przenieść żądania klientów z jednej usługi do innej. Istio umożliwia przenoszenie ruchu przy użyciu kombinacji usługi wirtualnej i reguły docelowej. Zdecydowanie zaleca się zapoznanie się zarówno z pojęciami dotyczącymi usługi wirtualnej, jak i reguły docelowej.

Mówiąc prościej, usługa wirtualna Istio definiuje reguły routingu dla klientów, którzy żądają hosta (nazwy usługi). Usługi wirtualne umożliwiają skojarzenie wielu wersji wdrożenia z jedną nazwą hosta usługi wirtualnej dla klientów docelowych. Wiele wdrożeń można oznaczyć dla tej samej usługi, reprezentując różne wersje aplikacji za tą samą nazwą hosta. Następnie można skonfigurować usługę wirtualną Istio tak, aby odważyła żądanie do określonej wersji usługi. Dostępne wersje usługi są skonfigurowane do używania atrybutu subsets w regule docelowej Istio.

Modyfikacja wprowadzona w usłudze księgarni i wdrożeniu dla istio eliminuje konieczność posiadania jawnej drugiej usługi docelowej, której potrzebuje podział ruchu SMI. Nie ma też potrzeby innego konta usługi dla usługi księgarni w wersji 2, ponieważ ma zostać skonsolidowane w ramach usługi księgarni. Oryginalna modyfikacja manifestu OSM traffic-access-v1.yaml dla istio zarówno dla księgarni v1, jak i v2 jest wyświetlana w poniższej sekcji Tworzenie zasobników, usług i kont usług. Pokazujemy, jak dzielimy ruch, znany jako ruch przesuwający się w dalszej części przewodnika:

Modyfikacje bazy danych MySql

Zmiany w zestawie stanowym mysql są wymagane tylko w konfiguracji usługi. Zgodnie ze specyfikacją usługi osm potrzebował targetPort atrybutów i appProtocol . Te atrybuty nie są potrzebne w przypadku istio. Następująca zaktualizowana usługa dla bazy danych mysqldb wygląda następująco:

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

Wdrażanie zmodyfikowanej aplikacji księgarni

Podobnie jak w przewodniku osm bookstore, zaczynamy od nowej instalacji aplikacji księgarni.

Tworzenie przestrzeni nazw

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

Dodawanie etykiety przestrzeni nazw dla wstrzykiwania przyczepki Istio

W przypadku OSM za pomocą polecenia osm namespace add <namespace> utworzono niezbędne adnotacje do przestrzeni nazw dla kontrolera OSM w celu dodania automatycznego wstrzykiwania przyczepki. W systemie Istio wystarczy oznaczyć tylko przestrzeń nazw, aby zezwolić kontrolerowi Istio na automatyczne wstrzykiwanie serwerów proxy przyczepki usługi 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

Wdrażanie reguły istio virtual service and destination dla księgarni

Jak wspomniano wcześniej w sekcji Modyfikacja magazynu książek, Istio obsługuje ruch przesuwający się przy użyciu atrybutu wagi usługi wirtualnej, który konfigurujemy w dalszej części przewodnika. Wdrażamy regułę usługi wirtualnej i miejsca docelowego dla usługi księgarni. Wdrażamy tylko księgarnię w wersji 1, mimo że księgarnia w wersji 2 jest wdrożona. Usługa wirtualna Istio dostarcza tylko trasę do księgarni w wersji 1. Różni się od sposobu, w jaki OSM obsługuje przesuwanie ruchu (podział ruchu), OSM wdrożył inną usługę dla aplikacji księgarni w wersji 2. OSM potrzebne do skonfigurowania ruchu, który ma być podzielony między żądania klientów przy użyciu trafficSplit. W przypadku korzystania z ruchu przesuwającego się za pomocą rozwiązania Istio możemy odwoływać się do przenoszenia ruchu do wielu wdrożeń aplikacji (wersji) platformy Kubernetes oznaczonych dla tej samej usługi.

W tym przewodniku wdrażanie obu wersji księgarni (wersja 1 i wersja 2) jest wdrażane w tym samym czasie. Tylko wersja 1 jest dostępna ze względu na konfigurację usługi wirtualnej. Nie ma potrzeby wdrażania innej usługi dla księgarni w wersji 2, włączamy trasę do księgarni w wersji 2 później, gdy aktualizujemy usługę wirtualną księgarni i udostępniamy niezbędny atrybut wagi do przenoszenia ruchu.

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

Tworzenie zasobników, usług i kont usług

Używamy pojedynczego pliku manifestu zawierającego modyfikacje omówione wcześniej w przewodniku bookbuyerwdrażania aplikacji , , bookthief, bookstorebookwarehouse, i 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

Aby wyświetlić te zasoby w klastrze, uruchom następujące polecenia:

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

Wyświetlanie interfejsów użytkownika aplikacji

Podobnie jak w oryginalnym przewodniku OSM, jeśli masz sklonowane repozytorium OSM, możesz użyć skryptów przekierowywania portów, aby wyświetlić interfejsy użytkownika każdej aplikacji tutaj. Na razie martwimy się tylko o wyświetlanie interfejsu bookbuyer użytkownika i bookthief .

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

W przeglądarce otwórz następujące adresy URL:

http://localhost:8080 - bookbuyer

http://localhost:8083 - bookthief

Konfigurowanie zasad ruchu w usłudze Istio

Aby zachować ciągłość z oryginalnym przewodnikiem osm bookstore na potrzeby tłumaczenia na Istio, omawiamy permissive Traffic Policy Mode OSM. Tryb zasad ruchu permissywnego OSM był pojęciem zezwalania na ruch w siatce lub odmawiania go bez wdrożonej reguły kontroli dostępu do ruchu SMI. Konfiguracja trybu ruchu permissywnego istniała, aby umożliwić użytkownikom dołączanie aplikacji do siatki przy jednoczesnym uzyskaniu szyfrowania mTLS bez konieczności jawnego stosowania reguł zezwalania aplikacjom w siatce na komunikację. Funkcja trybu ruchu permissywnego miała na celu uniknięcie przerywania komunikacji aplikacji, gdy tylko ją zarządza osm, i zapewnienie czasu na zdefiniowanie reguł przy jednoczesnym zapewnieniu, że komunikacja aplikacji była szyfrowana za pomocą biblioteki mTLS. To ustawienie można ustawić na true lub false za pomocą narzędzia MeshConfig osmu.

Usługa Istio obsługuje wymuszanie biblioteki mTLS inaczej. Inaczej niż OSM, tryb permissywny Istio automatycznie konfiguruje serwery proxy przyczepki do używania biblioteki mTLS, ale umożliwiają usłudze akceptowanie zarówno ruchu w postaci zwykłego tekstu, jak i mTLS. Odpowiednikiem konfiguracji trybu permissywnego OSM jest użycie ustawień Istio PeerAuthentication . PeerAuthentication Można to zrobić szczegółowo w przestrzeni nazw lub dla całej siatki. Aby uzyskać więcej informacji na temat wymuszania protokołu mTLS przez istio, przeczytaj artykuł Istio Mutual TLS Migration (Migracja protokołu TLS istio).

Wymuszanie trybu ścisłego istio w przestrzeniach nazw księgarni

Ważne jest, aby pamiętać, podobnie jak tryb permissywny OSM, konfiguracja Istio PeerAuthentication jest związana tylko z użyciem wymuszania mTLS. Rzeczywiste zasady warstwy 7, podobnie jak te używane w grupach HTTPRouteGroup firmy OSM, są obsługiwane przy użyciu konfiguracji AuthorizationPolicy istio, które są widoczne w dalszej części przewodnika.

Szczegółowo umieszczamy bookbuyerprzestrzenie nazw , bookthief, bookstorei bookwarehouse w trybie ścisłym 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

Wdrażanie zasad kontroli dostępu istio

Podobnie jak zasoby SMI Traffic Target i SMI Traffic Specs firmy OSM do definiowania zasad kontroli dostępu i routingu dla aplikacji do komunikacji, Istio realizuje te podobne szczegółowe mechanizmy kontroli przy użyciu AuthorizationPolicy konfiguracji.

Przyjrzyjmy się przetłumaczeniu zasad TrafficTarget magazynu książek, które w szczególności umożliwiają bookbuyer komunikację z nią tylko z określoną ścieżką warstwy 7, nagłówkami i metodami. Poniżej znajduje się część 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

Jeśli zauważysz, że w zasadach TrafficTarget, w specyfikacji można jawnie zdefiniować, jakie usługi źródłowe mogą komunikować się z usługą docelową. Widzimy, że pozwalamy źródle bookbuyer na autoryzację do komunikowania się z docelową księgarnią. Jeśli przetłumaczymy autoryzację service-to-service z konfiguracji OSM TrafficTarget na istio AuthorizationPolicy, wygląda to następująco:

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

W usłudze Istio AuthorizationPolicyzauważysz, jak usługa docelowa zasad OSM TrafficTarget jest mapowana na etykietę selektora, a przestrzeń nazw, w której znajduje się usługa. Usługa źródłowa jest wyświetlana w sekcji reguł, w której istnieje atrybut source/principles mapujący na nazwę konta usługi dla bookbuyer usługi.

Oprócz tylko konfiguracji źródłowej/docelowej w osm TrafficTarget, OSM wiąże użycie httpRouteGroup w celu dalszego zdefiniowania autoryzacji warstwy 7, do którego źródło ma dostęp. Poniżej widać tylko część grupy HTTPRouteGroup. Istnieją dwa matches dla dozwolonej usługi źródłowej.

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 Istnieje nazwanabooks-bought, która umożliwia źródło dostępu do ścieżki /books-bought przy użyciu GET metody z nagłówkiem hosta user-agent i client-app information, oraz buy-a-book dopasowanie, które używa wyrażenia regularnego dla ścieżki zawierającej .*a-book.*new GET przy użyciu metody .

Te konfiguracje OSM HTTPRouteGroup można zdefiniować w sekcji reguł w tabeli Istio AuthorizationPolicy pokazanej poniżej:

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

Teraz możemy wdrożyć zmigrowany manifest OSM traffic-access-v1.yaml w sposób zrozumiały dla istio poniżej. Nie AuthorizationPolicy ma dla bookthief, więc bookthief UI powinien przestać zwiększać książki z księgarni 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

Zezwalanie aplikacji Bookthief na dostęp do księgarni

Obecnie nie AuthorizationPolicy ma, który pozwala bookthief komunikować się z księgarnią. Możemy wdrożyć następujące AuthorizationPolicy elementy, aby umożliwić bookthief komunikowanie się z księgarnią. Zwróć uwagę na dodanie reguły zasad księgarni, która zezwala na autoryzację 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

Interfejs użytkownika bookthief powinien teraz zwiększać książki z księgarni v1.

Konfigurowanie przenoszenia ruchu między dwiema wersjami usługi

Aby pokazać, jak równoważyć ruch między dwiema wersjami usługi Kubernetes, znanym jako przenoszenie ruchu w istio. Jak pamiętasz w poprzedniej sekcji, implementacja ruchu przesuwającego osm polegała na dwóch różnych usługach wdrażanych i dodawaniu tych nazw usług do konfiguracji zaplecza TrafficTarget zasad. Ta architektura wdrażania nie jest wymagana w celu zaimplementowania zmiany ruchu przez usługę Istio. Za pomocą rozwiązania Istio możemy utworzyć wiele wdrożeń reprezentujących każdą wersję aplikacji usługi i przenieść ruch do tych określonych wersji za pośrednictwem konfiguracji istio virtualservice .

Aktualnie wdrożony virtualservice ma tylko regułę trasy do wersji 1 księgarni pokazanej poniżej:

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

Aktualizujemy wartość virtualservice , aby przenieść 100% wagi do wersji v2 księgarni.

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

Powinny być teraz widoczne zarówno przyrosty interfejsu użytkownika, jak bookbuyer i bookthief tylko dla bookstore usługi w wersji 2. Możesz kontynuować eksperymentowanie, zmieniając atrybut, weigth aby przesunąć ruch między dwiema bookstore wersjami.

Podsumowanie

Mamy nadzieję, że ten przewodnik zawiera niezbędne wskazówki dotyczące migrowania bieżących zasad OSM do zasad Istio. Pośmiń czas i zapoznaj się z tematem Istio Concepts and walking through Istio's own Getting Started guide (Przewodnik wprowadzenie), aby dowiedzieć się, jak zarządzać aplikacjami za pomocą siatki usługi Istio.