DevOps

DevOps - istio operator

게임이 더 좋아 2025. 4. 12. 16:30
반응형
728x170


istio operator 설치

istioctl 설치 - https://istio.io/latest/docs/setup/getting-started/#download

이후 CR 정의

 

사용하는 이유 중 하나

Istio Operator는 선언적 설정으로 변경 추적과 검증이 쉬워 GitOps와 통합이 용이하며, 설치와 업그레이드 관리가 간편

 


 

 

IstioOperator란?

Kubernetes CR(Custom Resource)로 정의되며, Istio 서비스 메시의 모든 설정과 구성을 포함

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system  # Istio 컴포넌트가 배포될 네임스페이스
  name: custom-install     # CR 이름
spec:
  profile: default         # 설치 프로필 (default, minimal, demo 등)
  components: {}           # 컴포넌트별 설정
  meshConfig: {}           # 메시 전체 설정
  values: {}               # Helm 값 오버라이드 (레거시)

https://github.com/istio/istio/tree/master/operator

 

istio/operator at master · istio/istio

Connect, secure, control, and observe services. Contribute to istio/istio development by creating an account on GitHub.

github.com

 

 


 

Istio Operator Component

 

components - https://istio.io/latest/docs/setup/additional-setup/customize-installation/#identify-an-istio-component

 

istiod (Pilot) 서비스 디스커버리, 트래픽 관리, 설정 배포, 인증서 관리.
Envoy Sidecars 각 파드의 트래픽 가로채기, 라우팅, 보안 정책 적용.
Ingress Gateway 외부 트래픽 수신, Istio 설정 기반 라우팅.
Egress Gateway 외부 서비스 호출 관리, 보안 및 라우팅 정책 적용.
CNI 네트워크 설정, 트래픽을 사이드카로 리디렉션.

 

v1.20 이상에서 작동하는 CR

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio-control-plane                        # IstioOperator 리소스 이름
  namespace: istio-system                          # Istio가 설치될 네임스페이스

spec:
  revision: stable                                 # revision 기반 설치 (권장). in-place 설치 시 생략 가능
  profile: default                                 # 설치 프로파일 종류: default, minimal, ambient 등

  components:
    base:
      enabled: true                                # 공통 리소스(CRD, ClusterRole 등) 설치

    pilot:
      enabled: true                                # istiod 제어 플레인 활성화
      k8s:
        replicaCount: 3                            # 고가용성을 위한 복제본 수 설정 (기본은 1)
        hpaSpec:
          minReplicas: 2
          maxReplicas: 5
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
          limits:
            cpu: 1000m
            memory: 1Gi
        nodeSelector:
          istio: control-plane
        tolerations:
        - key: "dedicated"
          operator: "Equal"
          value: "istio"
          effect: "NoSchedule"

    ingressGateways:
    - name: istio-ingressgateway
      enabled: true
      label:
        istio: ingressgateway
      k8s:
        replicaCount: 2
        service:
          type: LoadBalancer
          ports:
          - name: http2
            port: 80
            targetPort: 8080
          - name: https
            port: 443
            targetPort: 8443
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 500m
            memory: 512Mi

    egressGateways:
    - name: istio-egressgateway
      enabled: true
      k8s:
        replicaCount: 1

    cni:
      enabled: true                                # CNI 플러그인 사용 (initContainer 없이 프록시 트래픽 리디렉션)
      namespace: istio-system
      k8s:
        nodeSelector:
          kubernetes.io/os: linux

  values:
    global:
      istioNamespace: istio-system
      proxy:
        autoInject: enabled                        # 네임스페이스 라벨 기반 자동 사이드카 주입 활성화
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 300m
            memory: 256Mi
      logAsJson: true                              # 로그를 JSON 포맷으로 출력 (ELK, Fluent 등과 연계 시 권장)
      tracer:
        zipkin:
          address: zipkin.istio-system:9411        # 트레이싱 백엔드 (예: Zipkin)

    pilot:
      autoscaleEnabled: true
      autoscaleMin: 2
      autoscaleMax: 5
      traceSampling: 50.0                          # 트레이싱 샘플링 비율 (%)

    gateways:
      istio-ingressgateway:
        sds:
          enabled: true                            # Secret Discovery Service(SDS)를 통한 인증서 관리
        env:
          ISTIO_META_ROUTER_MODE: "sni-dnat"       # HTTPS 트래픽 라우팅을 위한 설정
        secretVolumes:
        - name: ingressgateway-certs
          secretName: istio-ingressgateway-certs
          mountPath: /etc/istio/ingressgateway-certs
        serviceAnnotations:
          service.beta.kubernetes.io/aws-load-balancer-type: nlb

    meshConfig:
      enableAutoMtls: true                         # PeerAuthentication 없이도 자동 mTLS 활성화
      accessLogFile: /dev/stdout                   # 프록시 로그를 표준 출력으로 노출
      defaultConfig:
        proxyMetadata:
          ISTIO_META_DNS_CAPTURE: "true"
          ISTIO_META_DNS_AUTO_ALLOCATE: "true"
        tracing:
          sampling: 50                             # Envoy 프록시 측 샘플링 비율

    sidecarInjectorWebhook:
      enabled: true                                # 사이드카 주입 MutatingWebhook 설정
      objectSelector:
        autoInject: true                           # Pod 라벨 기반으로 주입 조건 제어

 

 

 

 

 

 


 

