IT/PaaS

AWS EKS에 Istio 설치 및 삭제하기 - kubernetes에 istio 설치 및 삭제

twofootdog 2020. 10. 8. 00:00

이번 글에서는 AWS EKS로 구축된 쿠버네티스 클러스터에 Istio를 설치해 볼 것이다.

istio 설치는 helm chart를 통한 설치가 아닌, 설치파일을 가지고 설치를 진행해 보겠다.

실습은 다음과 같은 순서로 진행될 것이다.
1. 사전준비

2. AWS EKS 클러스터에 Istio 설치하기

3. AWS EKS 클러스터에 Istio 삭제하기

 

1. 사전준비

이번 실습은 AWS EKS의 워커노드를 프라이빗 서브넷으로 구축한 후, EC2 인스턴스를 한개 더 생성하여 해당 인스턴스를 통해서 쿠버네티스 클러스터에 접근하 것이다. 따라서 아래와 같은 사전 준비가 되어 있어야 한다(만약 AWS EKS가 아닌 리눅스 환경에 쿠버네티스 클러스터를 구성해 놓았다면 아래와 같은 사전 준비는 필요없다)

1) AWS EKS 클러스터 설치(AWS EKS를 활용한 쿠버네티스 클러스터 구축 참고)

2) AWS EC2 생성 후 프라이빗 서브넷으로 구축된 쿠버네티스 클러스터와 연동(AWS EC2에 AWS EKS 쿠버네티스 클러스터 엑세스 권한 제공 참고)


2. AWS EKS 클러스터에 Istio 설치하기

이제 AWS EKS 쿠버네티스 클러스터에 Istio를 설치해보자.

모든 실습은 AWS EKS 와 연결되어 있는 별도의 EC2 인스턴스를 통해서 진행할 것이다(사전준비 3에서 생성한 EC2 인스턴스).

 

2-1. Istio 다운로드

1) 우선 최신버전의 Istio 설치 파일을 다운받자.

$ curl -L https://istio.io/downloadIstio | sh -

 

(만약 최신버전이 아닌 특정 버전의 Istio 설치를 원한다면 아래 명령어를 통해 다운받으면 된다)

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

 

2) 설치가 완료되었으면 설치된 디렉토리로 이동한다. 

$ cd istio-1.7.3

해당 디렉토리에서 istioctl 클라이언트 바이너리 파일은 bin/ 디렉토리에 존재하며, 실습을 위한 sample 어플리케이션은 sample/ 디렉토리에 존재한다.

 

3) 다음으로 istioctl 클라이언트를 PATH에 추가하자

$ export PATH=$PWD/bin:$PATH

 

 

2-2. Istio 설치

다음으로 Istio를 설치해보자. Istio 설치는 istioctl을 통해서 진행한다. 

$ istioctl install

위 명령어를 통해 아무런 옵션 없이 설치를 하게 되면 Istio가 기본 설정 프로파일을 통해 쿠버네티스 클러스터에 설치된다. 상용 환경에서 설치를 진행할 때는 위와 같이 기본 설정으로 설치하는 것이 좋다. 

istioctl install 명령어를 통해 설치를 하게 되면 istioctl은 기본적으로 컴파일된 차트를 사용하여 설치 매니페스를 생성하게 된다.

만약 컴파일된 차트 대신 외부 차트를 사용하려면 아래와 같이 --manifests 옵션에 참조할 디렉토리 값을 넣어주면 된다.

$ istioctl install --manifests=manifests/

 

만약 기본 Profile을 사용하지 않고, 다른 Profile을 사용하고 싶다면 Profile 옵션에 Profile 명을 지정해주면된다. 테스트를 진행할 때는 보통 demo Profile을 주로 사용한다.

$ istioctl install --set profile=demo

 

적용 가능한 Profile 리스트는 아래 명령어로 확인 가능하다.

$ istioctl profile list

 

 

2-3. Istio 설치 체크

설치가 완료되었으면 Istio가 정상적으로 설치되었는지 확인해보자.

$ kubectl get deploy -n istio-system

 

또한 isnstalled-state CR 확인을 통해서 Istio가 쿠버네티스 클러스터에 어떤 상태로 설치가 되었는지도 체크할 수도 있고, 내가 원하는 방식으로 변경할 수도 있다.

$ kubectl -n istio-system get IstioOperator installed-state -o yaml > installed-state.yaml

 

서비스도 정상적으로 수행되고 있는지 확인해보자.

$ kubectl get svc -n istio-system

서비스 중 istio-ingressgateway의 EXTERNAL-IP가 <Pending> 상태인 것을 확인할 수 있다. 

왜그럴까?

