KANS3 - 7주차 Service Mesh : Istio- Mode(Sidecar, Ambient)

김성중·2024년 10월 18일
1
post-thumbnail

KANS(Kubernetes Advanced Networking Study) 3기 과정으로 학습한 내용을 정리 또는 실습한 정리한 게시글입니다. 7주차는 Istio-Mode (Sidecar)를 학습하였습니다. vagrant 이용 VMware Fusion에서 k3s 실습환경 구성하였고, Istio Blue/Green 버전업을 개인과제로 정리하였습니다.

1. 서비스 메시(Service Mesh)

1.1 서비스 메시란 무엇인가요?

  • 서비스 메시는 애플리케이션의 서비스 간 모든 통신을 처리하는 소프트웨어 계층입니다.
    이 계층은 컨테이너화된 마이크로서비스로 구성됩니다.

  • 애플리케이션이 확장되고 마이크로서비스의 수가 증가함에 따라 서비스의 성능을 모니터링하기가 점점 어려워지고 있습니다.

  • 서비스 메시는 서비스간 연결을 관리하기 위해 모니터링, 로깅, 추적, 트래픽 제어와 같은 새로운 기능을 제공합니다.

  • 이러한 기능은 각 서비스의 코드와 독립적이므로 네트워크 경계를 넘어 여러 서비스 관리 시스템에서 작동할 수 있습니다.

  • Mesh란 그물, 망사라는 뜻을 가지고 있으며, Service Mesh는 Serivce들이 그물처럼 엮여있는 것을 뜻합니다.
    MicroService Architecture를 적용한 시스템의 내부 통신이 그물(Mesh) 네트워크의 형태를 띄는 것에 빗대어 Service Mesh로 명명됩니다.

  • 애플리케이션 계층이 아닌 인프라 플랫폼 계층에 특정 모듈을 삽입하여 애플리케이션에 대한 라우팅, 보안 및 안정성 기능을 추가하는 도구입니다.

  • 서비스 메시는 쿠버네티스와 같은 컨테이너 오케스트레이션 환경에서 일반적으로 애플리케이션 코드(사이드 카 라고 불리는 패턴)와 함께 배치된 확장 가능한 네트워크 프록시 모듈로 구현됩니다.

https://daddyprogrammer.org/post/13700/service-mesh/

  • 그림을보면 MicroService와 SideCar로 구성되어 있고, SideCar를 통해 그물처럼 통신합니다.

  • Service Mesh의 구현체로는 istio, linkerd, conduit, App Mesh 등이 있습니다.

  • Kubernetes 기반의 서비스를 구성하거나 오픈소스를 적용하다보면 대게 istio로 구성되는 경우가 많습니다.

사이드 카 패턴이란?

  • 애플리케이션 컨테이너와 독립적으로 동작하는 별도의 컨테이너를 붙이는 패턴입니다.

  • 오토바이에 연결된 사이트와 유사하기 때문에 사이드 카 패턴이라고 불립니다.

  • 애플리케이션 컨테이너와 독립적으로 동작하기 때문에 사이드카 장애 시 애플리케이션이 영향을 받지 않고,
    사이드카 적용/변경/제거 등의 경우에 애플리케이션은 수정이 필요가 없습니다.

https://azderica.github.io/00-design-pattern-sidecar/

  • 쿠버네티스 생태계가 점차 컨테이너 오케스트레이션 시장의 표준이 되어 가며 많은 개발자들이 서비스 메시의 가치를 인식하고 있는 상황입니다.

1.2 서비스 메시는 왜 필요한가요? 사용하는 이유?

  • 현대적 애플리케이션 아키텍처에서는 독립적으로 배포 가능한 소규모 마이크로서비스 모음으로 애플리케이션을 구축할 수 있습니다. 팀별로 개별 마이크로서비스를 구축하고 코딩 언어 및 도구를 선택할 수 있습니다. 하지만 애플리케이션 코드가 제대로 작동하려면 마이크로서비스가 통신해야 합니다.

  • 애플리케이션 성능은 서비스 간 통신의 속도와 탄력성에 따라 좌우됩니다. 개발자는 서비스 전반에서 애플리케이션을 모니터링하고 최적화해야 하지만, 시스템의 분산된 특성 때문에 가시성을 확보하기가 어렵습니다. 애플리케이션이 확장됨에 따라 통신을 관리하기가 훨씬 더 복잡해집니다.

  • 서비스 메시 없이 동작하는 마이크로 서비스는 서비스 간 커뮤니케이션을 통제하는 로직으로 코딩해야 하기 때문에 개발자들이 비즈니스 로직에 집중하지 못하게 됩니다.

  • 서비스 간 커뮤니케이션을 통제하는 로직이 각 서비스 내부에 숨겨져 있기 때문에 커뮤니케이션 장애를 진단하기 더 어려워집니다.

  • 수십 개의 Microservice가 분리되어 있고 서비스 간의 통신도 매우 복잡하여 새로운 장애 지점이 계속 나타나게 된다면 서비스 메시 없이는 문제가 발생한 지점을 찾아내기가 어려울 것입니다.

  • 그러면 서비스 메시로 얻는 이점은?

    서비스 메시가 서비스 간 커뮤니케이션의 모든 부분을 성능 메트릭으로 캡처할 수 있습니다.

    • 개발자 들은 비즈니스 로직에 집중할 수 있습니다.
    • 문제를 손쉽게 인식하고 진단할 수 있습니다.
    • 장애가 발생한 서비스로부터 요청을 재 라우팅 할 수 있기 때문에 애플리케이션 복구 능력이 향상됩니다.
    • 성능 메트릭을 통해 런타임 환경에서 커뮤니케이션을 최적화하는 방법을 제안할 수 있습니다.
  • 그런데 API를 포함하여 애플리케이션의 효율을 극대화함에 있어 API Gateway라는 관리 솔루션이 존재합니다.

    • 기본적으로 API 게이트웨이는 외부에서 들어오는 트래픽에 대한 제어를 담당합니다.

    • 반면에 서비스 메시는 서비스 내부의 통신에 대한 제어를 담당합니다.

  • API Gateway와 서비스 메시는 하고자 하는 일은 명확하게 다릅니다.

    • 하지만 트래픽 제어, 라우팅, 메트릭 수집, 보안/정책 적용 등 기능이 중복되기 때문이며
      서비스 메시가 자체로 Ingress Gateway 같은 것을 가지고 있기 때문에 많은 분들은 이 둘을 혼란스럽습니다.
  • Ingress란?

    • 외부로부터 서버 내부로 유입되는 네트워크 트래픽을 의미합니다.

1.3 서비스 메시와 API Gateway 무엇이 다른가요?

적용되는 위치

  • API Gateway는 중앙 집중식 제어 영역으로 외부에서 들어오는 트래픽에 대한 제어를 담당합니다. (외부망과 내부망 사이)
  • 서비스 메시는 애플리케이션 기능을 인프라 계층에 의해 관리되는 마이크로 서비스로 분리하는 방법입니다.
    서비스 메시는 서비스 내부의 통신에 대한 제어를 담당합니다. (내부망 Kubernetes 클러스터)

아키텍처

  • API Gateway가 중앙집중형 아키텍처여서 SPOF(Single Point of Failure)을 생성한다면
  • 서비스 메시는 분산형 아키텍처를 취하기 때문에 SPOF를 생성하지 않고 확장이 용이합니다.

패턴

  • API Gateway는 일반적으로 Gateway proxy pattern을 사용합니다.

    • Consumuer(호출자)는 구현 내용을 알 필요 없이 Gateway를 호출하는 방법만 알면 Gateway가 알아서 수행하는 방식입니다.
  • Service Mesh는 일반적으로 Sidecar proxy pattern을 사용합니다.

    • Consumuer(호출자)의 코드에는 Provider(공급자)의 주소를 찾는 방법, failover와 관련된 코드 등의 내용이 들어가게 됩니다.
    • 다만 호출자의 코드는 애플리케이션 코드에 내장되는 것이 아니라 sidecar 형태로 별도로 관리됩니다.

API게이트웨이와 서비스 메시를 함께 사용하면 서비스 메시 아키텍처의 중재자 역할을 할 수 있습니다.

따라서 보안과 속도가 좋아집니다.

