Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 OSM i dopiero zaczynasz korzystać z własnego przewodnika 'Getting Started' Istio, aby dowiedzieć się, jak używać usługi siatki Istio dla swoich aplikacji. Jeśli obecnie używasz OSM, upewnij się, że znasz przykład aplikacji Bookstore, aby dowiedzieć się, jak OSM konfiguruje polityki ruchu. Poniższy przewodnik nie duplikuje obecnej dokumentacji i odnosi się do określonych tematów, gdy jest to istotne. Przed kontynuowaniem należy dobrze i w pełni znać architekturę aplikacji księgarni.
Wymagania wstępne
- Subskrypcja platformy Azure. Jeśli nie masz subskrypcji Azure, możesz utworzyć bezpłatne konto Azure.
- Zainstalowany interfejs wiersza polecenia platformy Azure.
- Dodatek OSM AKS został odinstalowany z klastra usługi AKS
- Każda istniejąca aplikacja księgarni OSM, w tym przestrzenie nazw, zostaje odinstalowana i usunięta z klastra.
- Zainstaluj dodatek siatki serwisowej Istio AKS
Modyfikacje wymagane do aplikacji przykładowej księgarni OSM
Aby umożliwić Istio zarządzanie aplikacją księgarni OSM, konieczne jest wprowadzenie kilku zmian w istniejących manifestach. Te zmiany dotyczą księgarni i usług mysql.
Modyfikacje księgarni
W przeglądzie OSM Bookstore usługa księgarni jest wdrażana wraz z inną usługą księgarni-v2, aby zademonstrować sposób, w jaki OSM umożliwia przekierowanie ruchu. Te wdrożone usługi umożliwiają podzielenie ruchu klienta (bookbuyer
) między wieloma punktami końcowymi usługi. Pierwszą nową koncepcją jest zrozumienie, w jaki sposób Istio obsługuje to, co nazywają zmianą ruchu.
Implementacja OSM przekierowania ruchu jest oparta na specyfikacji SMI dotyczącej podziału ruchu. Specyfikacja podziału ruchu SMI wymaga istnienia wielu usług najwyższego poziomu, które są dodawane jako zaplecza z żądaną metryką wagi, aby przekierowywać żądania klientów z jednej usługi na inną. 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 nadać wagę żądaniom 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 pokazana w poniższej sekcji Utwórz Pods, usługi i konta usług. Pokazujemy, jak dzielimy ruch, znany jako przesunięcie ruchu w dalszej części instrukcji.
Modyfikacje bazy danych MySql
Zmiany w zestawie stanowym mysql są wymagane tylko w konfiguracji usługi. Zgodnie ze specyfikacją usługi OSM potrzebował atrybutów targetPort
oraz 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 prezentacji 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
Dodaj etykietę przestrzeni nazw dla wstrzykiwania sidecaru 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ć przestrzeń nazw, aby kontroler Istio automatycznie wstrzyknął serwery proxy Envoy typu 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
Wdrażanie usługi wirtualnej i reguły kierowania dla Istio w księgarni
Jak wspomniano wcześniej w sekcji Modyfikacja księgarni, Istio obsługuje przesuwanie ruchu przy użyciu atrybutu 'weight' w VirtualService, który konfigurujemy w dalszej części przewodnika. Wdrażamy usługę wirtualną i regułę miejsc docelowych 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 musiało skonfigurować ruch, aby był podzielony między żądania klientów za pomocą 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, który zawiera modyfikacje omówione wcześniej podczas szczegółowego opisu, aby wdrażać aplikacje: bookbuyer
, bookthief
, bookstore
, bookwarehouse
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 zależy nam tylko na obejrzeniu interfejsu użytkownika bookbuyer
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 - kupujący książki
http://localhost:8083 - złodziej książek
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. Permisywna polityka ruchu OSM była pojęciem pozwalania lub blokowania ruchu w sieci 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 OSM zarządzał tym, zapewniając czas na zdefiniowanie reguł, jednocześnie zapewniając, że komunikacja aplikacji była szyfrowana za pomocą mTLS. To ustawienie można ustawić na true
lub false
za pomocą narzędzia MeshConfig OSM.
Istio obsługuje wymuszanie mTLS w inny sposób. Inaczej niż OSM, tryb permisywny Istio automatycznie konfiguruje proxy sidecar do używania mTLS, ale pozwala usłudze akceptować zarówno ruch plaintext, jak i mTLS. Odpowiednikiem konfiguracji trybu permisywnego OSM jest korzystanie z ustawień Istio PeerAuthentication
.
PeerAuthentication
Można to zrobić szczegółowo na poziomie 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 rygorystycznego Istio w przestrzeniach nazw aplikacji Księgarnia
Ważne jest, aby pamiętać, że podobnie jak tryb permissywny OSM, konfiguracja Istio PeerAuthentication
dotyczy jedynie użycia wymuszania mTLS. Rzeczywiste zasady warstwy 7, podobnie jak te używane w grupach HTTPRouteGroup OSM, są obsługiwane przy użyciu konfiguracji AuthorizationPolicy Istio, które są widoczne w dalszej części tego przewodnika.
Szczegółowo umieszczamy przestrzenie nazw bookbuyer
, bookthief
, bookstore
i 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 polityki kontroli dostępu Istio
Podobnie jak zasoby SMI Traffic TargetAuthorizationPolicy
konfiguracji.
Przyjrzyjmy się przetłumaczeniu zasad TrafficTarget księgarni, które w szczególności umożliwiają bookbuyer
komunikowanie się z nią tylko za pomocą określonych ścieżek, nagłówków i metod warstwy 7. 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ć, jaka usługa źródłowa może 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 konfigurację 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 AuthorizationPolicy
Istio zauważysz, jak usługa docelowa polityki OSM TrafficTarget jest mapowana na etykietę selektora i przestrzeń nazw, w której się znajduje. Usługa źródłowa jest wyświetlana w sekcji reguł, gdzie dostępny jest atrybut source/principles przypisany do nazwy konta usługi dla bookbuyer
usługi.
Oprócz samej konfiguracji źródłowej/docelowej w OSM TrafficTarget, OSM wykorzystuje HTTPRouteGroup, aby dodatkowo określić autoryzację warstwy 7, do której ź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 books-bought
, która umożliwia źródło dostępu do ścieżki /books-bought
przy użyciu metody GET
z nagłówkiem hosta, informacji user-agent i klient-aplikacja, oraz dopasowania buy-a-book
, które używa wyrażenia regularnego dla ścieżki zawierającej .*a-book.*new
przy użyciu metody GET
.
Te konfiguracje OSM HTTPRouteGroup można zdefiniować w sekcji reguł 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, jak poniżej. Nie ma AuthorizationPolicy
dla złodzieja książek, więc interfejs użytkownika złodzieja książek nie powinien zwiększać liczby książek 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 ma AuthorizationPolicy
, który pozwalałby złodziejowi książek komunikować się z księgarnią. Możemy wdrożyć następujące AuthorizationPolicy
, aby umożliwić złodziejowi książek komunikowanie się z księgarnią. Zauważasz dodatek do zasad księgarni, który zezwala na autoryzację złodzieja książek.
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 inkrementować liczbę książek z księgarni w wersji v1.
Konfigurowanie przenoszenia ruchu między dwiema wersjami usługi
Aby pokazać, jak równoważyć ruch między dwiema wersjami usługi Kubernetes, co w Istio nazywa się przenoszeniem ruchu. Jak pamiętasz z poprzedniej sekcji, implementacja przesunięcia ruchu przez OSM opierała się na wdrożeniu dwóch różnych usług oraz dodawaniu ich nazw do konfiguracji zaplecza polityki TrafficTarget
. 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 v1 księgarni pokazanej poniżej.
spec:
hosts:
- bookstore
http:
- route:
- destination:
host: bookstore
subset: v1
Aktualizujemy element 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
Teraz powinna być widoczna inkrementacja zarówno w bookbuyer
i bookthief
interfejsie użytkownika, ale tylko dla usługi bookstore
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święć czas i zapoznaj się z tematem Istio Concepts i przejdź przez własny przewodnik wprowadzający Istio, aby dowiedzieć się, jak zarządzać aplikacjami za pomocą siatki usług Istio.
Azure Kubernetes Service