본문 바로가기
Software Architecture/Service Mesh

[Istio] istioctl 로 쿠버네티스 클러스터에 istio 설치하기

by wrynn 2022. 3. 2.

 안녕하세요. 이 글에서는 istioctl을 사용해서 쿠버네티스 클러스터에 istio를 설치해 보겠습니다. istio는 여러가지 방법으로 설치할 수 있는데요, 추가 설치 방법에 대해서는 Which installation method should I use? 문서를 참고해 보시기 바랍니다. 본문에서 이어지는 설치 프로세스는 Istio / Getting Started 문서를 참고하여 작성되었습니다. 설치 전에 쿠버네티스 클러스터가 준비되어 있어야 하고, 아래 내용은 쿠버네티스 API 서버에 접근 가능한 Linux 호스트에서 진행해야 합니다. 쿠버네티스 설치 과정은 여기에서 확인하실 수 있습니다.


Download Istio

 먼저 istio 설치 파일을 다운로드합니다. 다음과 같이 최신 istio 릴리즈 파일을 다운로드할 수 있습니다. ISTIO_VERSION 에 특정 버전을 명시하여 다운로드할 수도 있습니다. 특정 쿠버네티스 클러스터의 버전과 호환 가능한 istio 버전은 Istio / Supported Releases 문서에서 확인할 수 있습니다.

$ curl -L https://istio.io/downloadIstio | sh -
$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.13.1 TARGET_ARCH=x86_64 sh -

 그 다음 istioctl 바이너리 파일을 편히 사용하기 위해 PATH에 추가해줍니다.

$ cd istio-1.13.1
$ export PATH=$PWD/bin:$PATH

 

Install Istio

 istio를 본격적으로 설치하기 전에, 클러스터가 설치 가능한 상태인지를 istioctl x precheck 명령으로 점검할 수 있습니다. 실행 결과가 아래와 같이 나타난다면 클러스터에 문제가 없고 설치를 진행할 수 있습니다.

$ istioctl x precheck
✔ No issues found when checking the cluster. Istio is safe to install or upgrade!
  To get started, check out https://istio.io/latest/docs/setup/getting-started/

 istio를 설치할 때에는 프로파일을 사용할 수 있습니다. 여기서는 demo 프로파일을 이용하여 설치하겠습니다. 프로파일에 대한 자세한 내용은 Istio / Installation configuration 문서에서 확인할 수 있습니다. 성공적으로 설치한다면 터미널에서 아래와 같은 콘솔 출력을 확인할 수 있습니다.

$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete

 설치가 완료되었습니다!

 

Deploy the sample application

 이제 istio의 여러 기능을 실습해볼 수 있는 bookinfo application을 배포해보겠습니다. 우선 default 네임스페이스에서  새로 생성되는 Pod에 자동으로 proxy 컨테이너를 주입하도록 네임스페이스에 sidecar injection 설정을 합니다. 

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

 그 다음 istio 설치 경로 아래에 존재하는 sample manifest 파일을 활용하여 bookinfo application을 배포합니다. 

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

 배포가 완료된 이후 kubectl get 명령을 통해 Pod의 READY 상태가 모두 2/2 로 표시되는지 확인합니다. sidecar injection 설정에 의해 서비스 컨테이너 외에 Envoy proxy 컨테이너가 더해져 1개의 Pod당 2개의 컨테이너가 준비된 것을 확인할 수 있습니다. 이 단계에서 만약 READY 상태가 1/1 로 표시된다면 bookinfo application이 배포된 네임스페이스에 sidecar injection 설정이 제대로 이루어지지 않은 것입니다.

$ kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-558b8b4b76-2llld       2/2     Running   0          2m41s
productpage-v1-6987489c74-lpkgl   2/2     Running   0          2m40s
ratings-v1-7dc98c7588-vzftc       2/2     Running   0          2m41s
reviews-v1-7f99cc4496-gdxfn       2/2     Running   0          2m41s
reviews-v2-7d79d5bd5d-8zzqd       2/2     Running   0          2m41s
reviews-v3-7dbcdcbc56-m8dph       2/2     Running   0          2m41s

 모든 Pod가 준비 상태가 되면 ratings 컨테이너 내에서 curl 명령어를 통해 productpage를 호출해봅니다. 아래와 같이 나타난다면 정상적으로 호출이 이루어진 것입니다.

$ 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>"
<title>Simple Bookstore App</title>

 각 Pod에 proxy 컨테이너가 주입된 후 bookinfo application의 구성은 아래와 같습니다. 맨 앞단에서의 사용자 요청을 수신하는 Ingress Envoy(istio-system 네임스페이스의 istio-ingressgateway Pod)가 있고 그 뒤로 각각의 microservice가 위치해 있습니다.

 

Open the application to outside traffic

 하지만 아직까지는 외부 사용자 요청을 받을 수 없는 상태입니다. 트래픽은 Ingress Envoy Pod까지 도착하지만, 이 Pod는 트래픽을 Product page로 보내야 할 지, Review로 보내 처리해야 할 지 알 수 없는 상황입니다. 이제부터 이 Pod에게 트래픽을 어떻게 보내야하는지 알려주겠습니다. 아래와 같이 istio CRD(Custom Resource Definition)인 Gateway 및 Virtual Service를 구성합니다.

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

 구성이 잘 되었고 특별한 이슈가 없는지 확인해봅니다.

$ istioctl analyze
✔ No validation issues found when analyzing namespace: default.

 

Determining the ingress IP and ports

 구성이 끝났으니 이제 직접 브라우저를 통해 요청을 보내보겠습니다. 저는 AWS EC2에 쿠버네티스를 설치했으므로 INGRESS_HOST에 ELB 주소가 저장됩니다.  

$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

 echo 명령을 통해 올바르게 Gateway 주소 정보를 불러왔는지 확인합니다. 여기서 나타나는 주소는 할당받은 ELB 주소에 따라 다르게 나타납니다.

$ echo $GATEWAY_URL
adb23bfaaeed412bbcc0011ec29fa0b-1307710956.ap-northeast-2.elb.amazonaws.com:80

 주소 정보가 제대로 구성되었다면 /productpage 페이지를 웹 브라우저에서 호출해 실제로 접속이 가능한지 확인합니다.

$ export BOOKINFO_URL=$GATEWAY_URL:"/productpage"
$ echo $BOOKINFO_URL
adb23bfaaeed412bbcc0011ec29fa0b-1307710956.ap-northeast-2.elb.amazonaws.com:80:/productpage

 자, 여러분은 istio 설정을 통해 bookinfo application의 productpage를 호출하는데 성공하였습니다! 다음 글에서는 대표적인 몇가지 istio CRD를 살펴보고 이를 활용해 istio의 모니터링 도구들인 prometheus, kiali, grafana에 접속이 가능하도록 구성해보겠습니다.


Remove sample application

 아래 내용은 실습을 하면서 생성한 자원을 삭제하는 절차를 보여줍니다. 라우팅 규칙과 관련된 CRD를 포함하여 bookinfo application을 클러스터에서 삭제합니다.

$ samples/bookinfo/platform/kube/cleanup.sh

 아무런 리소스도 남아있지 않는지 확인합니다.

kubectl get virtualservices   #-- there should be no virtual services
kubectl get destinationrules  #-- there should be no destination rules
kubectl get gateway           #-- there should be no gateway
kubectl get pods              #-- the Bookinfo pods should be deleted

 

References

 

Getting Started

Try Istio’s features quickly and easily.

istio.io

 

'Software Architecture > Service Mesh' 카테고리의 다른 글

[Istio] Automatic Sidecar Injection  (0) 2022.04.08

댓글