주요 항목서비스 메시API Gateway
목적내부 엔터프라이즈 시스템 및 마이크로 서비스 내의 이식성을 개선하도록 설계내부/외부 및 심지어 데이터베이스 엑세스 위한 API 호출까지도 라우팅 할 수 있도록 설계
동작방법내부 엔터프라이즈 서비스 범위 내에서 운영회사 외부에 있는 애플리케이션에서의 연계를 위한 라우팅을 지원
API 역할API는 규모에 맞는 서비스 메시를 보호하는 데 사용API 게이트웨이는 API를 관리하고 보호하는 데 사용
디지털 트랜스포메이션마이크로 서비스를 관리하여 제공 시간을 단축하지만 보안 문제가 발생할 수 있음특히 서비스 메시와 함께 사용할 경우 출시 시간을 단축하고 보안을 보장
복잡성엔드포인트가 비즈니스에 따라 확장됨에 따라 복잡성 가중엔드포인트를 쉽게 관리하고 API를 확장하여 서비스 메시를 관리
기술 성숙도신기술성숙한 기술
보안수동 프로세스에 의한 보안 정책 적용자동화된 보안 정책 및 기능

위의 표를 보면 서비스 메시의 단점들을 API Gateway가 보완해주는 것 같습니다.

그리고 API Gateway 입장에서는 서비스 메시는 디테일을 관리하는 것 같습니다.

그러면 둘 다 필요한가요?

  • API Gateway와 서비스 메시는 기능면에서 유사한 부분들이 존재합니다.

  • 하지만 이들의 역할을 상당히 다르고 상호보완적인 부분들이 있습니다.

  • 최근 MSA에서 API Gateway는 노출되는 부분(External)에 위치하여 내부 서비스를 보호 및 제어하는 역할을 하고,
    Service Mesh는 내부 서비스(Internal)에 위치하여 서비스를 관리하는 구조로 많이 사용되고 있습니다.

1.4 마이크로서비스에 대해 읽어보기

마이크로서비스 » https://aws.amazon.com/microservices/

서비스 수준 관찰성

  • 더 많은 워크로드와 서비스가 배포됨에 따라 개발자들은 모든 요소가 연동하여 작동하는 방식을 이해하는 데 어려움을 겪습니다.

  • 예를 들어 서비스 팀은 다운스트림 및 업스트림 종속성에 대해서 알고 싶어합니다.

  • 애플리케이션 계층에서 서비스와 워크로드가 통신하는 방식에 대한 가시성을 높이길 원합니다.

서비스 수준 제어

  • 관리자는 어떤 서비스가 서로 통신하고 어떤 작업을 수행하는지를 제어하고자 합니다.

  • 관리자는 마이크로서비스 아키텍처 내에서 서비스의 동작, 정책 및 상호 작용에 대한 세밀한 제어 및 거버넌스 기능을 원합니다.

  • 보안 정책 적용은 규제를 준수하는 데 필수적입니다.

1.5 서비스 메시를 사용하면 어떤 이점이 있나요?

서비스 메시는 분산 애플리케이션 내에서 복잡한 서비스 간 통신을 처리하는 중앙 집중식 전용 인프라 계층을 제공합니다.

서비스 검색

  • 서비스 메시는 자동화된 서비스 검색을 제공하여 서비스 엔드포인트 관리의 운영 부하를 줄입니다.
  • 서비스 레지스트리를 사용하여 메시 내의 모든 서비스를 동적으로 검색하고 추적합니다.
  • 서비스는 위치나 기반 인프라에 관계없이 서로를 원활하게 찾고 통신할 수 있습니다. 필요에 따라 새 서비스를 배포하여 빠르게 확장할 수 있습니다.

로드 밸런싱

  • 서비스 메시는 라운드 로빈, 최소 연결 또는 가중치 로드 밸런싱과 같은 다양한 알고리즘을 사용하여 요청을 여러 서비스 인스턴스에 지능적으로 분산합니다.
  • 로드 밸런싱은 리소스 활용도를 높이고 고가용성 및 확장성을 보장합니다.
  • 성능을 최적화하고 네트워크 통신 병목 현상을 방지할 수 있습니다.

트래픽 관리

서비스 메시는 요청 라우팅 및 트래픽 동작을 세밀하게 제어할 수 있는 고급 트래픽 관리 기능을 제공합니다. 여기 몇 가지 예가 있습니다.

트래픽 분할

  • 들어오는 트래픽을 서로 다른 서비스 버전 또는 구성 간에 분할할 수 있습니다.
  • 메시는 일부 트래픽을 업데이트된 버전에 전달하므로 변경 사항을 제어하고 점진적으로 적용할 수 있습니다.
  • 이를 통해 원활한 전환이 가능하며, 변경으로 인한 영향을 최소화할 수 있습니다.

미러링 요청

  • 기본 요청 흐름에 영향을 주지 않으면서 분석을 위해 테스트 또는 모니터링 서비스에 트래픽을 복제할 수 있습니다.
  • 요청을 미러링하면 서비스가 프로덕션 트래픽에 영향을 미치지 않으면서 특정 요청을 처리하는 방법을 파악할 수 있습니다.

카나리 배포

  • 대부분의 사용자가 기존의 안정적인 버전을 계속 사용하면서 일부 사용자 또는 트래픽을 새 서비스 버전에 전달할 수 있습니다.

  • 노출이 제한되므로 실제 환경에서 새 버전의 동작과 성능을 실험해 볼 수 있습니다.

보안

  • 서비스 메시는 상호 TLS(mTLS) 암호화, 인증 및 권한 부여와 같은 보안 통신 기능을 제공합니다.
  • 상호 TLS를 사용하면 서비스 간 통신에서 ID를 검증할 수 있습니다.
  • 트래픽을 암호화하여 데이터 기밀성과 무결성을 보장하는 데 도움이 됩니다.
  • 또한 권한 부여 정책을 적용하여 특정 엔드포인트에 액세스하거나 특정 작업을 수행하는 서비스를 제어할 수 있습니다.

모니터링

  • 서비스 메시는 포괄적인 모니터링 및 관찰성 기능을 제공하여 서비스의 상태, 성능 및 행동에 대한 인사이트를 도출할 수 있습니다.
  • 모니터링은 문제 해결 및 성능 최적화도 지원합니다. 사용할 수 있는 모니터링 기능의 예는 다음과 같습니다.
    • 지연 시간, 오류율, 리소스 사용률과 같은 지표를 수집하여 전체 시스템 성능을 분석합니다.
    • 분산 추적을 수행하여 여러 서비스 전반에서 요청의 전체 경로와 시간을 확인할 수 있습니다.
    • 감사, 디버깅 및 규정 준수를 위해 로그에 서비스 이벤트를 캡처합니다.

1.6 서비스 메시는 어떻게 작동하나요?

  • 서비스 메시는 개별 서비스에서 서비스 간 통신을 제어하는 로직을 없애고 통신을 자체 인프라 계층으로 추상화합니다. 여러 네트워크 프록시를 사용하여 서비스 간 통신을 라우팅하고 추적합니다.

  • 프록시는 조직의 네트워크와 마이크로서비스 간의 중간 게이트웨이 역할을 합니다. 서비스로 들어오고 나가는 모든 트래픽은 프록시 서버를 통해 라우팅됩니다.

  • 개별 프록시는 개별적으로 실행되지만 논리적으로 각 서비스의 옆에 있기 때문에 사이드카라고도 합니다. 이들 프록시가 함께 서비스 메시 계층을 구성합니다.

    img

  • 다음 그림은 서비스 메시 도구로 많이 알려진 이스티오 아키텍처입니다.

img

img
이미지 출처: https://istio.io

서비스 메시 아키텍처에는 컨트롤 플레인과 데이터 영역이라는 두 가지 주요 구성 요소가 있습니다.

컨트롤 플레인

  • 컨트롤 플레인은 서비스 메시의 중앙 관리 및 구성 계층 역할을 합니다.
  • 관리자는 컨트롤 플레인을 사용하여 메시 내에서 서비스를 정의하고 구성할 수 있습니다. 예를 들어 서비스 엔드포인트, 라우팅 규칙, 부하 분산 정책 및 보안 설정과 같은 파라미터를 지정할 수 있습니다. 구성이 정의되면 컨트롤 플레인은 서비스 메시의 데이터 영역에 필요한 정보를 배포합니다.
  • 프록시는 구성 정보를 사용하여 들어오는 요청을 처리하는 방법을 결정합니다. 또한 구성 변경 사항을 수신하고 동작을 동적으로 조정할 수 있습니다. 서비스를 다시 시작하거나 중단하지 않고 서비스 메시 구성을 실시간으로 변경할 수 있습니다.
  • 서비스 메시 구현에는 일반적으로 컨트롤 플레인에 다음 기능이 포함됩니다.
    • 메시 내의 모든 서비스를 추적하는 서비스 레지스트리
    • 신규 서비스 자동 검색 기능 및 비활성 서비스 제거 기능
    • 지표, 로그, 분산 추적 정보와 같은 텔레메트리 데이터의 수집 및 집계

img

