Istio로 OSM(Open Service Mesh) 구성 마이그레이션 지침
Important
이 문서는 OSM 구성을 식별하고 OSM에서 Istio로 워크로드 마이그레이션 시 상응하는 Istio 구성으로 변환하는 방법을 간략하게 이해시키는 데 목표를 두고 있습니다. 이는 절대 완전히 상세한 세부 가이드로 간주되지 않습니다.
이 문서는 OSM에서 관리하는 마이크로 서비스 배포를 Istio에서 관리하도록 마이그레이션하는 데 도움을 주기 위해 OSM 정책을 Istio 정책으로 매핑하는 일에 관한 실용적인 지침을 제공합니다. OSM Bookstore 샘플 애플리케이션을 현재 OSM 사용자의 기본 참고자료로 활용합니다. 다음 연습에서는 Bookstore 애플리케이션을 배포합니다. 동일한 단계를 수행하고 그에 상응하는 Istio를 사용하여 OSM SMI 트래픽 정책을 적용하는 방법을 설명합니다.
OSM을 사용하고 있지 않고 Istio를 처음 사용한다면, Istio의 자체 시작 가이드로 시작하여 애플리케이션에서 Istio 서비스 메시를 사용하는 방법을 알아봅니다. 현재 OSM을 사용하고 있다면, OSM에서 트래픽 정책을 구성하는 방법에 대한 OSM Bookstore 샘플 애플리케이션 연습 과정을 익히도록 합니다. 다음 연습에서는 현재 설명서를 복제하지 않고 관련 있는 경우 특정 토픽을 참조합니다. 계속하기 전에 Bookstore 애플리케이션 아키텍처를 충분히 숙지해야 합니다.
필수 구성 요소
- Azure 구독 Azure 구독이 없는 경우 무료 계정을 만들 수 있습니다.
- Azure CLI 설치
- OSM AKS 추가 항목을 AKS 클러스터에서 제거
- 네임스페이스를 포함한 기존 OSM Bookstore 애플리케이션을 클러스터에서 제거 및 삭제
- Istio AKS 서비스 메시 추가 항목 설치
OSM 샘플 Bookstore 애플리케이션에 필요한 수정
Istio에서 OSM Bookstore 애플리케이션을 관리하도록 하려면 기존 매니페스트에서 몇 가지 사항을 변경해야 합니다. 이러한 변경 사항은 Bookstore 및 mysql 서비스에 적용됩니다.
Bookstore 수정
OSM Bookstore 연습의 Bookstore 서비스는 OSM이 트래픽을 어떻게 이동시키지 보여 주는 다른 bookstore-v2 서비스와 함께 배포됩니다. 배포된 이 서비스를 사용하면 클라이언트(bookbuyer
) 트래픽을 여러 서비스 엔드포인트 간에 분할할 수 있습니다. Istio가 트래픽 이동이라는 항목의 처리 방법을 이해하기 위한 첫 번째 새로운 개념입니다.
OSM에서 트래픽 이동을 구현할 때 SMI 트래픽 분할 사양을 기준으로 합니다. SMI 트래픽 분할 사양을 사용하려면 한 서비스의 클라이언트 요청을 다른 서비스로 이동하기 위해 원하는 가중치 메트릭을 사용하여 백 엔드로 추가되는 최상위 서비스가 다수 필요합니다. Istio는 가상 서비스와 대상 규칙을 조합하여 트래픽을 이동합니다. 가상 서비스와 대상 규칙의 개념을 모두 숙지하는 것이 좋습니다.
간단히 말해 Istio 가상 서비스는 호스트(서비스 이름)를 요청하는 클라이언트에 대한 회람 규칙을 정의합니다. 가상 서비스를 사용하면 클라이언트가 대상으로 지정할 하나의 가상 서비스 호스트 이름에 여러 버전의 배포를 연결할 수 있습니다. 여러 배포에 동일한 서비스의 레이블을 지정할 수 있는데, 이는 동일한 호스트 이름 뒤에 있는 다양한 버전의 애플리케이션을 나타냅니다. 그런 다음 특정 버전의 서비스 요청에 가중치를 부여하도록 Istio 가상 서비스를 구성할 수 있습니다. 사용 가능한 버전의 서비스는 Istio 대상 규칙에서 subsets
특성을 사용하도록 구성됩니다.
Istio용 Bookstore 서비스와 배포를 수정함에 따라 SMI 트래픽 분할에 필요한 명시적인 두 번째 서비스를 대상으로 지정할 필요가 없어졌습니다. Bookstore 서비스로 통합되기 때문에 Bookstore v2 서비스에 다른 서비스가 필요하지도 않습니다. Istio와 관련해 Bookstore v1과 v2에서 모두 수정된 원래 OSM traffic-access-v1.yaml 매니페스트 변경 사항은 아래 Pod, 서비스 및 서비스 계정 만들기 섹션에 나와 있습니다. 연습의 뒷부분에서는 트래픽 이동이라고 하는 트래픽 분할 방법을 설명합니다.
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
수정된 Bookstore 애플리케이션 배포
OSM Bookstore 연습과 마찬가지로, Bookstore 애플리케이션을 새로 설치하는 것부터 시작합니다.
네임스페이스 만들기
kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse
Istio 사이드카 삽입 시 네임스페이스 레이블 추가
OSM은 osm namespace add <namespace>
명령을 사용하여 OSM 컨트롤러가 자동 사이드카 삽입을 추가하는 데 필요한 주석을 네임스페이스에 만들었습니다. Istio를 사용하면 Istio 컨트롤러가 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
Bookstore에 대한 Istio Virtual Service 및 대상 규칙 배포
Bookstore 수정 섹션의 앞부분에서 설명한 바와 같이, Istio는 연습의 뒷부분에서 구성하는 VirtualService 가중치 특성을 활용하여 트래픽 이동을 처리합니다. Bookstore 서비스에 대한 가상 서비스 및 대상 규칙을 배포합니다. Bookstore 버전 2가 배포되었다 해도 Bookstore 버전 1만 배포합니다. Istio 가상 서비스는 Bookstore 버전 1의 경로만 제공합니다. OSM에서 트래픽 이동(트래픽 분할)을 처리하는 방법과 달리, OSM은 Bookstore 버전 2 애플리케이션에 다른 서비스를 배포했습니다. OSM은 TrafficSplit을 사용하여 클라이언트 요청 간에 트래픽이 분할되도록 설정하는 데 필요했습니다. Istio에서 트래픽 이동을 사용하는 경우, 동일한 서비스에 레이블이 지정된 여러 Kubernetes 애플리케이션 배포(버전)로 이동하는 트래픽을 참조할 수 있습니다.
이 연습에서는 두 Bookstore 버전(v1, v2)이 동시에 배포됩니다. 가상 서비스 구성으로 인해 버전 1만 연결할 수 있습니다. Bookstore 버전 2에 다른 서비스를 배포할 필요는 없습니다. 나중에 Bookstore 가상 서비스를 업데이트하고 트래픽을 이동하는 데 필요한 가중치 특성을 제공할 때 Bookstore 버전 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
Pod, 서비스 및 서비스 계정 만들기
연습의 앞부분에서 설명한 수정 내용이 포함된 단일 매니페스트 파일을 사용하여 bookbuyer
, bookthief
, bookstore
, bookwarehouse
, 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
애플리케이션 UI 보기
원래 OSM 연습과 마찬가지로 OSM 리포지토리를 복제한 경우 포트 전달 스크립트를 활용하여 여기에서 각 애플리케이션 UI를 볼 수 있습니다. 지금은 bookbuyer
및 bookthief
UI를 보는 데에만 관련 있습니다.
cp .env.example .env
bash <<EOF
./scripts/port-forward-bookbuyer-ui.sh &
./scripts/port-forward-bookthief-ui.sh &
wait
EOF
브라우저에서 다음 URL을 엽니다.
http://localhost:8080 - bookbuyer
http://localhost:8083 - bookthief
Istio의 트래픽 정책 구성
Istio로 변환하기 위한 원래 OSM Bookstore 연습과의 연속성을 유지하기 위해 OSM의 허용 트래픽 정책 모드에 대해 설명합니다. OSM의 허용 트래픽 정책 모드는 특정 SMI 트래픽 Access Control 규칙이 배포되지 않은 메시에서 트래픽을 허용하거나 거부하는 개념이었습니다. 허용 트래픽 모드 구성은 메시의 애플리케이션에서 통신하도록 허용하는 명시적인 규칙 없이도 mTLS 암호화를 획득하는 동시에 사용자가 애플리케이션을 메시에 온보딩하도록 허용하기 위해 존재했습니다. 허용 트래픽 모드 기능은 OSM이 관리하는 즉시 애플리케이션의 통신이 중단되는 것을 방지하고, 애플리케이션 통신이 mTLS 암호화되었는지 확인하면서 규칙을 정의하는 시간을 제공하는 것이었습니다. 이 설정은 OSM의 MeshConfig를 통해 true
또는 false
로 설정할 수 있습니다.
Istio는 mTLS 적용을 다르게 처리합니다. OSM과 달리 Istio의 허용 모드는 mTLS를 사용하도록 사이드카 프록시를 자동으로 구성하지만, 서비스가 일반 텍스트 트래픽과 mTLS 트래픽을 모두 허용하도록 합니다. OSM의 허용 모드 구성에 상응하는 기능은 Istio의 PeerAuthentication
설정을 활용하는 것입니다. PeerAuthentication
은 네임스페이스 또는 전체 메시에서 세분화하여 수행할 수 있습니다. Istio의 mTLS 적용에 대한 자세한 내용은 Istio 상호 TLS 마이그레이션 문서를 참조하세요.
Bookstore 네임스페이스에 Istio strict 모드 적용
OSM의 허용 모드와 마찬가지로 Istio의 PeerAuthentication
구성은 mTLS 적용을 사용하는 데에만 관련 있다는 사실을 기억해야 합니다. OSM의 HTTPRouteGroups에 사용되는 것과 마찬가지로 실제 계층 7 정책은 연습의 뒷부분에 나와 있는 Istio의 AuthorizationPolicy 구성을 사용하여 처리됩니다.
Istio의 mTLS strict 모드에서 bookbuyer
, bookthief
, bookstore
, bookwarehouse
네임스페이스를 세분화하여 배치합니다.
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 Access Control 정책 배포
애플리케이션이 통신할 수 있도록 액세스 제어/라우팅 정책을 정의하는 OSM의 SMI 트래픽 대상 및 SMI 트래픽 사양 리소스와 마찬가지로, Istio는 AuthorizationPolicy
구성을 사용하여 이와 유사하게 세분화된 컨트롤을 수행합니다.
특히 bookbuyer
가 특정 계층 7 경로, 헤더, 메서드만 사용하여 통신할 수 있도록 하는 Bookstore TrafficTarget 정책을 변환하는 방법을 살펴보겠습니다. 다음은 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
가 대상 Bookstore과의 통신 권한을 부여하도록 허용함을 볼 수 있습니다. 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
원본이 호스트 헤더 사용자 에이전트 및 클라이언트 앱 정보가 포함된 GET
메서드와 함께 /books-bought
경로에 액세스하도록 허용하는 books-bought
라는 match
항목과 GET
메서드를 사용하여 .*a-book.*new
를 포함하는 경로에 정규식 표현을 사용하는 buy-a-book
일치 항목이 있습니다.
아래에 나와 있는 Istio AuthorizationPolicy
의 규칙 섹션에서 이러한 OSM HTTPRouteGroup 구성을 정의할 수 있습니다.
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"]
이제 아래 Istio에서 이해한 대로 OSM 마이그레이션 traffic-access-v1.yaml 매니페스트를 배포할 수 있습니다. Bookthief에 대한 AuthorizationPolicy
가 없으므로 Bookthief UI는 Bookstore 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
Bookthief 애플리케이션이 Bookstore에 액세스하도록 허용
현재 Bookthief가 Bookstore와 통신하도록 허용하는 AuthorizationPolicy
는 없습니다. 다음 AuthorizationPolicy
를 배포하면 Bookthief가 Bookstore와 통신하도록 허용할 수 있습니다. Bookthief 권한 부여를 허용하는 Bookstore 정책 규칙이 추가된 것을 확인할 수 있습니다.
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 UI는 Bookstore v1에서 책을 증분시켜야 합니다.
두 서비스 버전 간의 트래픽 이동 구성
두 가지 버전의 Kubernetes 서비스 간에 트래픽을 분산(Istio에서는 트래픽 이동이라고 함)하는 방법을 보여 줍니다. 이전 섹션에서 설명한 바와 같이, OSM에서 트래픽 이동을 구현할 때 배포되는 두 가지 고유 서비스를 사용하며 해당 서비스 이름을 TrafficTarget
정책의 백 엔드 구성에 추가합니다. Istio에서 트래픽 이동을 구현하는 방법에는 이 배포 아키텍처가 필요하지 않습니다. Istio를 사용하면 서비스 애플리케이션의 각 버전을 나타내는 여러 배포를 만들 수 있고, Istio virtualservice
구성을 통해 해당 특정 버전으로 트래픽을 이동할 수 있습니다.
현재 배포된 virtualservice
에는 아래에 표시된 Bookstore v1 버전의 경로 규칙만 있습니다.
spec:
hosts:
- bookstore
http:
- route:
- destination:
host: bookstore
subset: v1
Bookstore의 v2 버전으로 가중치를 100% 이동하도록 virtualservice
를 업데이트합니다.
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
이제 bookstore
v2 서비스에 한해 bookbuyer
및 bookthief
UI가 모두 증분하는 것을 볼 수 있습니다. weigth
특성을 변경해 두 bookstore
버전 간에 트래픽을 이동함으로써 실험을 계속할 수 있습니다.
요약
이 연습이 현재 OSM 정책을 Istio 정책으로 마이그레이션하는 방법에 필요한 참고 자료를 제공했기를 바랍니다. 시간을 내 Istio 개념과 Istio의 고유한 시작 가이드를 검토하여 Istio 서비스 메시를 사용해 애플리케이션을 관리하는 방법을 알아보세요.
Azure Kubernetes Service