3 분 소요

istio command cli 다운로드

Istio 릴리스 페이지로 이동하여 사용 중인 OS용 설치 파일을 다운로드하거나 최신 릴리스를 자동으로 다운로드하여 압축을 풀어줍니다.(Linux 또는 macOS):

위의 명령은 Istio의 최신 릴리스(숫자)를 다운로드합니다. 명령줄에 변수를 전달하여 특정 버전을 다운로드하거나 프로세서 아키텍처를 재정의할 수 있습니다. 예를 들어 x86_64 아키텍처용 Istio 1.23.2를 다운로드하려면 다음과 같이 실행합니다:

curl -L https://istio.io/downloadIstio | sh -
  • Istio 패키지 디렉토리로 이동합니다. 예를 들어 패키지가 istio-1.23.2인 경우

  • 설치 디렉터리에는 다음이 포함됩니다:
    • samples/ 디렉터리의 샘플 애플리케이션
    • bin/ 디렉터리의 istioctl 클라이언트 바이너리.
  • 경로(path)에 istioctl 클라이언트를 추가합니다(Linux 또는 macOS):

curl -L https://istio.io/downloadIstio | sh -
# or
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.23.2 TARGET_ARCH=x86_64 sh -
cd istio-1.23.2

vi ~/.bash_profile 에 istio-1.23.2/bin을 path에 추가합니다.

export ISTIO_HOME=$HOME/istio-1.23.2
export PATH=$PATH:$ISTIO_HOME/bin

.bash_profile 을 다시 적용합니다.

source ~/.bash_profile

istio 설치

istioctl install
  • istio 설치 확인 다음의 명령어로 istio 설치를 확인합니다.
    kubectl get po -n istio-system
    
# unlabeld
kubectl label namespace default istio-injection-

# labeled 
kubectl label namespace default istio-injection=enabled

enable ingress

ingress를 enable 합니다.

minikube addons enable ingress

ingress-bookinfo.yaml 파일을 작성합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-bookinfo
spec:
  rules:
  - host: example-demo.com
    http:
      paths:
      - path: /productpage
        pathType: Prefix
        backend:
          service:
            name: productpage
            port:
              number: 9080

kubectl apply -f ingress-bookinfo.yaml

/etc/hosts에 minikube ip 등록

GATEWAY_URL=$(minikube ip)
echo $GATEWAY_URL

# /etc/hosts
192.168.49.2   example-demo.com

Deploy the sample application

Istio로 대표적인 샘플 bookinfo 애플리케이션의 전체 구성은 다음과 같습니다.

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.23/samples/bookinfo/platform/kube/bookinfo.yaml

# 또는 

cd $HOME/istio-1.23.2
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

Test sample application

kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"

ingress-bookinfo에서 생성한 ingress gateway를 통해 test

for i in {1..1000000}
do
curl -s -o /dev/null -H host:demo.mydomain.com  "http://$GATEWAY_URL/productpage"
sleep 1
done

View the dashboard

Install Kiali and the other addons

cd istio/istio-1.23.2/
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system

결과

Waiting for deployment "kiali" rollout to finish: 0 of 1 updated replicas are available...
deployment "kiali" successfully rolled out

kiali dashboard

istioctl dashboard kiali --address 0.0.0.0

자신의 VM-ServerIP:20001/kiali

예시 http://119.81.215.35:20001/kiali

Kiali dashboard에서 왼쪽 Traffic Graph을 선택하고, 중앙 화면에서 다음과 같이 선택합니다.

Namespace : default Traffic : App graph Display : Traffic Animation

traffic 발생

for i in {1..1000000}
do
curl -s -o /dev/null -H host:demo.mydomain.com  "http://$GATEWAY_URL/productpage"
sleep 1
done

istio bluegreen

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2

v2 -> v1

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1

reviews의 virtualservice에서 destination의 subset을 v2로 변경합니다.

kubectl apply -f - <<EOF
> apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
> EOF

canary 배포

Traffic Graph 메뉴를 선택하고 중앙 화면에서 Display를 선택합니다. 왼쪽 상단에 Traffic Rate를 선택합니다.

step 1 v1 버전에는 traffic 을 90%로 설정하고
v2 버전에는 traffic 을 10%로 설정합니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 90
    - destination:
        host: reviews
        subset: v2
      weight: 10

step 2 v1 버전에는 traffic 을 60%로 설정하고
v2 버전에는 traffic 을 40%로 설정합니다.

그러면 트래픽이 v2로 점점 이동하여 6:4 비율로 트래픽을 전송합니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 60
    - destination:
        host: reviews
        subset: v2
      weight: 40

step 3 v1 버전에는 traffic 을 20%로 설정하고
v2 버전에는 traffic 을 80%로 설정합니다.

그러면 트래픽이 v2로 점점 이동하여 6:4 비율로 트래픽을 전송합니다.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 20
    - destination:
        host: reviews
        subset: v2
      weight: 80

detail을 v2로 배포

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v2
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1

과제

애플리케이션

Uninstall Istio

istioctl uninstall --purge -y
kubectl delete namespace istio-system
// Service-1 with version "v1"
const express = require('express')
const app = express()
const port = 3000
const { v4 } = require('uuid');
app.get('/', (req, res) => {
  res.json({
    description: "Execution on version 1 deployment",
    version: "v1",
    uuid: v4(),
    timestamp: new Date(),
  })
})
app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})
// Service-1 with version "v2"
const express = require('express')
const app = express()
const port = 3000
const { v4 } = require('uuid');
app.get('/', (req, res) => {
  res.json({
    description: "Execution on version 2 deployment",
    version: "v2",
    uuid: v4(),
    timestamp: new Date(),
  })
})
app.listen(port, () => {
  console.log(`App listening on port ${port}`)
})

태그:

카테고리:

업데이트:

댓글남기기