데이터 영역

  • 데이터 영역은 서비스 메시의 데이터 처리 구성 요소입니다. 여기에는 모든 사이드카 프록시와 해당 기능이 포함됩니다. 서비스가 다른 서비스와 통신하려는 경우 사이드카 프록시는 다음과 같은 작업을 수행합니다.
    1. 사이드카가 요청을 가로챕니다.
    2. 요청을 별도의 네트워크 연결로 캡슐화합니다.
    3. 소스 프록시와 대상 프록시 간에 안전하고 암호화된 채널을 설정합니다.
  • 사이드카 프록시는 서비스 간의 로우레벨 메시징을 처리합니다.
  • 또한 회로 차단 및 요청 재시도와 같은 기능을 구현하여 복원력을 높이고 서비스 기능 저하를 방지합니다.
  • 로드 밸런싱, 서비스 검색, 트래픽 라우팅과 같은 서비스 메시 기능이 데이터 영역에 구현됩니다.

1.7 Istio는 무엇인가요?

  • Istio는 주로 Kubernetes와 함께 작동하도록 설계된 오픈 소스 서비스 메시 프로젝트입니다.
    Kubernetes는 대규모 컨테이너식 애플리케이션을 배포하고 관리하는 데 사용되는 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다.
  • Istio의 컨트롤 플레인 구성 요소는 자체적으로 Kubernetes 워크로드로 실행됩니다. 하나의 IP 주소를 공유하는 밀결합된 컨테이너 세트인 Kubernetes 포드를 사이드카 프록시 설계의 기반으로 사용합니다.
  • Istio의 계층 7 프록시는 기본 서비스와 동일한 네트워크 컨텍스트에서 또 다른 컨테이너로 실행됩니다. 이 위치에서 포드를 통과하는 모든 네트워크 트래픽을 가로채고, 검사하고, 조작할 수 있습니다. 하지만 기본 컨테이너를 변경할 필요도 없고 이런 작업이 이루어진다는 사실조차 알 필요가 없습니다.
  • Istio는 서비스 메시를 구성하고 제어하기 위해 Envoy라는 프록시를 사용합니다. Istio는 Envoy를 통해 서비스 간의 트래픽 흐름을 모니터링하고 제어할 수 있습니다. Istio는 또한 추적, 모니터링, 로깅 등의 기능을 제공하여 서비스의 성능과 문제점을 파악할 수 있습니다. Istio를 사용하려면 쿠버네티스 클러스터에 설치하고 필요한 설정을 해야 합니다

Istio와 Envoy의 차이점

  • Istio는 서비스 메시를 구축하고 제어하기 위한 오픈 소스 플랫폼입니다.
  • Envoy는 Istio가 사용하는 프록시로서 서비스 간의 통신을 처리하는 역할을 합니다.
  • Istio는 Envoy를 통해 서비스 메시의 트래픽 동작에 대한 데이터를 수집하고 정책을 관리하며 모니터링 시스템과 통합할 수 있습니다.
  • Envoy는 Istio의 데이터 플레인이라고 하며, Istio의 제어 플레인은 Istiod라고 합니다

Proxy란?

  • 프록시는 클라이언트가 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 서버입니다.
  • 프록시를 사용하면 빠른 액세스나 안전한 통신 등의 장점이 있습니다.
  • 프록시는 웹 프록시, 리버스 프록시, 투명 프록시 등의 종류가 있습니다.

1.8 오픈소스 서비스 메시 구현의 문제점은 무엇인가요?

다음은 Istio, Linkerd 및 Consul과 같은 오픈 소스 플랫폼과 관련한 몇 가지 일반적인 서비스 메시 문제입니다.

복잡성

  • 서비스 메시에는 추가 인프라 구성 요소, 구성 요구 사항 및 배포 고려 사항이 수반됩니다.
    학습 곡선이 가파르기 때문에 개발자와 운영자가 특정 서비스 메시 구현을 사용하는 데 필요한 전문 지식을 습득해야 합니다.
    팀을 교육하려면 시간과 리소스가 소요됩니다. 조직은 팀이 서비스 메시 아키텍처의 복잡성을 이해하고 이를 효과적으로 구성하는 데 필요한 지식을 갖추도록 해야 합니다.

운영 오버헤드

  • 서비스 메시는 데이터 영역 프록시와 컨트롤 플레인 구성 요소를 배포, 관리 및 모니터링하기 위한 추가 오버헤드를 유발합니다. 예를 들어 다음을 수행해야 합니다.
    • 서비스 메시 인프라의 높은 가용성 및 확장성 보장
    • 프록시의 상태 및 성능 모니터링
    • 업그레이드 및 호환성 문제 해결
  • 전체 시스템의 성능에 미치는 영향을 최소화하려면 서비스 메시를 신중하게 설계하고 구성하는 것이 중요합니다.

통합 문제

  • 서비스 메시에서 필요한 기능을 수행하려면 서비스 메시가 기존 인프라와 원활하게 통합되어야 합니다.
    여기에는 컨테이너 오케스트레이션 플랫폼, 네트워킹 솔루션 및 기술 스택의 기타 도구가 포함됩니다.
  • 복잡하고 다양한 환경에서 다른 구성 요소와의 호환성 및 원활한 통합을 보장하는 것은 어려울 수 있습니다.
  • API, 구성 형식 및 종속성을 변경하려면 지속적인 계획과 테스트가 필요합니다.
    스택의 어느 위치에서든 새 버전으로 업그레이드해야 하는 경우에도 마찬가지입니다.

2. K3s Cluster에 Istio 설치하기

2.1 소스 다운로드 & K3s Cluster 구성

  • 가시다님이 제공한 AWS CloudFormation 배포 소스(kans-7w.yaml)를 MacBook M시리즈에서도 실행할 수 있도록
    커스터마이징 하였습니다. 세부적인 방법은 KANS3 - 6주차 Ingress & Gateway API + CoreDNS 1. mac에 k3s 실습환경 구성 참조바랍니다.

    
    # 소스 Downloadgit clone https://github.com/icebreaker70/kans-k3s-istio
    ❯ cd kans-k3s-istio
    
    # VM 생성
    ❯ vagrant up --provision
    
    # VM 상태 확인
    ❯ vagrant status
    Current machine states:
    
    k3s-s                     running (vmware_desktop)
    k3s-w1                    running (vmware_desktop)
    k3s-w2                    running (vmware_desktop)
    testpc                    running (vmware_desktop)
    
    # VM 접속
    ❯ vagrant ssh k3s-s
    ❯ vagrant ssh k3s-w1
    ❯ vagrant ssh k3s-w2
    ❯ vagrant ssh testpc
    
    # K3s Cluster 확인
    ❯ vagrant ssh k3s-s
    $ kc cluster-info      # kc는 kubectl 실행 내용을 Color로 보여주는 Tool의 Alias
    $ kc get nodes -o wide
    $ kc get pods -A
    
    # VM 일시멈춤
    ❯ vagrant suspend
    
    # VM 멈춤재개
    ❯ vagrant resume
    
    # VM 삭제
    ❯ vagrant destory -f

2.2 K3s Cluster Local PC에서 접속

  • k3s-s에 있는 kube-config 파일 Local에 복사

    
    # cat <<EOT>> /etc/hosts 
    #K3S
    192.168.10.10  k3s-s
    192.168.10.101 k3s-w1
    192.168.10.102 k3s-w2
    192.168.20.200 testpc
    #End of K8S
    EOT
    
    ❯ vagrant scp k3s-s:/etc/rancher/k3s/k3s.yaml ~/.kube/config
    Warning: Permanently added '[127.0.0.1]:50010' (ED25519) to the list of known hosts.
    k3s.yaml                                                                                                                                              100% 2965     3.6MB/s   00:00
    ❯ kc get node
    NAME     STATUS   ROLES                  AGE   VERSION
    k3s-s    Ready    control-plane,master   35m   v1.30.5+k3s1
    k3s-w1   Ready    <none>                 18m   v1.30.5+k3s1
    k3s-w2   Ready    <none>                 27m   v1.30.5+k3s1

3. Istio Blue/Green으로 Upgrade 방법

