다음을 통해 공유


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 애플리케이션 아키텍처를 충분히 숙지해야 합니다.

필수 구성 요소

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에는 targetPortappProtocol 특성이 필요했습니다. 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를 볼 수 있습니다. 지금은 bookbuyerbookthief 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 서비스에 한해 bookbuyerbookthief UI가 모두 증분하는 것을 볼 수 있습니다. weigth 특성을 변경해 두 bookstore 버전 간에 트래픽을 이동함으로써 실험을 계속할 수 있습니다.

요약

이 연습이 현재 OSM 정책을 Istio 정책으로 마이그레이션하는 방법에 필요한 참고 자료를 제공했기를 바랍니다. 시간을 내 Istio 개념Istio의 고유한 시작 가이드를 검토하여 Istio 서비스 메시를 사용해 애플리케이션을 관리하는 방법을 알아보세요.