만약 istio를 일반적으로 구축된 쿠버네티스나 EKS에 설치를 했다면 Pending 상태가 아니겠지만, 이 글에서는 EKS의 워커 노드 그룹을 프라이빗 서브넷에 구축했으며 퍼블릭 서브넷에는 아무런 쿠버네티스 리소스가 올라가지 못하게 설정해 놓았다. 하지만 Ingress의 경우 퍼블릭 서브넷에 올라가야 하므로 퍼블릭 서브넷의 태그에 추가 작업을 해줘야 한다.

 

[VPC] -> [서브넷]으로 이동한 후 퍼블릭 서브넷 2개를 선택하여, [키]에는 kubernetes.io/cluster/[클러스터명] 을 입력하고 [값]에는 shared 라고 입력하자.

 

그리고 istio를 삭제해준 후 다시 설치해보자.

$ istioctl x uninstall --purge
$ istioctl install

 

그러면 istio-ingresesgateway 서비스에 EXTERNAL-IP가 정상적으로 할당된 것을 확인할 수 있다.

 

 

2-4. 샘플 서비스 배포

이제 Istio 기능 확인을 위한 샘플 서비스를 배포해보자.

샘플 애플리케이션은 sample/ 디렉토리 밑에 존재한다.

하지만 배포 전 샘플 애플리케이션이 배포되는 default namespace에 라벨 값을 변경해줘야 한다(istio-injection=enabled)

만약 라벨 값을 변경해주지 않으면 애플리케이션들이 배포되어도 pod에 Envoy Proxy 가 사이드카 패턴으로 적용되지 않기 때문이다.

$ kubectl label namespace default istio-injection=enabled

 

라벨 변경이 완료되었으면 sample 애플리케이션을 배포해보자.

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

 

배포가 완료되었으면 pod 가 배포된 것을 확인해보자.

각 pod는 Envoy Proxy가 사이드카 패턴으로 추가되어 Ready에 2/2로 되어 있는 것을 확인할 수 있다.

$ kubectl get pod --all-namespaces
NAMESPACE      NAME                                   READY   STATUS    RESTARTS   AGE
default        details-v1-5974b67c8-lrxk7             2/2     Running   0          41s
default        productpage-v1-64794f5db4-v2xql        2/2     Running   0          40s
default        ratings-v1-c6cdf8d98-4qq5c             2/2     Running   0          40s
default        reviews-v1-7f6558b974-bzbpd            2/2     Running   0          41s
default        reviews-v2-6cb6ccd848-bhg4b            2/2     Running   0          41s
default        reviews-v3-cc56b578-544sz              2/2     Running   0          41s
istio-system   istio-ingressgateway-5689f7c67-sw6vz   1/1     Running   0          15m
istio-system   istiod-5c6b7b5b8f-vxqmm                1/1     Running   0          15m
kube-system    aws-node-2nmdj                         1/1     Running   0          5h24m
kube-system    aws-node-hf7hl                         1/1     Running   0          5h24m
kube-system    coredns-7dd7f84d9-ffcb8                1/1     Running   0          5h36m
kube-system    coredns-7dd7f84d9-gh24t                1/1     Running   0          5h36m
kube-system    kube-proxy-9svhl                       1/1     Running   0          5h24m
kube-system    kube-proxy-ddg48                       1/1     Running   0          5h24m

 

하지만 배포된 애플리케이션들은 외부에서 접속을 할 수 없다. 왜냐하면 ingress가 배포되지 않았기 때문에 URL을 찾아갈 수 없기 때문이다.

다음으로 istio gateway도 배포해보자.

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

 

istio gateway 파일을 확인해보면 /productpage로 접속하면 productpage라는 서비스를 호출하는 것으로 보인다. 

 

그럼 이제 웹페이지에서 productpage로 접근해보자.

접근하는 URL은 [istio-ingressgateway의 EXTERNAL-IP]/productPage 로 접근하면 된다.

 

 


3. AWS EKS 클러스터에 Istio 삭제하기

만약 Istio를 완벽하게 삭제하고 싶다면(Istio의 모든 리소스를 삭제하고 싶다면) 아래와 같이 명령어를 수행하면 된다.

$ istioctl x uninstall --purge

 

또한 배포된 sample 애플리케이션 및 istio-gateway를 삭제하려면 아래와 같이 명령어를 수행하면 된다.

$ kubectl delete -f samples/bookinfo/networking/bookinfo-gateway.yaml #istio gateway 삭제
$ kubectl delete -f samples/bookinfo/platform/kube/bookinfo.yaml #istio sample application 삭제

 


참고

istio.io/latest/docs/

 

Docs

Learn how to deploy, use, and operate Istio.

istio.io