3.1 Blue Istio 설치

  • Istio Operator 설치 (v1.20.1)

    export ISTIOV=1.20.1
    
    ❯ curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV sh -
    Downloading istio-1.20.1 from https://github.com/istio/istio/releases/download/1.20.1/istio-1.20.1-osx-arm64.tar.gz ...
    Istio 1.20.1 Download Complete!
    Istio has been successfully downloaded into the istio-1.20.1 folder on your system.
    
    Next Steps:
    See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.
    
    To configure the istioctl client tool for your workstation,
    add the ~/istio-1.20.1/bin directory to your environment path variable with:
         export PATH="$PATH:/Users/sjkim/istio-1.20.1/bin"
    
    Begin the Istio pre-installation check by running:
         istioctl x precheck
    
    Need more information? Visit https://istio.io/latest/docs/setup/install/
    
    ❯ ~/istio-1.20.1/bin/istioctl version
      no ready Istio pods in "istio-system"
      1.20.1
    
    # Istio Operator 설치
    ❯ ~/istio-1.20.1/bin/istioctl operator init --revision 1-20-1
    Operator controller is already installed in istio-operator namespace.
    Upgrading operator controller in namespace: istio-operator using image: docker.io/istio/operator:1.20.1
    Operator controller will watch namespaces: istio-system
    ✔ Istio operator installed
    ✔ Installation complete  
    
    ❯ kc get ns
    NAME              STATUS   AGE
    default           Active   103m
    istio-operator    Active   9m18s
    istio-system      Active   9m18s
    kube-node-lease   Active   103m
    kube-public       Active   103m
    kube-system       Active   103m  
    
    ❯ kubectl get pod -n istio-operator
    NAME                                     READY   STATUS    RESTARTS   AGE
    istio-operator-1-20-1-7d8568f545-rsn79   1/1     Running   0          9m59s
  • istiod, ingressGateway Control Plane 설치

    
    # Manifestcat istio-operator-1-20-1.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      name: istiocontrolplane-1-20-1
      namespace: istio-system
    spec:
      revision: 1-20-1
      profile: default
      components:
        base:
          enabled: true
        pilot:
          enabled: true
          k8s:
            resources:
              requests:
                cpu: 100m
                memory: 128Mi
              limits:
                cpu: 500m
                memory: 256Mi
        egressGateways:
          - name: istio-egressgateway
            enabled: false
        ingressGateways:
          - name: istio-ingressgateway
            enabled: true
            label:
              istio: ingressgateway
            k8s:
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 500m
                  memory: 256Mi
              hpaSpec:
                minReplicas: 1
              service:
                externalTrafficPolicy: Cluster
                type: NodePort
                    
    # Manifest 적용
    ❯ ~/istio-1.20.1/bin/istioctl install -f istio-operator-1-20-1.yaml
    WARNING: Istio 1.20.0 may be out of support (EOL) already: see https://istio.io/latest/docs/releases/supported-releases/ for supported releases
    This will install the Istio 1.20.1 "default" profile (with components: Istio core, Istiod, and Ingress gateways) into the cluster. Proceed? (y/N) y
    ✔ Istio core installed
    ✔ Istiod installed
    ✔ Ingress gateways installed
    ✔ Installation complete
    ❯ istioctl version
    client version: 1.20.1
    control plane version: 1.20.1
    data plane version: 1.20.1 (1 proxies)
    
    ❯ kc get svc -A
    NAMESPACE        NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                      AGE
    default          kubernetes              ClusterIP   10.10.200.1     <none>        443/TCP                                      34m
    istio-operator   istio-operator-1-20-1   ClusterIP   10.10.200.98    <none>        8383/TCP                                     26m
    istio-system     istio-ingressgateway    NodePort    10.10.200.24    <none>        15021:30291/TCP,80:31298/TCP,443:31894/TCP   4m38s
    istio-system     istiod-1-20-1           ClusterIP   10.10.200.253   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP        23m
    kube-system      kube-dns                ClusterIP   10.10.200.10    <none>        53/UDP,53/TCP,9153/TCP                       34m
    kube-system      metrics-server          ClusterIP   10.10.200.65    <none>        443/TCP                                      34m  

3.2 istio-proxy 자동 주입되도록 Label 설정

  • Default Namespace에 istio-injection 대신에 istio.io/rev=1-20-1 Label 부여합니다.

    
    ❯ kubectl label namespace default istio-injection- istio.io/rev=1-20-1
    label "istio-injection" not found.
    namespace/default labeled
    
    ❯ kubectl describe ns default
    Name:         default
    Labels:       istio.io/rev=1-20-1
                  kubernetes.io/metadata.name=default
    Annotations:  <none>
    Status:       Active

3.3 Bookinfo 샘플어플리케이션 설치

  • Bookinfo 애플리케이션 소개 : 4개의 마이크로서비스로 구성 : Productpage, reviews, ratings, details
    • ProductPage 페이지에서 요청을 받으면, 도서 리뷰를 보여주는 Reviews 서비스와 도서 상세 정보를 보여주는 Details 서비스에 접속하고,
    • ProductPage 는 ReviewsDetails 결과를 사용자에게 응답한다.
    • Reviews 서비스는 v1, v2, v3 세 개의 버전이 있고 v2, v3 버전의 경우 Ratings 서비스에 접소갛여 도서에 대한 5단계 평가를 가져옴.
    • Reviews 서비스의 차이는, v1은 Rating 이 없고, v2는 검은색 별로 Ratings 가 표시되며, v3는 색깔이 있는 별로 Ratings 가 표시됨.

