Book info 애플리케이션 설치와 테스트

istio설치를 완료하였다면, istio 공식페이지에서 제공하는 book info 앱을 설치하고 테스트 해보자.

앱 설치 전 사전 준비

먼저 default 네임스페이스에 istio인젝션을 위한 라벨을 추가하자. 사이드카로 추가하는 것에 대한 자세한 내용은 여기를 보자.

kubectl label namespace default istio-injection=enabled --overwrite

Book Info 앱 설치하기

1. Book Info 앱 배포

이제 Book Info 앱을 배포해보자.

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

공식 페이지에서는 kubectl apply -f sample/bookinfo/platform/kube/bookinfo.yaml을 이용해서 설치하는데 bookinfo.yaml을 클릭해보면 주소가 나온다.

여기서는 이렇게 설치했다.

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

2. 외부에서 Book Info에 접속하기 위한 게이트웨이 배포

이제 앱에 접속하기 위한 게이트웨이를 배포해보자.

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/networking/bookinfo-gateway.yaml

인그레그 게이트웨이 아이피 확인하기

istio의 인그레스 게이트웨이의 아이피가 localhost이기 때문에 http://localhost/productpage로 접속해보자.

destination rule 배포

마지막으로 destination rule을 배포한다.

kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/networking/destination-rule-all.yaml

위에서 설치한 bookinfo-gateway.yaml 파일의 내부를 보면 Gateway와 VirtualService 오브젝트를 생성하는 것을 알 수 있다. gateway를 통해서 들어온 서비스가 VirautlService의 오브젝트에 명시된 규칙에 따라 쿠버네티스의 서비스로 트래픽을 보낸다.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080

destination rule 규칙을 살펴보면 각각의 서비스로 들어온 트래픽을 어떠한 파드로 보낼 것인지 라우팅 해주는 것이다.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: productpage
spec:
  host: productpage
  subsets:
  - name: v1
    labels:
      version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v2-mysql
    labels:
      version: v2-mysql
  - name: v2-mysql-vm
    labels:
      version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: details
spec:
  host: details
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---

트래픽 확인해보기

실제로 어떻게 서비스가 되는지 눈으로 살펴볼 수 있도록 kiali를 설치해보자.

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/kiali.yaml

프로메테우스가 설치되어있지 않다면 설치해보자.

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/prometheus.yaml

설치가 완료되었으면 다음 명령어를 통해 대시보드를 열자.

istioctl dashboard kiali

설치 후 트러블 슈팅

쿠버네티스 리셋버튼이 있어서 설치 및 삭제를 하다보니
istio의 gateway에 로드밸런서가 팬딩 상태에서 벗어나지 못하는 문제가 발생했다.

확인해보니 vpnkit-controoler 에서 에러가 발생한걸 확인했다.
그런데 다른데에서 443포트나 80포트를 사용하고 있지는 않은데

➜  ~ kubectl logs vpnkit-controller -n kube-system
2021/10/23 11:36:30 Starting kube-vpnkit-forwarder...
time="2021-10-23T11:37:24Z" level=error msg="Port 15021 for service istio-ingressgateway is already opened by another service"
time="2021-10-23T11:37:24Z" level=error msg="Port 80 for service istio-ingressgateway is already opened by another service"
time="2021-10-23T11:37:24Z" level=error msg="Port 443 for service istio-ingressgateway is already opened by another service"
time="2021-10-23T11:37:30Z" level=error msg="Port 15021 for service istio-ingressgateway is already opened by another service"
time="2021-10-23T11:37:30Z" level=error msg="Port 80 for service istio-ingressgateway is already opened by another service"
time="2021-10-23T11:37:30Z" level=error msg="Port 443 for service istio-ingressgateway is already opened by another service"

원인은 아직 찾지 못했지만 NodePort로 타입을 변경해보면 서비스가 되는걸 확인할 수 있다.

time="2021-10-23T11:45:32Z" level=info msg="Closed port 15021"
time="2021-10-23T11:45:32Z" level=info msg="Closed port 80"
time="2021-10-23T11:45:32Z" level=info msg="Closed port 443"
time="2021-10-23T11:45:32Z" level=info msg="Opened port 30802 for service istio-ingressgateway:15021"
time="2021-10-23T11:45:32Z" level=info msg="Opened port 30722 for service istio-ingressgateway:80"
time="2021-10-23T11:45:32Z" level=info msg="Opened port 32763 for service istio-ingressgateway:443"
➜  ~ kubectl get svc -n istio-system
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                      AGE
istio-ingressgateway   NodePort    10.98.212.10     <none>        15021:30802/TCP,80:30722/TCP,443:32763/TCP   9m
istiod                 ClusterIP   10.105.235.224   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP        9m4s

이후에 LoadBalancer 타입으로 변경하면 다시 잘 localhost로 설정된다.

좋은 웹페이지 즐겨찾기