Istio Operator 메커니즘

 

envoy proxy 주입

 

  • 네임스페이스 레이블링:
    • 자동 주입을 활성화하려면 네임스페이스에 istio-injection=enabled 레이블
      • Istio의 변경 웹훅이 파드 생성 요청을 가로챔

 

  • 파드 생성 및 웹훅 호출:
    • 사용자가 파드를 생성하면 Kubernetes API 서버가 해당 요청을 Istio의 변경 웹훅으로 전달
      • CR의 sidecarInjectorWebhook.enabled: true로 활성화된 Istio의 MutatingWebhook(istio-sidecar-injector)이 호출
      •  
        istio-sidecar-injector ConfigMap에 정의된 템플릿을 기반으로 파드 사양을 수정

 

  • Envoy 사이드카 추가:
    • 웹훅은 파드 사양에 Envoy 사이드카 컨테이너(istio-proxy)를 추가
      • 컨테이너는 트래픽을 가로채고 관리
    • CR의 global.proxy.resources 설정에 따라 CPU와 메모리 요청/제한이 적용 

 

 

  • 트래픽 리디렉션 설정:
    • Istio CNI 비활성화 시
      • istio-init 초기 컨테이너가 추가되어 iptables 규칙을 설정
      • 이 컨테이너는 NET_ADMIN 및 NET_RAW 권한이 필요하며, 인바운드 및 아웃바운드 트래픽을 Envoy로 리디렉션
      • 예를 들어, PREROUTING 체인은 ISTIO_INBOUND로 점프하고, ISTIO_IN_REDIRECT로 리디렉션되어 포트 15006으로 트래픽을 보냄
    • Istio CNI 활성화 시:
      Istio CNI 플러그인(노드마다 DaemonSet)이 네트워크 설정을 처리하여 트래픽을 Envoy로 리디렉션
      • 이는 초기 컨테이너를 제거하고 권한 문제를 줄임

 

  • Envoy 구성:
    • Envoy 사이드카가 시작되면 Istio 제어 플레인(istiod)에 연결되어 xDS 프로토콜을 통해 구성(라우팅, 보안 정책 등)을 수신

 

 

 

관련 Custom Resource

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio-control-plane
  namespace: istio-system

spec:
  values:
    global:
      proxy:
        autoInject: enabled                        # 네임스페이스 라벨 기반 자동 사이드카 주입 활성화
        resources:
          requests:
            cpu: 100m                              # 사이드카 프록시(Envoy)의 최소 CPU 요청량
            memory: 128Mi                          # 최소 메모리 요청량
          limits:
            cpu: 300m                              # CPU 상한
            memory: 256Mi                          # 메모리 상한
    sidecarInjectorWebhook:
      enabled: true                                # 사이드카 주입 MutatingWebhook 설정
      ~~objectSelector:~~
        ~~autoInject: true~~                       # ~~Pod 라벨 기반으로 주입 조건 제어, 유효하지 않음~~
    cni:
      enabled: true                                # CNI 플러그인 사용 (initContainer 없이 프록시 트래픽 리디렉션)
      k8s:
        nodeSelector:
          kubernetes.io/os: linux                # CNI 데몬셋을 Linux 노드에 배포

 

관련 문제

  • Istio CNI를 사용하는 경우, 모든 노드에 CNI 플러그인이 제대로 설치되고 구성되었는지 확인
  • Istio와 Kubernetes 버전 간 호환성을 점검
  • Istio CNI를 사용하는 경우, 모든 노드에 CNI 플러그인이 제대로 설치되고 구성되었는지 확인
  • global.proxy.resources에서 정의된 요청/제한은 모든 Envoy 사이드카에 적용
  • 특정 파드에서 주입을 제외하려면 sidecar.istio.io/inject: "false" 어노테이션을 추가
  • istioctl proxy-status로 Envoy가 istiod와 정상적으로 연결되었는지 점검
     
  •  

 

 

istio 보안통신 

보안 통신(mTLS)은 Istio의 강력한 기능 중 하나로, Zero-Trust 보안 모델을 실현하는 핵심 구성 요소

애플리케이션 코드 수정 없이 보안을 강화

AuthorizationPolicy를 통해 세밀한 접근 제어를 제공

 

인증서 제공:

  • Istio 제어 플레인(istiod)은 내부 CA(Certificate Authority)로 작동
  • 파드 시작 시 Envoy 사이드카가 서비스 계정 토큰을 사용해 인증서를 요청
  • istiod는 서비스 계정을 검증하고, 서비스 ID가 포함된 인증서를 발급

 