샘플어플리케이션 배포

  • Istio 설치 시 내장된 Sample Package 이용하여 배포

    
    # 모니터링
    watch -d 'kubectl get pod -owide;echo;kubectl get svc'
    
    # Bookinfo 애플리케이션 배포echo $ISTIOV
    1.20.1
    
    ❯ cat ~/istio-$ISTIOV/samples/bookinfo/platform/kube/bookinfo.yaml
    1.20.1
    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    
    ##################################################################################################
    # This file defines the services, service accounts, and deployments for the Bookinfo sample.
    #
    # To apply all 4 Bookinfo services, their corresponding service accounts, and deployments:
    #
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    #
    # Alternatively, you can deploy any resource separately:
    #
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l service=reviews # reviews Service
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l account=reviews # reviews ServiceAccount
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l app=reviews,version=v3 # reviews-v3 Deployment
    ##################################################################################################
    
    ##################################################################################################
    # Details service
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: details
      labels:
        app: details
        service: details
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: details
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-details
      labels:
        account: details
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: details-v1
      labels:
        app: details
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: details
          version: v1
      template:
        metadata:
          labels:
            app: details
            version: v1
        spec:
          serviceAccountName: bookinfo-details
          containers:
          - name: details
            image: docker.io/istio/examples-bookinfo-details-v1:1.18.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    ##################################################################################################
    # Ratings service
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: ratings
      labels:
        app: ratings
        service: ratings
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: ratings
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-ratings
      labels:
        account: ratings
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ratings-v1
      labels:
        app: ratings
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ratings
          version: v1
      template:
        metadata:
          labels:
            app: ratings
            version: v1
        spec:
          serviceAccountName: bookinfo-ratings
          containers:
          - name: ratings
            image: docker.io/istio/examples-bookinfo-ratings-v1:1.18.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    ##################################################################################################
    # Reviews service
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews
      labels:
        app: reviews
        service: reviews
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-reviews
      labels:
        account: reviews
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v1
      labels:
        app: reviews
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v1
      template:
        metadata:
          labels:
            app: reviews
            version: v1
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v1:1.18.0
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v2
      labels:
        app: reviews
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v2
      template:
        metadata:
          labels:
            app: reviews
            version: v2
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v2:1.18.0
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v3
      labels:
        app: reviews
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v3
      template:
        metadata:
          labels:
            app: reviews
            version: v3
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v3:1.18.0
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    ##################################################################################################
    # Productpage services
    ##################################################################################################
    apiVersion: v1
    kind: Service
    metadata:
      name: productpage
      labels:
        app: productpage
        service: productpage
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: productpage
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-productpage
      labels:
        account: productpage
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: productpage-v1
      labels:
        app: productpage
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: productpage
          version: v1
      template:
        metadata:
          annotations:
            prometheus.io/scrape: "true"
            prometheus.io/port: "9080"
            prometheus.io/path: "/metrics"
          labels:
            app: productpage
            version: v1
        spec:
          serviceAccountName: bookinfo-productpage
          containers:
          - name: productpage
            image: docker.io/istio/examples-bookinfo-productpage-v1:1.18.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
          volumes:
          - name: tmp
            emptyDir: {}
    ---
    
    ❯ kubectl apply -f ~/istio-$ISTIOV/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 all,sa
    NAME                                  READY   STATUS    RESTARTS   AGE
    pod/details-v1-cdd874bc9-ww2wv        2/2     Running   0          7m38s
    pod/productpage-v1-5bb9985d4d-9xbjg   2/2     Running   0          7m37s
    pod/ratings-v1-6484d64bbc-c5ppz       2/2     Running   0          7m38s
    pod/reviews-v1-598f9b58fc-x5p4l       2/2     Running   0          7m38s
    pod/reviews-v2-5979c6fc9c-qlbs8       2/2     Running   0          7m38s
    pod/reviews-v3-7bbb5b9cf7-z92mp       2/2     Running   0          7m38s
    
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    service/details       ClusterIP   10.10.200.49    <none>        9080/TCP   7m38s
    service/kubernetes    ClusterIP   10.10.200.1     <none>        443/TCP    4h19m
    service/productpage   ClusterIP   10.10.200.254   <none>        9080/TCP   7m38s
    service/ratings       ClusterIP   10.10.200.100   <none>        9080/TCP   7m38s
    service/reviews       ClusterIP   10.10.200.244   <none>        9080/TCP   7m38s
    
    NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/details-v1       1/1     1            1           7m38s
    deployment.apps/productpage-v1   1/1     1            1           7m37s
    deployment.apps/ratings-v1       1/1     1            1           7m38s
    deployment.apps/reviews-v1       1/1     1            1           7m38s
    deployment.apps/reviews-v2       1/1     1            1           7m38s
    deployment.apps/reviews-v3       1/1     1            1           7m38s
    
    NAME                                        DESIRED   CURRENT   READY   AGE
    replicaset.apps/details-v1-cdd874bc9        1         1         1       7m38s
    replicaset.apps/productpage-v1-5bb9985d4d   1         1         1       7m37s
    replicaset.apps/ratings-v1-6484d64bbc       1         1         1       7m38s
    replicaset.apps/reviews-v1-598f9b58fc       1         1         1       7m38s
    replicaset.apps/reviews-v2-5979c6fc9c       1         1         1       7m38s
    replicaset.apps/reviews-v3-7bbb5b9cf7       1         1         1       7m38s
    
    NAME                                  SECRETS   AGE
    serviceaccount/bookinfo-details       0         7m38s
    serviceaccount/bookinfo-productpage   0         7m38s
    serviceaccount/bookinfo-ratings       0         7m38s
    serviceaccount/bookinfo-reviews       0         7m38s
    serviceaccount/default                0         4h19m
    
    # product 웹 접속 확인
    ❯ 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>
    
    # 로그
    ❯ kubetail -l app=productpage -f
    Will tail 3 logs...
    productpage-v1-5bb9985d4d-9xbjg productpage
    productpage-v1-5bb9985d4d-9xbjg istio-proxy
    productpage-v1-5bb9985d4d-9xbjg istio-init```

Virtual Gateway

  • Virtual Gateway는

    • 들어오거나 나가는 HTTP/TCP 연결을 수신하는 메시 가장자리에서 작동하는 로드 밸런서
  • Gateway를 통해 설정할 수 있는 항목은 다음과 같다.

    • 외부에 공개할 Port 번호
    • 사용할 프로토콜(HTTP, HTTPS, GRPC 등)
    • SNI 설정
    • TLS

Virtual Service

  • Virtual Service는

    • Kubernetes service 를 세분화한 추상화된 Custom Resource Definition이며,
      다양한 조건 정의를 통해 사용자에게 소스 또는 어플리케이션 설정정보 변경없이 선언적으로 트래픽이 라우팅 되도록합니다.

    • Envoy 프록시에게 어떤 destination으로 어떻게 트래픽을 전달할지 알려주는 역할을 수행하는 Istio 리소스다.

    • 이를 통해 Routing 동작을 사용자가 원하는대로 customize하여 Native Kubernetes에서는 할 수 없었던 기능들을 제공한다

      • Call 중 10%는 신규 버전으로 전달 => Canary
      • 특정 User의 Call은 테스트 버전으로 route => HTTP 헤더값 기반 Routing Rule
      • Request 중 5%는 HTTP 400 에러 발생 => Fault Inejction
    • Virtual Service Manifest

      • host
        • 일반적으로 K8s의 Service 이름 또는 FQDN을 사용하며, 그밖에 IP 주소, DNS Name, "*" prefix 역시 가능하다.
      • http
        • match
          • Request가 정의한 조건에 맞는지 확인하고 True인 경우, Routing Rule을 적용
          • 사용 예로 Header 속성 중 'end-user' 값이 'jackson'과 일치하는 경우 별도 라우팅
        • route
          • destination
            • 트래픽이 전달될 Host를 명시하며, 이때의 Host는 VirtualService의 Host(ex: DNS Name) 와는 달리,
              Service Registry에 존재하는 실제 Destination를 의미한다.
              Service Registry는 Service Mesh 안에 존재하는 K8s Service와 Endpoint 데이터를 따로 갖고 있는 저장소이며,
              Istio가 관리한다.
            • Service 이름만 명시하는 경우, 해당 VirtualService가 위치한 Namespace에서 해당 Service를 찾으므로 필요한 경우, FQDN 형식을 사용
  • VitrualService의 Routing Rule은 위에서 아래로 각 Rule이 차례대로 적용되며, 가장 마지막에 위치한 Rule이 Default Backend로 동작한다.

Virtual Gateway & Virtual Service 배포

  • Virtual Gateway 소스

    cat ~/istio-$ISTIOV/samples/bookinfo/networking/bookinfo-gateway.yaml
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      # The selector matches the ingress gateway pod labels.
      # If you installed Istio using Helm following the standard documentation, this would be "istio=ingress"
      selector:
        istio: ingressgateway # use istio default controller
      servers:
      - port:
          number: 8080
          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
  • Gateway & Virtual Service 배포

    
    # Istio Gateway/VirtualService 설정
    ❯ kubectl apply -f ~/istio-$ISTIOV/samples/bookinfo/networking/bookinfo-gateway.yaml
    
    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created
    
    # 확인
    ❯ kubectl get gw,vs
    
    NAME                                           AGE
    gateway.networking.istio.io/bookinfo-gateway   28s
    NAME                                          GATEWAYS               HOSTS   AGE
    virtualservice.networking.istio.io/bookinfo   ["bookinfo-gateway"]   ["*"]   28s
    
    ❯ istioctl proxy-status
    
    NAME                                                   CLUSTER        CDS        LDS        EDS        RDS        ECDS         ISTIOD                             VERSION
    details-v1-cdd874bc9-ww2wv.default                     Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-1-20-1-69765f7479-96nsq     1.20.1
    istio-ingressgateway-5984c484cf-wdhft.istio-system     Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-1-20-1-69765f7479-96nsq     1.20.1
    productpage-v1-5bb9985d4d-9xbjg.default                Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-1-20-1-69765f7479-96nsq     1.20.1
    ratings-v1-6484d64bbc-c5ppz.default                    Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-1-20-1-69765f7479-96nsq     1.20.1
    reviews-v1-598f9b58fc-x5p4l.default                    Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-1-20-1-69765f7479-96nsq     1.20.1
    reviews-v2-5979c6fc9c-qlbs8.default                    Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-1-20-1-69765f7479-96nsq     1.20.1
    reviews-v3-7bbb5b9cf7-z92mp.default                    Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-1-20-1-69765f7479-96nsq     1.20.1
    
    # productpage 파드의 istio-proxy 로그 확인 Access log 가 출력 - Default access log format : 링크
    ❯ kubetail -l app=productpage -c istio-proxy -f
    
    Will tail 1 logs...
    productpage-v1-5bb9985d4d-9xbjg
    [productpage-v1-5bb9985d4d-9xbjg] 2024-10-19T00:59:44.331550Z	info	xdsproxy	connected to upstream XDS server: istiod-1-20-1.istio-system.svc:15012

Istio 를 통한 productpage 접속(반복) 테스트 & 웹 브라우저 접속 테스트*

  • K3s-s NodePort 접속 확인

# NodePort 확인export IGWHTTP=$(kubectl get service -n istio-system istio-ingressgateway -o jsonpath='{.spec.ports[1].nodePort}')
echo $IGWHTTP
31298

# 접속 확인
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                                      AGE
istio-ingressgateway   NodePort   10.10.200.24   <none>        15021:30291/TCP,80:31298/TCP,443:31894/TCP   4h17m

curl -s http://localhost:$IGWHTTP/productpage
curl -s http://192.168.10.101:$IGWHTTP/productpage
curl -s http://192.168.10.102:$IGWHTTP/productpage

# 정보 확인
echo $MYDOMAIN
cat /etc/hosts

# productpage 호출
curl -s http://$MYDOMAIN:$IGWHTTP/productpage

DestinationRule - Subset 분류

  • DestinationRule은 라우팅 발생 이후 트래픽 관련된 정책을 정의하는 Custom Resource Definition

  • 트래픽 정책

    • Load-balancing
    • connection-pool
    • pool 에서 unhealthy 한 서비스 detect & 제거
  • subset

    • 버전 특정 정책들 정의하고 service 레벨의 특정 설정을 overriding 합니다.
  • DestinationRule 배포 (예시)

    
    ❯ kubectl apply -f - << EOF
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      annotations:
      name: dr-hello
      namespace: default
    spec:
      host: svc-hello
      subsets:
      - labels:
          version: v1
        name: v1
      - labels:
          version: v2
        name: v2
    EOF
    
    destinationrule.networking.istio.io/dr-hello created
    
    ❯ kubectl get dr
    NAME       HOST                AGE
    dr-hello   svc-hello           9s
  • Virtual Service - Internal 배포

    
    ❯ kubectl apply -f - << EOF
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      annotations:
      name: vs-i-hello-svc
      namespace: default
    spec:
      hosts:
      - svc-hello
      http:
      - route:
        - destination:
            host: svc-hello.default.svc.cluster.local
            subset: v1
          weight: 10
        - destination:
            host: svc-hello.default.svc.clvimuster.local
            subset: v2
          weight: 90
    EOF
    
    virtualservice.networking.istio.io/vs-i-hello-svc configured
    
    ❯ kubectl get vs
    NAME             GATEWAYS       HOSTS           AGE
    vs-e-hello-svc   ["gw-hello"]   ["*"]           151m
    vs-i-hello-svc                  ["svc-hello"]   7h11m
  • Test, 1:9 비율로 Canary 방식으로 분배되는지 확인

    for i in {1..10}; do kubectl exec -it httpbin -c httpbin -- curl http://svc-hello.default.svc.cluster.local:8080/api; sleep 0.5; done
    Hello server - v2 (uri=/api)
    Hello server - v2 (uri=/api)
    Hello server - v2 (uri=/api)
    Hello server - v2 (uri=/api)
    Hello server - v2 (uri=/api)
    Hello server - v2 (uri=/api)
    Hello server - v1 (uri=/api)
    Hello server - v2 (uri=/api)
    Hello server - v2 (uri=/api)
    Hello server - v2 (uri=/api)

Destination Rule - 고급 트래픽 관리

Destination Rule은 Pod의 Label을 통해 서비스의 Subset을 분류하는데 주로 사용하지만, 다음과 같이 더욱 정교한 트래픽 관리도 가능하다.

  • Load balancing(round robin, random, least connection)
  • Rate limiting(connection pool 크기 조절)
  • Circuit breaker(outlier detection)

아래 설명은 Istio 설치시 다운로드 된 samples/bookinfo 중심으로 설명되어 있습니다. 참고해 주세요

Load balancing

DestinationRule이 정의되지 않은 서비스는 K8s Service의 L4 Load Balance가 적용된다.

Round Robin

DestinationRule에 trafficPolicy 항목을 따로 명시하지 않은 경우, 기본값으로 Round Robin을 사용한다.
아래는 Round Robin 방식이 적용된 DestinationRule 예시이다.


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews # name of a service from the service registry
#   trafficPolicy: # service-level routing policy
#       loadBalancer:
#         simple: ROUND_ROBIN
Random

건강한 상태의 host 중에서 하나를 무작위로 선택한다.


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
      loadBalancer:
        simple: RANDOM
Least Connection

두 개의 건강한 host를 무작위로 고른 뒤, 그중에서 현재 처리중인 request가 적은 host를 선택한다.


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy: # service-level routing policy
      loadBalancer:
        simple: LEAST_CONN
Subset 단위의 Load balancing 정책

전체 서비스에 기본 Load balancing 방식을 정하고, 다시 subset마다 별도의 방식을 부여하는 것도 가능하다.
예를 들어 다음과 같은 DestinationRule을 정의할 수 있다.


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
  subsets:
  - name: v1
    labels:
      version: v1
    trafficPolicy:
      loadBalancer:
        simple: LEAST_CONN
  - name: v2
    labels:
      version: v2
    trafficPolicy:
      loadBalancer:
        simple: RANDOM
  • 서비스 레벨에 ROUND_ROBIN 방식 적용
  • subset v1에 LEAST_CONN 방식 적용
  • subset v2에 RANDOM 방식 적용

Sticky Session

HTTP Cookie 값에 따라 항상 동일한 host와 연결되는 Sticky Session 방식을 사용할 수 있다.
다만 코드 레벨에서 헤더값에 대한 정의와 전달이 이루어저야 한다.
다음은 'user'라는 이름의 cookie에 대해 1800초 동안 Sticky Session을 유지하는 예시이다.


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
        consistentHash:
            httpCookie:
                name: user
                ttl: 1800s

Rate Limiting

Destination Rule을 통해 Connection Pool의 크기를 조정하여, DoS 공격 등을 차단할 수 있다.
HTTP 또는 TCP 레벨의 설정이 가능하며, 다음은 reviews 서비스의 동시 연결 갯수를 100개로 제한하고, timeout을 30ms로 설정한 예시이다.


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  tcp:
    maxConnections: 100
    connectTimeout: 30ms
    tcpKeepalive:
      time: 7200s
      interval: 75s

Circuit Breaker

Istio는 문제가 발생한 Pod(outlier)을 Load Balancing Pool로부터 잠시 제외시키는 Circuit Breaker 기능을 제공한다.
Outlier를 판단하는 기준은 다음과 같다.

  • HTTP 서비스 : 주어진 시간 동안 연속으로 5xx 에러를 리턴
  • TCP 서비스 : 계속해서 timeout 또는 연결 실패

다음은 1초마다 productpage 서비스 중 연속해서 2개 이상의 502, 503, 504 에러 코드를 발생시키는 Outlier를 탐지하여,
3분간 제외시키는 DestinationRule 예시이다.


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    outlierDetection:
      consecutiveErrors: 2
      interval: 1s
      baseEjectionTime: 3m 

K8s에서 기본 제공하는 Readiness Probe와 비슷한 개념이지만, 상대적으로 HTTP 에러에 더욱 민감하게 대응할 수 있기 때문에 두 기능을 제대로 활용할 경우 서비스 안정성을 더욱 향상시킬 수 있다.

3.4 서비스 Flow

  • 외부 통신

    • Client > LoadBalancer(NLB/ALB) > Istio-IngressGateway > Gateway (gw-hello) > Virtual Service (vs-e-hello-svc) > Service (svc-hello) > Pod (Hello-Server-v1, Hello-Server-v2)
  • 내부 통신

    • Pod > Virtual Service (vs-i-hello-svc) > Service (svc-hello) > Pod (Hello-Server-v1, Hello-Server-v2)
  • DestinationRule은 라우팅 발생 이후 트래픽 관련된 정책을 정의하는 Custom Resource Definition으로서
    Pod의 Label을 통해 서비스의 Subset을 분류하는 용으로 사용하거나 더욱 정교한 트래픽 관리 기능 수행시 활용 될 수 있다

3.5 Green Istio 설치하여 무중단 Upgrade

Istio Operator 설치

[참고] Istio Canary Upgrade https://istio.io/latest/docs/setup/install/operator/#canary-upgrade

  • 업그레이드할 Istio 버전의 istioctl을 설치합니다.
    전 단계에서 설치한 버전은 1.20.1이고, 새로운 버전은 1.23.2라고 가정합니다.

    
    ❯ ~/istio-1.20.1/bin/istioctl version
    client version: 1.20.1
    control plane version: 1.20.1
    data plane version: 1.20.1 (7 proxies)
  • istio 1.23.2 추가 Download

    export ISTIOV=1.23.2
    ❯ curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV sh -
    
    Downloading istio-1.23.2 from https://github.com/istio/istio/releases/download/1.23.2/istio-1.23.2-osx-arm64.tar.gz ...
    
    Istio 1.23.2 Download Complete!
    
    Istio has been successfully downloaded into the istio-1.23.2 folder on your system.
    
    Next Steps:
    See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.
    
    To configure the istioctl client tool for your workstation,
    add the /Users/sjkim/Labs/CloudNeta/kans3/kans-k3s-istio/demo/istio-1.23.2/bin directory to your environment path variable with:
         export PATH="$PATH:/Users/sjkim/Labs/CloudNeta/kans3/kans-k3s-istio/demo/istio-1.23.2/bin"
    
    Begin the Istio pre-installation check by running:
         istioctl x precheck
    
    Need more information? Visit https://istio.io/latest/docs/setup/install/
    
    ❯ ~/istio-1.23.2/bin/istioctl version
    
    client version: 1.23.2
    control plane version: 1.20.1
    data plane version: 1.20.1 (6 proxies)
  • --revision 파라미터를 붙여서 Isito Operator을 초기화 합니다.

    
    ❯ ~/istio-1.23.2/bin/istioctl operator init --revision 1-23-2
    Installing operator controller in namespace: istio-operator using image: docker.io/istio/operator:1.23.2
    Operator controller will watch namespaces: istio-system
    ✔ Istio operator installed ✅
    ✔ Installation complete
    
    ❯ ~/istio-1.23.2/bin/istioctl version
    client version: 1.23.2
    control plane version: 1.20.1
    data plane version: 1.20.1 (6 proxies)
  • istio-operator, istio-system pod 확인. istiod는 배포전 상태임
    ``bash

    ❯ kubectl -n istio-operator get pods
    NAME READY STATUS RESTARTS AGE
    istio-operator-1-20-1-7d8568f545-22ppf 1/1 Running 0 16m
    istio-operator-1-23-2-df775cc6f-dqjqw 1/1 Running 0 63s

    ❯ kubectl -n istio-system get pods
    NAME READY STATUS RESTARTS AGE
    istio-ingressgateway-5984c484cf-2xlqq 1/1 Running 0 15m
    istiod-1-20-1-69765f7479-ntnpr 1/1 Running 0 15m

Control Plane 설치

  • istio-1-23-2용 Manifests 내용

    cat istio-operator-1-23-2.yaml
    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      name: istiocontrolplane-1-23-2 # 수정
      namespace: istio-system
    spec:
      revision: 1-23-2               # 수정
      profile: default
      components:
        base:
          enabled: true
        pilot:
          enabled: true
          k8s:
            resources:
              requests:
                cpu: 100m
                memory: 128Mi
              limits:
                cpu: 500m
                memory: 256Mi
        egressGateways:
          - name: istio-egressgateway
            enabled: false
        ingressGateways:
          - name: istio-ingressgateway
            enabled: true
            label:
              istio: ingressgateway
            k8s:
              resources:
                requests:
                  cpu: 100m
                  memory: 128Mi
                limits:
                  cpu: 500m
                  memory: 256Mi
              hpaSpec:
                minReplicas: 1
              service:
                externalTrafficPolicy: Cluster
                type: NodePort
  • istio-1-23-2용 Manifests 적용


❯ ~/istio-1.23.2/bin/istioctl install -f istio-operator-1-23-2.yaml
        |\
        | \
        |  \
        |   \
      /||    \
     / ||     \
    /  ||      \
   /   ||       \
  /    ||        \
 /     ||         \
/______||__________\
____________________
  \__       _____/
     \_____/

This will install the Istio 1.23.2 "default" profile (with components: Istio core, Istiod, and Ingress gateways) into the cluster. Proceed? (y/N) y
✔ Istio core installed ⛵️
✔ Istiod installed 🧠
✔ Ingress gateways installed 🛬
✔ Installation complete
  • 위 Operator가 추가되면 새로운 Control Plane(istiod)가 추가되는 걸 확인할 수 있습니다.

Green Istio 버전으로 Data Plane Upgrade

이제 애플리케이션 POD가 실행되고 있는 Namespace에 istio.io/rev=1-23-2 label을 추가하고, 모든 Deployment를 재실행해야 합니다.

참고 자료 - Istio Data Plane 업그레이드

istiod와 달리 Istio Ingress/Egress Gateway는 버전마다 인스턴스를 추가 실행하지 않지만, 새로운 Istio Control Plane 버전을 사용하도록 내부에서 업그레이드됩니다.

▼ 확인하기


❯ ~/istio-1.23.2/bin/istioctl proxy-status | grep $(kubectl -n istio-system get pod -l app=istio-ingressgateway -o jsonpath='{.items..metadata.name}') | awk '{print $12}'

istiod-1-23-2-d7cc4c8d9-7jsg8

하지만 아직 워크로드 상에 동작하는 POD에는 새로운 버전의 Sidecar Proxy가 적용되어 있지 않습니다.
그래서 Namespace의 label을 기반으로 새로운 버전의 Sidecar proxy가 주입될 수 있도록 변경해야 합니다.
워크로드가 동작하는 Namespace에 istio-injection label을 제거하고, istio.io/rev=1-23-2label을 추가합니다.


❯ kubectl describe ns default
Name:         default
Labels:       istio.io/rev=1-20-1
              kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active

❯ kubectl label namespace default istio-injection- istio.io/rev=1-23-2 --overwrite
label "istio-injection" not found.
namespace/default labeled

❯ kubectl describe ns default
Name:         default
Labels:       istio.io/rev=1-23-2
              kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active

그 다음 해당 Namespace의 모든 POD에 새로운 버전의 Sidecar Proxy가 재주입될 수 있도록 재실행 합니다.


❯ kubectl get deployments.apps
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
details-v1       1/1     1            1           43m
productpage-v1   1/1     1            1           43m
ratings-v1       1/1     1            1           43m
reviews-v1       1/1     1            1           43m
reviews-v2       1/1     1            1           43m
reviews-v3       1/1     1            1           43m

❯ kubectl rollout restart deployment productpage-v1
deployment.apps/productpage-v1 restarted
❯ kubectl rollout restart deployment details-v1
deployment.apps/details-v1 restarted
❯ kubectl rollout restart deployment ratings-v1
deployment.apps/ratings-v1 restarted
❯ kubectl rollout restart deployment reviews-v1
deployment.apps/reviews-v1 restarted
❯ kubectl rollout restart deployment reviews-v2
deployment.apps/reviews-v2 restarted
❯ kubectl rollout restart deployment reviews-v3
deployment.apps/reviews-v3 restarted
❯ kubectl get pod -o wide
NAME                              READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
details-v1-59847698b8-w6vxr       2/2     Running   0          51s   172.16.0.10   k3s-s    <none>           <none>
productpage-v1-649f7489d4-lgq9w   2/2     Running   0          64s   172.16.1.14   k3s-w1   <none>           <none>
ratings-v1-6bbb88cbcb-8lm74       2/2     Running   0          40s   172.16.0.11   k3s-s    <none>           <none>
reviews-v1-cb4b4f55d-5lnb6        2/2     Running   0          21s   172.16.2.15   k3s-w2   <none>           <none>
reviews-v2-6dbdbd7646-5tkmw       2/2     Running   0          19s   172.16.1.15   k3s-w1   <none>           <none>
reviews-v3-6ccb68567d-rhq2f       2/2     Running   0          17s   172.16.2.16   k3s-w2   <none>           <none>

  • istio-proxy가 1.23.2 버전업
  • proxy-status 확인 시 istiod 도 1-23-2 임

3.6 구 버전 Istio Operator 제거하기

  • 업그레이드가 완료 됐기 때문에 구 버전의 Istio를 제거하도록 합니다.
    구 버전의 IstioOperator CRD를 삭제하면, 구 버전 Istio가 자동으로 제거 됩니다.

    
    ❯ kubectl get istiooperators.install.istio.io -n istio-system -A
    NAMESPACE      NAME                                              REVISION   STATUS   AGE
    istio-system   installed-state-istiocontrolplane-1-20-1-1-20-1   1-20-1              88m
    
    ❯ kubectl delete istiooperators.install.istio.io -n istio-system installed-state-istiocontrolplane-1-20-1-1-20-1
    
    istiooperator.install.istio.io "installed-state-istiocontrolplane-1-20-1-1-20-1" deleted
  • 위 명령어 실행 후 IstioOperator 가 삭제되지 않고, 대기하는 이유는 Finalizers: istio-finalizer.install.istio.io가 등록되어 있기 때문입니다.
    Finalizers 필드를 제거하면 IstioOperator의 삭제가 완료됩니다.

  • 그 다음 Isito Operator Controller 관련된 리소스를 삭제하기 위해 다음 명령어를 실행합니다.

    
    ❯ ~/istio-1.20.1/bin/istioctl operator remove --revision 1-20-1 --force
    
    Istio operator revision 1-20-1 will be removed from cluster, Proceed? (y/N) y
    Removing Istio operator...
      Removed Deployment:istio-operator:istio-operator-1-20-1.
      Removed Service:istio-operator:istio-operator-1-20-1.
      Removed ServiceAccount:istio-operator:istio-operator-1-20-1.
      Removed ClusterRole::istio-operator-1-20-1.
      Removed ClusterRoleBinding::istio-operator-1-20-1.
    ✔ Removal complete
    
    ## istiod-1-20-1이 실제 삭제되지 않아 수동으로 삭제
    ❯ kubectl get hpa -A
    NAMESPACE      NAME                   REFERENCE                         TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    istio-system   istio-ingressgateway   Deployment/istio-ingressgateway   cpu: 2%/80%   1         5         1          95m
    istio-system   istiod-1-20-1          Deployment/istiod-1-20-1          cpu: 2%/80%   1         5         1          95m
    istio-system   istiod-1-23-2          Deployment/istiod-1-23-2          cpu: 2%/80%   1         5         1          74m
    
    ❯ kubectl -n istio-system delete hpa istiod-1-20-1
    horizontalpodautoscaler.autoscaling "istiod-1-20-1" deleted
    
    ❯ kubectl -n istio-system get deployments.apps
    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    istio-ingressgateway   1/1     1            1           96m
    istiod-1-20-1          1/1     1            1           96m
    istiod-1-23-2          1/1     1            1           75m
    
    ❯ kubectl -n istio-system delete deployments.apps istiod-1-20-1
    deployment.apps "istiod-1-20-1" deleted
    
    ❯ kubectl -n istio-system get deployments.apps
    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    istio-ingressgateway   1/1     1            1           97m
    istiod-1-23-2          1/1     1            1           76m  
    
    ❯ kubectl -n istio-system get mutatingwebhookconfigurations.admissionregistration.k8s.io
    NAME                            WEBHOOKS   AGE
    istio-revision-tag-default      4          98m
    istio-sidecar-injector-1-20-1   2          98m
    istio-sidecar-injector-1-23-2   2          77m
    
    ❯ kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io istio-sidecar-injector-1-20-1
    
    mutatingwebhookconfiguration.admissionregistration.k8s.io "istio-sidecar-injector-1-20-1" deleted
    
    ❯ kubectl -n istio-system get validatingwebhookconfigurations.admissionregistration.k8s.io
    NAME                                  WEBHOOKS   AGE
    istio-validator-1-20-1-istio-system   1          100m
    istio-validator-1-23-2-istio-system   1          79m
    istiod-default-validator              1          119m
    
    ❯ kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io istio-validator-1-20-1-istio-system
    
    validatingwebhookconfiguration.admissionregistration.k8s.io "istio-validator-1-20-1-istio-system" deleted
    
    ❯ ~/istio-1.23.2/bin/istioctl version
    client version: 1.23.2
    control plane version: 1.23.2
    data plane version: 1.23.2 (7 proxies)
    
    ~/istio-1.23.2/bin/istioctl operator dump

4. Istio Add-on 설치해 보기

  • [참고] Istio - (2) Istio 설치(EKS) https://cwal.tistory.com/41, Istio - (3) Gateway와 VirtualService https://cwal.tistory.com/42

  • kubectl을 이용하여 Addons을 설치한다

    ls ~/istio-1.23.2/samples/addons/
    README.md       extras          grafana.yaml    jaeger.yaml     kiali.yaml      loki.yaml       prometheus.yaml
    
    ❯ kubectl apply -f ~/istio-1.23.2/samples/addons/
    serviceaccount/grafana created
    configmap/grafana created
    service/grafana created
    deployment.apps/grafana created
    configmap/istio-grafana-dashboards created
    configmap/istio-services-grafana-dashboards created
    deployment.apps/jaeger created
    service/tracing created
    service/zipkin created
    service/jaeger-collector created
    serviceaccount/kiali created
    configmap/kiali created
    clusterrole.rbac.authorization.k8s.io/kiali created
    clusterrolebinding.rbac.authorization.k8s.io/kiali created
    role.rbac.authorization.k8s.io/kiali-controlplane created
    rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
    service/kiali created
    deployment.apps/kiali created
    serviceaccount/loki created
    configmap/loki created
    configmap/loki-runtime created
    service/loki-memberlist created
    service/loki-headless created
    service/loki created
    statefulset.apps/loki created
    serviceaccount/prometheus created
    configmap/prometheus created
    clusterrole.rbac.authorization.k8s.io/prometheus created
    clusterrolebinding.rbac.authorization.k8s.io/prometheus created
    service/prometheus created
    deployment.apps/prometheus created
    
    ❯ kubectl -n istio-system get pod,svc
    NAME                                        READY   STATUS    RESTARTS   AGE
    pod/grafana-7f76bc9cdb-klthz                1/1     Running   0          75s
    pod/istio-ingressgateway-745f4bfb7b-4hqnn   1/1     Running   0          87m
    pod/istiod-1-23-2-d7cc4c8d9-7jsg8           1/1     Running   0          88m
    pod/jaeger-66f9675c7b-fxdt5                 1/1     Running   0          74s
    pod/kiali-65c46f9d98-gdjdv                  1/1     Running   0          74s
    pod/loki-0                                  1/1     Running   0          74s
    pod/prometheus-7979bfd58c-kp226             2/2     Running   0          74s
    
    NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                          AGE
    service/grafana                ClusterIP   10.10.200.182   <none>        3000/TCP                                         75s
    service/istio-ingressgateway   NodePort    10.10.200.210   <none>        15021:30814/TCP,80:32078/TCP,443:32089/TCP       109m
    service/istiod-1-20-1          ClusterIP   10.10.200.205   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP            109m
    service/istiod-1-23-2          ClusterIP   10.10.200.238   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP            88m
    service/jaeger-collector       ClusterIP   10.10.200.49    <none>        14268/TCP,14250/TCP,9411/TCP,4317/TCP,4318/TCP   74s
    service/kiali                  ClusterIP   10.10.200.185   <none>        20001/TCP,9090/TCP                               74s
    service/loki                   ClusterIP   10.10.200.228   <none>        3100/TCP,9095/TCP                                74s
    service/loki-headless          ClusterIP   None            <none>        3100/TCP                                         74s
    service/loki-memberlist        ClusterIP   None            <none>        7946/TCP                                         74s
    service/prometheus             ClusterIP   10.10.200.248   <none>        9090/TCP                                         74s
    service/tracing                ClusterIP   10.10.200.177   <none>        80/TCP,16685/TCP                                 74s
    service/zipkin                 ClusterIP   10.10.200.108   <none>        9411/TCP                                         74s

4.1 Dashboard

Grafana, Kiali, Jaeger 등 다양한 Dashboard를 조회할 수 있다.

4.2 Grafana with Prometheus

  • Grafana는 멀티플랫폼 오픈 소스 애널리틱스 및 인터랙티브 시각화 웹 애플리케이션이다.
    지원되는 데이터 소스에 연결될 때 웹의 차트, 그래프, 경보를 제공한다
  • Prometheus는 이벤트 모니터링 및 경고에 사용되는 무료 소프트웨어 애플리케이션입니다.
    유연한 쿼리 및 실시간 경고와 함께 HTTP 풀 모델을 사용하여 구축된 시계열 데이터베이스에 메트릭을 기록합니다.
  • 아래 명령어를 사용하여 Grafana Dashboard를 생성할 수 있다. 실행과 동시에 웹 브라우저를 통해 Dashboard로 자동 연결된다.
  • 명렁어

❯ istioctl dashboard grafana
  http://localhost:3000
  • GUI 화면

4.3 Kiali

  • Configure, visualize, validate and troubleshoot your mesh!

    • Kiali is a console for Istio service mesh. Kiali can be quickly installed as an Istio add-on, or trusted as a part of your production environment.
  • 명령어

    
    ❯ istioctl dashboard kiali
    http://localhost:20001/kiali
  • GUI 화면

5. 참조한 사이트

6. [부록] ASDF 이용하여 istioctl binary 설치/버전업

  • asdf는 https://asdf-vm.com/guide/getting-started.html

    • The Multiple Runtime Version Manager
    • Manage all your runtime versions with one tool!
  • asdf 설치

    git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0
    ❯ Bash & Git
    Add the following to ~/.bashrc:
    
    shell
    . "$HOME/.asdf/asdf.sh"
    Completions must be configured by adding the following to your .bashrc:
    
    shell
    . "$HOME/.asdf/completions/asdf.bash"asdf install istioctl latest
  • asdf plugin 설치

    
    ❯ asdf plugin list all
    ❯ asdf plugin add <plugin> [<url>]
    ❯ asdf plugin list [<flag>]
    
    ❯ asdf plugin-add istioctl https://github.com/virtualstaticvoid/asdf-istioctl.git
    ❯ asdf install istioctl latest
  • asdf list-all istioctl

    
    ❯ asdf list-all istioctl
    1.17.8
    ...
    1.21.0
    1.21.1
    1.21.2
    1.22.0-beta.0
    1.22.0-alpha.1
    
    ❯ asdf list istioctl
     *1.20.1
      1.21.1
      1.21.2  
    		```
    
  • istioctl version 확인


❯ istioctl version
client version: 1.20.1
control plane version: 1.21.2
data plane version: 1.21.2 (7 proxies)
  • asdf install istioctl 1.21.2

    
    ❯ asdf install istioctl 1.21.2
    Downloading istioctl from https://github.com/istio/istio/releases/download/1.21.2/istio-1.21.2-osx-arm64.tar.gz
    asdf: Warn: You have configured asdf to preserve downloaded files (with always_keep_download=yes or --keep-download). But
    asdf: Warn: the current plugin (istioctl) does not support that. Downloaded files will not be preserved.
    
  • asdf local istioctl 특정버전 적용

    
    ❯ asdf local istioctl 1.21.2
    
    ❯ istioctl version
    client version: 1.21.2
    control plane version: 1.21.2
    data plane version: 1.21.2 (7 proxies)
  • asdf uninstall istioctl 1.20.1

    
    ❯ asdf list istioctl
      1.20.1
      1.21.1
     *1.21.2
    ❯ asdf uninstall istioctl 1.20.1
    ❯ asdf uninstall istioctl 1.21.1
    ❯ asdf list istioctl
      1.21.2

긴글 읽어 주셔서 감사합니다. 업무에 도움이 되길 바랍니다.

profile
I'm SJ

0개의 댓글