istio operator 설치
istioctl 설치 - https://istio.io/latest/docs/setup/getting-started/#download
이후 CR 정의
사용하는 이유 중 하나
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의 변경 웹훅이 파드 생성 요청을 가로챔
- 자동 주입을 활성화하려면 네임스페이스에 istio-injection=enabled 레이블
- 파드 생성 및 웹훅 호출:
- 사용자가 파드를 생성하면 Kubernetes API 서버가 해당 요청을 Istio의 변경 웹훅으로 전달
-
CR의 sidecarInjectorWebhook.enabled: true로 활성화된 Istio의 MutatingWebhook(istio-sidecar-injector)이 호출
-
-
- 사용자가 파드를 생성하면 Kubernetes API 서버가 해당 요청을 Istio의 변경 웹훅으로 전달
- Envoy 사이드카 추가:
- 웹훅은 파드 사양에 Envoy 사이드카 컨테이너(istio-proxy)를 추가
- 컨테이너는 트래픽을 가로채고 관리
-
CR의 global.proxy.resources 설정에 따라 CPU와 메모리 요청/제한이 적용
- 웹훅은 파드 사양에 Envoy 사이드카 컨테이너(istio-proxy)를 추가
- 트래픽 리디렉션 설정:
- Istio CNI 비활성화 시
- istio-init 초기 컨테이너가 추가되어 iptables 규칙을 설정
- 이 컨테이너는 NET_ADMIN 및 NET_RAW 권한이 필요하며, 인바운드 및 아웃바운드 트래픽을 Envoy로 리디렉션
- 예를 들어, PREROUTING 체인은 ISTIO_INBOUND로 점프하고, ISTIO_IN_REDIRECT로 리디렉션되어 포트 15006으로 트래픽을 보냄
- Istio CNI 활성화 시:
Istio CNI 플러그인(노드마다 DaemonSet)이 네트워크 설정을 처리하여 트래픽을 Envoy로 리디렉션- 이는 초기 컨테이너를 제거하고 권한 문제를 줄임
- Istio CNI 비활성화 시
- 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가 이 암호화 과정을 처리
- 외부 클라이언트가 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를 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로 모든 워크로드가 새 제어 플레인과 정상 연결되었는지 확인.
'DevOps' 카테고리의 다른 글
elastalert2 적용하기 (0) | 2024.08.26 |
---|---|
다중화(Redundancy) - 3 웹 서버의 다중화 (IPVS를 이용한 LB) (1) | 2023.12.21 |
다중화(Redundancy) - 2. 웹서버 다중화(LB 없이) (0) | 2023.12.20 |
다중화(Redundancy) - 1. 다중화 개념 (1) | 2023.12.20 |
Redis 백업 (1) | 2023.07.08 |