쿠버네티스 Istio 네트워크 메시 환경 모니터링
https://istio.io/docs/concepts/what-is-istio/
1. Istio는 무엇인가?
쿠버네티스는 도커를 편리하게 컨트롤할 수 있게 하고 다양한 이점을 제공한다
그러나 다수의 컨테이너가 동작하는 경우에는 각 컨테이너의 트래픽을 관찰하고 정상 동작하는지 모니터링하기가 어렵기 때문에 DevOps 팀에 부담이 될 수 있다
개발자는 이식성을 위해 마이크로서비스를 사용하여 아키텍처를 설계하고 운영자는 이 컨테이너들을 다양한 클러스터에 배포하고 관리한다
서비스 메시의 크기와 복잡성이 커짐에 따라 이해하고 관리하기가 더 어려워진다(예: 로드 밸런싱, 장애 복구, 메트릭 및 모니터링)
Istio는 이런 쿠버네티스 환경의 네트워크 메시 이슈를 보다 간편하게 해결하기 위해 지원하는 환경이다
서비스 메시란?
응용 프로그램과 이들 간의 상호 작용을 구성하는 마이크로 서비스 네트워크 구조
2. 왜 Istio를 사용해야 하나요?
Istio를 도입하면 쿠버네티스의 복잡성을 감소시킬 수 있다
쿠버네티스를 빗롯한 다양한 플랫폼에서 사용하는 서비스메시 환경을 돕는 프로젝트다
Istio를 사용하면 서비스의 연결, 보안, 제어 및 관찰 기능을 구현할 수 있다
이 기능으로 복잡성을 줄여 개발 팀의 부담 감소시키고 모든 컨테이너를 로깅하거나 원격 측정, 정책 시스템을 통합할 수 있는 API 플랫폼이다
Istio의 다양한 기능을 사용하면 서비스 매시 환경을 보다 효율적으로 관리할 수 있다
Istio의 매력은 서비스의 코드를 거의 변경하지 않고도 로드 밸런싱, 서비스 간 인증, 모니터링 등을 통해 배포 된 서비스 네트워크를 쉽게 생성 가능하든 점에 있다
별다른 수정 없이 네임스페이스에 설정 옵션을 주고 바로 컨테이너를 배포하면 관찰된다
마이크로서비스 간의 모든 네트워크 통신을 관찰하는 특수 사이드카 프록시를 배치해 각 포드에 istio-proxy 사이드카를 통해 모니터링할 수 있다
3. Istio의 기능
Istio 메인 화면 https://istio.io/
기능 | 설명 |
---|---|
연결 | 서비스 간의 트래픽 및 API 호출 흐름을 지능적으로 제어하고 다양한 테스트를 수행하며 |
Red/Black 배포를 통해 점진적으로 업그레이드 | |
보안 | 관리 인증, 권한 부여 및 서비스 간 통신 암호화를 통해 서비스를 자동으로 보호 |
제어 | 정책을 제어하고 실행, 소비자에게 공정하게 분배 |
관찰 | 모든 서비스의 풍부한 자동 추적, 모니터링 및 로깅으로 발생 상황 확인 |
4. Istioctl 최신 버전 다운로드 및 설치
$ curl -L https://istio.io/downloadIstio | sh -
$ cd istio-1.8.2
$ export PATH=$PWD/bin:$PATH
$ istioctl
Istio configuration command line utility for service operators to
debug and diagnose their Istio mesh.
Usage:
istioctl [command]
Available Commands:
analyze Analyze Istio configuration and print validation messages
authz (authz is experimental. Use `istioctl experimental authz`)
bug-report Cluster information and log capture support tool.
convert-ingress Convert Ingress configuration into Istio VirtualService configuration [Deprecated, it will be removed in Istio 1.9]
dashboard Access to Istio web UIs
deregister De-registers a service instance [Deprecated, it will be removed in Istio 1.9]
experimental Experimental commands that may be modified or deprecated
help Help about any command
install Applies an Istio manifest, installing or reconfiguring Istio on a cluster.
kube-inject Inject Envoy sidecar into Kubernetes pod resources
manifest Commands related to Istio manifests
operator Commands related to Istio operator controller.
profile Commands related to Istio configuration profiles
proxy-config Retrieve information about proxy configuration from Envoy [kube only]
proxy-status Retrieves the synchronization status of each Envoy in the mesh [kube only]
register Registers a service instance (e.g. VM) joining the mesh [Deprecated, it will be removed in Istio 1.9]
upgrade Upgrade Istio control plane in-place
validate Validate Istio policy and rules files
verify-install Verifies Istio Installation Status
version Prints out build version information
Flags:
--context string The name of the kubeconfig context to use
-h, --help help for istioctl
-i, --istioNamespace string Istio system namespace (default "istio-system")
-c, --kubeconfig string Kubernetes configuration file
-n, --namespace string Config namespace
Additional help topics:
istioctl options Displays istioctl global options
Use "istioctl [command] --help" for more information about a command.
5. Istio 설치 프로파일
Istio를 설치할 때 원하는 프로파일을 지정하여 원하는 구성의 istio를 설치할 수 있다
X가 포함돼 있다는 체크 표시다
설치 구성 프로파일 https://istio.io/docs/setup/additional-setup/config-profiles/
default
의 기본 설정에 따라 컴포넌트를 사용한다 (실제 서비스 환경에 권장)
명령을 실행하여 기본 설정을 표시 할 수 있습니다
istioctl profile dump
demo
적당한 리소스 요구 사항으로 Istio 기능을 보여 주도록 설계된 구성됐다
모든 구성을 설치해 높은 수준의 추적 및 액세스 로깅을 가능하게 한다
그러나 성능 테스트에 적합하지는 않다
현재 istioctl로 설치가능한 리스트를 살펴보자
$ istioctl profile list
Istio configuration profiles:
default
demo
empty
minimal
openshift
preview
remote
원하는 컴포넌트와 애드온만 설치하기 원하는 경우에는 설치 후 원하는 컴포넌트를 다음 링크를 참고하기 바란다
https://istio.io/docs/setup/install/istioctl/#customizing-the-configuration
6. istioctl을 활용한 istio 설치
istio 설치를 수행해보자
다음 명령으로 간단히 설치할 수 있다
컨테이너를 직접 배치하기 때문에 5분 정도의 시간이 소요된다
원하는 프로파일이 다른 경우에는 profile=<프로파일 명>
을 바꿔주면 된다
$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete
※ 디폴트 프로파일 설치 후 다음 명령을 사용하면 컴포넌트와 애드온을 추가로 설치할 수 있다
demo를 설치하는 경우에는 모든 것들이 설치된다
7. 샘플 프로젝트에 Istio 적용하기
설치가 완료되면 네임스페이스마다 istio를 사용할지 설정할 수 있다
istio-injection 레이블을 추가하면 배포되는 네임스페이스의 포드에 istio가 함께 설치된다
$ kubectl label namespace default istio-injection=enabled
namespace/default labeled
미리 준비된 샘플 프로젝트인 bookinfo 배포를 수행한다
그리고 포드가 정상 동작하는지 확인한다
$ 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
pod 확인
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-79c697d759-7szjp 2/2 Running 0 4m3s
productpage-v1-65576bb7bf-kllvw 2/2 Running 0 4m2s
ratings-v1-7d99676f7f-twdbf 2/2 Running 0 4m3s
reviews-v1-987d495c-r9f85 2/2 Running 0 4m2s
reviews-v2-6c5bf657cf-w795h 2/2 Running 0 4m2s
reviews-v3-5f7b9f4f77-zhbr4 2/2 Running 0 4m2s
bookinfo MSA 아키텍처
그림 출처: https://istio.io/docs/examples/bookinfo/
8 게이트웨이 설치와 관찰
애플리케이션을 생성했지만 게이트웨이를 추가로 생성해야 외부로 접근이 가능해진다
gateway는 istio가 배포한 커스텀된 오브젝트다
마치 쿠버네티스에서 제공되는 Ingress처럼 동작한다
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
다음 명령을 실행해 gateway가 잘 설정됐는지 확인한다
$ kubectl get gateways
NAME AGE
bookinfo-gateway 12m
이 gateway는 istio-system의 레이블이 istio=ingressgateway인 svc에 설정을 추가한다
# samples/bookinfo/networking/bookinfo-gateway.yaml
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
셀렉터로 연결된 istio=ingressgateway svc를 찾아보면 istio 디폴트 컨트롤러를 확인할 수 있다
여기서는 80:32148 포트를 사용하고 있다
$ kubectl get svc -n istio-system -l istio=ingressgateway --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-system istio-ingressgateway LoadBalancer 10.96.248.127 <pending> 15020:31660/TCP,80:32148/TCP,443:31794/TCP,15029:30815/TCP,15030:30286/TCP,15031:31728/TCP,15032:31331/TCP,31400:30437/TCP,15443:31420/TCP 3h6m
애플리케이션으로 접속해보자
노드의 IP를 적고 32148포트로 접속한다
로드밸런서가 만들어지는 클라우드환경이라면 로드밸런서를 이용해도 괜찮다
productpage에 접속된 화면
뒤 따라오는 설정인 VirtualService는 bookinfo-gateway와 연결돼 있다
/productpage 등의 경로를 접근하면 productpage라는 서비스의 9080포트로 연결한다
# samples/bookinfo/networking/bookinfo-gateway.yaml
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
연결된 구조를 보면 다음과 같다
외부 트래픽은 istio-ingress로부터 들어와서 게이트웨이를 통해 실제 서비스하는 포드로 연결된다
외부에서 실제 서비스 중인 포드에 연결되기까지
9 Istio 대시보드: Kiali
istioctl의 dashboard 명령을 사용하면 다양한 서비스에 접근할 수 있다
이중에 원하는 서비스를 선택하면 된다
$ istioctl dashboard
Access to Istio web UIs
<중략>
Available Commands:
controlz Open ControlZ web UI
envoy Open Envoy admin web UI
grafana Open Grafana web UI
jaeger Open Jaeger web UI
kiali Open Kiali web UI
prometheus Open Prometheus web UI
zipkin Open Zipkin web UI
kiali를 사용하면 현재 사용하는 애플리케이션의 트래픽 구조를 확인할 수 있다
다음 명령을 실행하면 자동으로 브라우저가 실행된다
istioctl dashboard kiali
왼쪽 메뉴에서 Graph를 선택하고 default 네임스페이스를 선택하면 다음과 같은 그림을 볼 수 있다
내부에 사용되는 proxy를 통해 관찰하기 때문에 클라이언트 요청이 없거나 충분하지 않으면 그래프가 일부 그려지지 않을 수 있다
watch 명령을 사용하면 2초에 한 번 씩 url로 계속 접근한다
watch curl http://127.0.0.1:32148/productpage
그래프의 모양은 앞서 살펴본 MSA 아키텍처와 거의 동일하다
(왼쪽)Kiali에서 모니터링하는 화면, (오른쪽)bookinfo MSA 아키텍처
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - 쿠버네티스 버전 업데이트 (0) | 2021.01.20 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - 노드 OS 업그레이드 절차 (0) | 2021.01.20 |
[데브옵스를 위한 쿠버네티스 마스터] 리소스 로깅과 모니터링 - EFK를 활용한 k8s 로그 모니터링 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 리소스 로깅과 모니터링 - GKE에서 프로메테우스 설치와 모니터링 (0) | 2021.01.19 |
[데브옵스를 위한 쿠버네티스 마스터] 리소스 로깅과 모니터링 - 큐브 대시보드 설치와 사용 (0) | 2021.01.19 |
댓글