mTLS 핸드셰이크:

  • 서비스 A가 서비스 B와 통신하려면, 각 Envoy 사이드카가 mTLS 핸드셰이크를 수행
  • Envoy는 istiod로부터 받은 인증서와 개인 키를 사용하여 상호 인증을 진행
    • 상대방의 ID를 검증

 

트래픽 암호화:

  • 핸드셰이크가 성공하면, 서비스 간 모든 트래픽은 TLS로 암호화되어 전송
  • global.proxy.autoInject: enabled로 주입된 Envoy가 이 암호화 과정을 처리

 

Ingress Gateway의 TLS 처리:
  • 외부 클라이언트가 HTTPS로 접근하면, CR의 gateways.istio-ingressgateway.sds.enabled: true로 활성화된 SDS가 동적으로 TLS 인증서를 제공
  • secretVolumes에 지정된 인증서(istio-ingressgateway-certs)를 사용하여 TLS 연결을 종료하고, 내부 서비스로 mTLS 연결을 시작

 

 

정책 적용:

  • PeerAuthentication 리소스를 통해 mTLS 모드(PERMISSIVE, STRICT, DISABLE)를 설정
    • STRICT: mTLS만 허용.
    • PERMISSIVE: mTLS와 평문 모두 허용(전환 시 유용).
    • DISABLE: mTLS 비활성화
  • AuthorizationPolicy를 통해 ID 기반 접근 제어 가능
    • 예를 들어 특정 서비스에 대한 접근만 허용.

 

 

모니터링 및 디버깅
  • CR의 accessLogFile: /dev/stdout은 Envoy의 액세스 로그를 수집하여 보안 이벤트(예: 인증 실패)를 추적
  • tracing.sampling: 50은 트레이싱 데이터를 생성하여 보안 문제 디버깅에 활용

 

 

관련 문제

  • Istio CA가 안전하게 구성되었는지 확인
  • 인증서 만료 및 회전을 관리, 기본적으로 Istio는 자동 회전을 지원
  • 보안 문제 디버깅 시 istioctl 도구를 활용
    • 예를 들어 istioctl proxy-status로 연결 상태 확인.

 

 


 

istio upgrade

 

In-place 업그레이드 기존 컴포넌트를 직접 새 버전으로 덮어쓰는 방식
Canary 업그레이드(기본) 새로운 제어 플레인을 병렬 배포한 뒤 점진적으로 워크로드를 이전하는 방식

 

 

  • 사전 점검:
    • 현재 Istio 버전과 새 버전 간 호환성을 확인
      • istioctl x precheck 명령어를 실행
      • No issues found when checking Istio 1.24.1 with target version 1.25.1.
    • CR의 revision 필드를 확인하여 기존 리비전(롤백위함)

 

 

새 버전의 Istio를 istio-system-canary 등 별도의 네임스페이스에 설치

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio-control-plane-canary
  namespace: istio-system-canary
spec:
  profile: default
  revision: {?}
  # 필요한 설정은 기존 버전과 유사하게 맞춤

 

  • revision를 지정하면 이름이 붙은 revision 기반 Istiod 인스턴스가 생성됨.
  • 이렇게 하면 기존 istiod와 병렬로 실행되므로 서로 영향 없이 테스트 가능

 

일부 워크로드에 새로운 revision 적용

이제 특정 네임스페이스나 애플리케이션만 Control Plane을 사용하도록 설정

kubectl label namespace <your-namespace> istio.io/rev=canary --overwrite

해당 네임스페이스 내의 워크로드를 재시작하면 canary revision의 istiod에 연결된 사이드카(proxy) 를 사용

파드가 새로운 리비전의 사이드카를 사용하는지 확인

 

 

 


 

 

  • 새 제어 플레인 설치:
    • 새 Istio 버전에 맞는 IstioOperator CR을 작성
    • CR의 components.pilot 설정은 새 istiod의 안정성을 보장
    • 기존 제어 플레인은 계속 실행 중이며, 워크로드와 연결 유지

 

  • 워크로드 마이그레이션:
    • 워크로드를 새 제어 플레인으로 점진적으로 전환
    • 네임스페이스에 istio.io/rev=<new-revision> 레이블을 추가
    • 파드를 재시작하여 새 리비전과 연결
    • istioctl proxy-status로 Envoy 프록시가 새 istiod와 연결되었는지 확인
    • CR의 ingressGateways, egressGateways 설정은 데이터 플레인 호환성을 유지하여 트래픽 중단을 방지

 

  • 기본 리비전 설정:
    • 모든 워크로드가 새 제어 플레인으로 마이그레이션된 후, 기본 리비전을 업데이트
    • 새 파드가 자동으로 새 리비전과 연결

 

 

  • 사후 점검:
    • istioctl proxy-status로 모든 워크로드가 새 제어 플레인과 정상 연결되었는지 확인.

 

업그레이드 실패 시 롤백 계획
728x90
반응형
그리드형