Istio Hands-on Study [1기]

1주차 : Istio 첫걸음 (2) - Istio 1.17.8 설치

구구달스 2025. 4. 12. 18:32
CloudNet@ 가시다님이 진행하는 Istio Hands-on Study [1기]

 Kind : k8s(1.23.17) 배포

  • 책 실습 소스 코드 클론
ssoon@DESKTOP-UQRJB87:~$ git clone https://github.com/AcornPublishing/istio-in-action
Cloning into 'istio-in-action'...
remote: Enumerating objects: 448, done.
remote: Counting objects: 100% (448/448), done.
remote: Compressing objects: 100% (341/341), done.
remote: Total 448 (delta 76), reused 448 (delta 76), pack-reused 0 (from 0)
Receiving objects: 100% (448/448), 17.29 MiB | 21.49 MiB/s, done.
Resolving deltas: 100% (76/76), done.

ssoon@DESKTOP-UQRJB87:~$ cd istio-in-action/book-source-code-master

ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ pwd
/home/ssoon/istio-in-action/book-source-code-master
  • k8s(1.23.17) 배포
ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kind create cluster --name myk8s --image kindest/node:v1.23.17 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30000 # Sample Application (istio-ingrssgateway)
    hostPort: 30000
  - containerPort: 30001 # Prometheus
    hostPort: 30001
  - containerPort: 30002 # Grafana
    hostPort: 30002
  - containerPort: 30003 # Kiali
    hostPort: 30003
  - containerPort: 30004 # Tracing
    hostPort: 30004
  - containerPort: 30005 # kube-ops-view
    hostPort: 30005
  extraMounts:
  - hostPath: /home/ssoon/istio-in-action/book-source-code-master # 각자 자신의 pwd 경로로 설정
    containerPath: /istiobook
networking:
  podSubnet: 10.10.0.0/16
  serviceSubnet: 10.200.1.0/24
EOF
Creating cluster "myk8s" ...
 ✓ Ensuring node image (kindest/node:v1.23.17) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-myk8s"
You can now use your cluster with:

kubectl cluster-info --context kind-myk8s

Have a nice day! 👋
  • 설치 확인
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                                                             NAMES
cf68e895a8ef   kindest/node:v1.23.17   "/usr/local/bin/entr…"   42 seconds ago   Up 39 seconds   0.0.0.0:30000-30005->30000-30005/tcp, 127.0.0.1:45475->6443/tcp   myk8s-control-plane
  • 기본 Tool 설치
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ docker exec -it myk8s-control-plane sh -c 'apt update && apt install tree psmisc lsof wget bridge-utils net-tools dnsutils tcpdump ngrep iputils-ping git vim -y'

 Istio 1.17.8 설치

  • myk8s-control-plane 진입 후 -> 코드 파일들 마운트 확인
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ docker exec -it myk8s-control-plane bash
root@myk8s-control-plane:/# tree /istiobook/ -L 1
/istiobook/
|-- README.md
|-- appendices
|-- bin
|-- ch10
|-- ch11
|-- ch12
|-- ch13
|-- ch14
|-- ch2
|-- ch3
|-- ch4
|-- ch5
|-- ch6
|-- ch7
|-- ch8
|-- ch9
`-- services

17 directories, 1 file
  • 현재 셸 세션에서 ISTIOV라는 환경 변수를 1.17.8로 설정하여, Istio 버전을 지정합니다.
  • ISTIOV=1.17.8 설정을 /root/.bashrc 파일에 추가하여, 새 터미널 세션에서도 이 변수가 자동으로 적용되도록 합니다.
root@myk8s-control-plane:/# export ISTIOV=1.17.8
root@myk8s-control-plane:/# echo 'export ISTIOV=1.17.8' >> /root/.bashrc
  • Istio 웹사이트에서 제공하는 다운로드 스크립트를 가져와 실행하여, 지정한 버전($ISTIOV)의 Istio를 다운로드하고 설치합니다.
root@myk8s-control-plane:/# curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV sh -

Downloading istio-1.17.8 from https://github.com/istio/istio/releases/download/1.17.8/istio-1.17.8-linux-amd64.tar.gz ...

Istio 1.17.8 download complete!

...
  • istio-$ISTIOV 폴더의 구조를 트리 형태로 보여주며, 최대 2단계 깊이까지만 표시
root@myk8s-control-plane:/# tree istio-$ISTIOV -L 2
istio-1.17.8
|-- LICENSE
|-- README.md
|-- bin
|   `-- istioctl
|-- manifest.yaml
|-- manifests
|   |-- charts
|   |-- examples
|   `-- profiles
|-- samples
|   |-- README.md
|   |-- addons
|   |-- bookinfo
|   |-- certs
|   |-- cicd
|   |-- custom-bootstrap
|   |-- extauthz
|   |-- external
|   |-- grpc-echo
|   |-- health-check
|   |-- helloworld
|   |-- httpbin
|   |-- jwt-server
|   |-- kind-lb
|   |-- multicluster
|   |-- open-telemetry
|   |-- operator
|   |-- ratelimit
|   |-- security
|   |-- sleep
|   |-- tcp-echo
|   |-- wasm_modules
|   `-- websockets
`-- tools
    |-- _istioctl
    |-- certs
    `-- istioctl.bash

31 directories, 7 files
  • Istio 폴더 안에 있는 istioctl 실행 파일을 시스템의 /usr/local/bin/ 폴더로 복사하여 어디서든 실행할 수 있게 만듭니다.
  • istioctl 도구의 버전을 확인하며, 원격 Istio 클러스터에는 연결하지 않습니다.
root@myk8s-control-plane:/# cp istio-$ISTIOV/bin/istioctl /usr/local/bin/istioctl

root@myk8s-control-plane:/# istioctl version --remote=false
1.17.8
  • Istio 설치 전 클러스터 환경을 점검하여 Istio 설치에 필요한 조건이 충족되었는지 확인합니다.
root@myk8s-control-plane:/# istioctl x precheck
✔ No issues found when checking the cluster. Istio is safe to install or upgrade!
  To get started, check out https://istio.io/latest/docs/setup/getting-started/
  • Istio에서 사용 가능한 설치 프로파일(예: default, demo) 목록을 표시합니다
root@myk8s-control-plane:/# istioctl profile list
Istio configuration profiles:
    ambient
    default
    demo
    empty
    external
    minimal
    openshift
    preview
    remote
  • Istio를 기본 프로파일(default)로 클러스터에 설치하며, 확인 없이 자동으로 진행(-y)합니다.
root@myk8s-control-plane:/# istioctl install --set profile=default -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete                                                                                 Making this installation the default for injection and validation.

Thank you for installing Istio 1.17.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/hMHGiwZHPU7UQRWe9
  • istio-system 네임스페이스에 있는 모든 IstioOperator 리소스를 조회하여 이름, 리비전, 상태, 생성된 시간을 표시합니다.
root@myk8s-control-plane:/# kubectl get istiooperators -n istio-system
NAME              REVISION   STATUS   AGE
installed-state                       72s
  • Istio 1.17.8의 기본 프로파일로 클러스터에 설치된 설정을 정의합니다. 주요 설정으로는 ingress 게이트웨이 활성화, egress 게이트웨이 비활성화, Pilot 및 텔레메트리 활성화, 프록시 자동 주입, 그리고 리소스 제한 등이 포함됩니다. 대부분의 설정은 기본값을 사용하며, 클러스터 환경에 맞춘 최소한의 커스터마이징이 적용되었습니다.
root@myk8s-control-plane:/# kubectl get istiooperators -n istio-system -o yaml
...
  spec:
    components: #Istio의 개별 구성 요소(예: pilot, gateways 등)를 활성화하거나 비활성화하는 설정
      base:
        enabled: true #Istio의 기본 리소스(예: CRD)를 활성화
      cni:
        enabled: false #CNI(Container Network Interface) 플러그인을 비활성화
      egressGateways: #외부로 나가는 트래픽을 처리하는 egress 게이트웨이 설정
      - enabled: false #Egress 게이트웨이를 비활성화
        name: istio-egressgateway
      ingressGateways: #클러스터로 들어오는 트래픽을 처리하는 ingress 게이트웨이 설정
      - enabled: true #Ingress 게이트웨이를 활성화
        name: istio-ingressgateway
      istiodRemote:
        enabled: false #원격 Istiod 기능을 비활성화
      pilot:
        enabled: true #Istio의 제어 평면 구성 요소인 Pilot(istiod)을 활성화
    hub: docker.io/istio #Istio 이미지의 기본 레지스트리를 docker.io/istio로 설정
    meshConfig:
      defaultConfig:
        proxyMetadata: {} #프록시(Envoy)에 전달되는 기본 메타데이터를 비워둡니다.
      enablePrometheusMerge: true #Istio의 메트릭과 Prometheus 메트릭을 병합하도록 설정
    profile: default #Istio 설치 프로파일을 기본(default)으로 설정
    tag: 1.17.8 #사용할 Istio 이미지의 버전을 1.17.8로 지정
    
    values: #[Istio의 세부 설정 값을 정의하는 섹션]
      base:
        enableCRDTemplates: false #CRD 템플릿 생성을 비활성화합니다.
        validationURL: "" #CRD 유효성 검사를 위한 URL을 지정하지 않습니다.
      defaultRevision: "" #기본 Istio 리비전을 설정하지 않습니다.
      gateways:
        istio-egressgateway:
          autoscaleEnabled: true #Egress 게이트웨이의 오토스케일링을 활성화
          env: {} #Egress 게이트웨이에 추가 환경 변수를 설정하지 않습니다.
          name: istio-egressgateway
          secretVolumes: #Egress 게이트웨이에 마운트할 시크릿 볼륨 설정
          - mountPath: /etc/istio/egressgateway-certs #Egress 게이트웨이 인증서를 /etc/istio/egressgateway-certs에 마운트
            name: egressgateway-certs
            secretName: istio-egressgateway-certs
          - mountPath: /etc/istio/egressgateway-ca-certs #Egress 게이트웨이 CA 인증서를 /etc/istio/egressgateway-ca-certs에 마운트
            name: egressgateway-ca-certs
            secretName: istio-egressgateway-ca-certs
          type: ClusterIP #Egress 게이트웨이의 서비스 타입을 ClusterIP로 설정
        istio-ingressgateway:
          autoscaleEnabled: true #Ingress 게이트웨이의 오토스케일링을 활성화
          env: {} #Ingress 게이트웨이에 추가 환경 변수를 설정하지 않습니다.
          name: istio-ingressgateway
          secretVolumes: #Ingress 게이트웨이에 마운트할 시크릿 볼륨 설정
          - mountPath: /etc/istio/ingressgateway-certs #Ingress 게이트웨이 인증서를 /etc/istio/ingressgateway-certs에 마운트
            name: ingressgateway-certs
            secretName: istio-ingressgateway-certs
          - mountPath: /etc/istio/ingressgateway-ca-certs #Ingress 게이트웨이 CA 인증서를 /etc/istio/ingressgateway-ca-certs에 마운트
            name: ingressgateway-ca-certs
            secretName: istio-ingressgateway-ca-certs
          type: LoadBalancer #Ingress 게이트웨이의 서비스 타입을 LoadBalancer로 설정하여 외부 접근을 허용
      
      global: #[Istio의 전역 설정을 정의하는 섹션]
        configValidation: true #구성 유효성 검사를 활성화
        defaultNodeSelector: {}
        defaultPodDisruptionBudget: #PDB을 활성화하여 가용성을 보장
          enabled: true
        defaultResources:
          requests:
            cpu: 10m #파드의 기본 CPU 요청량을 10밀리코어로 설정
        imagePullPolicy: ""
        imagePullSecrets: [] #이미지 레지스트리 인증 시크릿을 설정하지 않습니다.
        istioNamespace: istio-system #Istio 리소스가 배포될 네임스페이스를 istio-system으로 지정
        istiod:
          enableAnalysis: false
        jwtPolicy: third-party-jwt
        logAsJson: false
        logging:
          level: default:info #로그 형식을 JSON이 아닌 일반 텍스트로 설정
        meshNetworks: {}
        mountMtlsCerts: false #mTLS 인증서 자동 마운트를 비활성화
        multiCluster:
          clusterName: ""
          enabled: false #멀티 클러스터 기능을 비활성화
        network: ""
        omitSidecarInjectorConfigMap: false
        oneNamespace: false
        operatorManageWebhooks: false
        pilotCertProvider: istiod #Pilot의 인증서 제공자를 istiod로 설정
        priorityClassName: ""
        proxy:
          autoInject: enabled #사이드카 자동 주입을 활성화
          clusterDomain: cluster.local #클러스터 내부 도메인을 cluster.local로 설정
          componentLogLevel: misc:error #프록시의 기타 로그 레벨을 error로 설정
          enableCoreDump: false 
          excludeIPRanges: ""
          excludeInboundPorts: ""
          excludeOutboundPorts: ""
          image: proxyv2 #프록시 이미지로 proxyv2를 사용
          includeIPRanges: '*' #프록시가 모든 IP 범위를 포함하도록 설정
          logLevel: warning #프록시의 로그 레벨을 warning으로 설정
          privileged: false
          readinessFailureThreshold: 30 #프록시 준비 상태 확인 실패 임계값을 30으로 설정
          readinessInitialDelaySeconds: 1 #프록시 준비 상태 확인 초기 지연을 1초로 설정
          readinessPeriodSeconds: 2 #프록시 준비 상태 확인 주기를 2초로 설정
          resources:
            limits:
              cpu: 2000m #프록시의 CPU 제한을 2000밀리코어로 설정
              memory: 1024Mi #프록시의 메모리 제한을 1024MiB로 설정
            requests:
              cpu: 100m #프록시의 CPU 요청량을 100밀리코어로 설정
              memory: 128Mi #프록시의 메모리 요청량을 128MiB로 설정
          statusPort: 15020 #프록시 상태 확인 포트를 15020으로 설정
          tracer: zipkin #프록시의 분산 추적 시스템을 Zipkin으로 설정
        
        proxy_init: #[프록시 초기화 컨테이너 설정]
          image: proxyv2
          resources:
            limits:
              cpu: 2000m #프록시 초기화의 CPU 제한을 2000밀리코어로 설정
              memory: 1024Mi #프록시 초기화의 메모리 제한을 1024MiB로 설정
            requests:
              cpu: 10m #프록시 초기화의 CPU 요청량을 10밀리코어로 설정
              memory: 10Mi #프록시 초기화의 메모리 요청량을 10MiB로 설정
        sds:
          token:
            aud: istio-ca #SDS(Secret Discovery Service)의 토큰 대상(audience)을 istio-ca로 설정
        sts:
          servicePort: 0 #STS(Security Token Service) 포트를 0으로 설정하여 비활성화
        tracer:
          datadog: {}
          lightstep: {}
          stackdriver: {}
          zipkin: {}
        useMCP: false
      istiodRemote:
        injectionURL: ""
      pilot:
        autoscaleEnabled: true #Pilot의 오토스케일링을 활성화
        autoscaleMax: 5 #Pilot 파드의 최대 오토스케일 수를 5로 설정
        autoscaleMin: 1 #Pilot 파드의 최소 오토스케일 수를 1로 설정
        configMap: true #Pilot 설정을 ConfigMap으로 관리하도록 설정
        cpu:
          targetAverageUtilization: 80 #Pilot의 CPU 평균 사용률 목표를 80%로 설정
        deploymentLabels: null
        enableProtocolSniffingForInbound: true #인바운드 트래픽의 프로토콜 탐지를 활성화
        enableProtocolSniffingForOutbound: true #아웃바운드 트래픽의 프로토콜 탐지를 활성화
        env: {}
        image: pilot #Pilot 이미지로 pilot을 사용
        keepaliveMaxServerConnectionAge: 30m #Pilot 서버 연결의 최대 유지 시간을 30분으로 설정
        nodeSelector: {}
        podLabels: {}
        replicaCount: 1 #Pilot 파드의 기본 복제본 수를 1로 설정
        traceSampling: 1 #추적 샘플링 비율을 1%로 설정
      telemetry:
        enabled: true #텔레메트리 기능을 활성화
        v2:
          enabled: true #Istio 텔레메트리 v2 기능을 활성화
          metadataExchange:
            wasmEnabled: false #메타데이터 교환을 위한 WASM 모듈을 비활성화
          prometheus:
            enabled: true #Prometheus 메트릭 수집을 활성화
            wasmEnabled: false
          stackdriver:
            configOverride: {}
            enabled: false #Stackdriver 통합을 비활성화
            logging: false
            monitoring: false
            topology: false
...
  • istio-system 네임스페이스에서 실행 중인 Istio 관련 리소스(파드, 서비스, 디플로이먼트, 레플리카셋, HPA, 엔드포인트, 서비스 어카운트, 컨피그맵, 시크릿, PDB)를 확인합니다. 
  • istio-ingressgateway와 istiod가 정상 실행 중이며, 기본 프로파일로 설치된 Istio 환경이 잘 구성되었음을 확인할 수 있습니다. 서비스는 LoadBalancer(외부 접근)와 ClusterIP(내부 접근)로 설정되었고, 오토스케일링과 가용성 보장이 적용되었습니다.
root@myk8s-control-plane:/# kubectl get all,svc,ep,sa,cm,secret,pdb -n istio-system
NAME                                       READY   STATUS    RESTARTS   AGE
pod/istio-ingressgateway-996bc6bb6-vgg65   1/1     Running   0          44s
pod/istiod-7df6ffc78d-5swsh                1/1     Running   0          59s

NAME                           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                                      AGE
service/istio-ingressgateway   LoadBalancer   10.200.1.29   <pending>     15021:30873/TCP,80:32037/TCP,443:32477/TCP   44s
service/istiod                 ClusterIP      10.200.1.45   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP        59s

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istio-ingressgateway   1/1     1            1           44s
deployment.apps/istiod                 1/1     1            1           59s

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/istio-ingressgateway-996bc6bb6   1         1         1       44s
replicaset.apps/istiod-7df6ffc78d                1         1         1       59s

NAME                                                       REFERENCE                         TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/istio-ingressgateway   Deployment/istio-ingressgateway   <unknown>/80%   1         5         1          44s
horizontalpodautoscaler.autoscaling/istiod                 Deployment/istiod                 <unknown>/80%   1         5         1          59s

NAME                             ENDPOINTS                                                     AGE
endpoints/istio-ingressgateway   10.10.0.6:15021,10.10.0.6:8080,10.10.0.6:8443                 44s
endpoints/istiod                 10.10.0.5:15012,10.10.0.5:15010,10.10.0.5:15017 + 1 more...   59s

NAME                                                  SECRETS   AGE
serviceaccount/default                                1         60s
serviceaccount/istio-ingressgateway-service-account   1         44s
serviceaccount/istio-reader-service-account           1         60s
serviceaccount/istiod                                 1         59s
serviceaccount/istiod-service-account                 1         60s

NAME                                            DATA   AGE
configmap/istio                                 2      59s
configmap/istio-ca-root-cert                    1      47s
configmap/istio-gateway-deployment-leader       0      47s
configmap/istio-gateway-status-leader           0      47s
configmap/istio-leader                          0      47s
configmap/istio-namespace-controller-election   0      47s
configmap/istio-sidecar-injector                2      59s
configmap/kube-root-ca.crt                      1      60s

NAME                                                      TYPE                                  DATA   AGE
secret/default-token-mml9m                                kubernetes.io/service-account-token   3      60s
secret/istio-ca-secret                                    istio.io/ca-root                      5      47s
secret/istio-ingressgateway-service-account-token-bvr5n   kubernetes.io/service-account-token   3      44s
secret/istio-reader-service-account-token-hhdhh           kubernetes.io/service-account-token   3      60s
secret/istiod-service-account-token-k99lq                 kubernetes.io/service-account-token   3      60s
secret/istiod-token-vrr4n                                 kubernetes.io/service-account-token   3      59s

NAME                                              MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
poddisruptionbudget.policy/istio-ingressgateway   1               N/A               0                     44s
poddisruptionbudget.policy/istiod                 1               N/A               0                     59s
  • Istio가 설치되면서 생성된 15개의 CRD를 보여줍니다. 이 CRD들은 Istio의 네트워킹, 보안, 텔레메트리, 확장 기능을 관리하는 데 핵심적인 역할을 합니다. 이는 Istio가 클러스터에 성공적으로 배포되었음을 확인하는 중요한 정보입니다.
root@myk8s-control-plane:/# kubectl get crd | grep istio.io | sort
authorizationpolicies.security.istio.io    2025-04-12T09:20:18Z
destinationrules.networking.istio.io       2025-04-12T09:20:18Z
envoyfilters.networking.istio.io           2025-04-12T09:20:18Z
gateways.networking.istio.io               2025-04-12T09:20:18Z
istiooperators.install.istio.io            2025-04-12T09:20:18Z
peerauthentications.security.istio.io      2025-04-12T09:20:18Z
proxyconfigs.networking.istio.io           2025-04-12T09:20:18Z
requestauthentications.security.istio.io   2025-04-12T09:20:18Z
serviceentries.networking.istio.io         2025-04-12T09:20:18Z
sidecars.networking.istio.io               2025-04-12T09:20:18Z
telemetries.telemetry.istio.io             2025-04-12T09:20:18Z
virtualservices.networking.istio.io        2025-04-12T09:20:18Z
wasmplugins.extensions.istio.io            2025-04-12T09:20:18Z
workloadentries.networking.istio.io        2025-04-12T09:20:18Z
workloadgroups.networking.istio.io         2025-04-12T09:20:18Z
  • authorizationpolicies.security.istio.io
    Istio의 인증 정책(Authorization Policy)을 정의하여 서비스 간 접근 제어를 설정합니다.
  • destinationrules.networking.istio.io
    트래픽의 라우팅 대상(서비스 버전, 서브셋 등)을 정의합니다.
  • envoyfilters.networking.istio.io
    Envoy 프록시의 동작을 커스터마이징하기 위한 필터를 정의합니다.
  • gateways.networking.istio.io
    클러스터의 ingress/egress 트래픽을 관리하는 게이트웨이를 설정합니다.
  • istiooperators.install.istio.io
    Istio 설치와 구성을 관리하는 IstioOperator 리소스를 정의합니다.
  • peerauthentications.security.istio.io
    서비스 간 상호 TLS(mTLS) 인증 정책을 설정합니다.
  • proxyconfigs.networking.istio.io
    Istio 프록시(Envoy)의 전역 설정을 정의합니다.
  • requestauthentications.security.istio.io
    JWT와 같은 요청 인증 정책을 정의합니다.
  • serviceentries.networking.istio.io
    외부 서비스(클러스터 외부)나 내부 서비스를 Istio 메시로 등록합니다.
  • sidecars.networking.istio.io
    특정 워크로드의 사이드카 프록시 동작(예: 트래픽 범위 제한)을 설정합니다.
  • telemetries.telemetry.istio.io
    메트릭, 로그, 추적 등 텔레메트리 설정을 정의합니다.
  • virtualservices.networking.istio.io
    트래픽 라우팅 규칙(예: A/B 테스트, 카나리 배포)을 정의합니다.
  • wasmplugins.extensions.istio.io
    WebAssembly(WASM) 플러그인을 통해 Envoy 기능을 확장합니다.
  • workloadentries.networking.istio.io
    비 쿠버네티스 워크로드(예: VM)를 Istio 메시로 통합합니다.
  • workloadgroups.networking.istio.io
    워크로드 그룹을 정의하여 외부 워크로드의 관리를 간소화합니다.

  • Istio의 samples/addons 디렉토리에 포함된 YAML 파일들을 적용하여 Istio와 함께 사용할 모니터링 및 추적 도구(Grafana, Jaeger, Kiali, Prometheus)를 설치합니다 
    • Grafana: Istio 메트릭을 시각화하는 대시보드 제공.
    • Jaeger: 서비스 간 요청의 분산 추적 제공.
    • Kiali: Istio 메시의 상태와 트래픽 흐름을 시각적으로 관리.
    • Prometheus: 메트릭 수집 및 모니터링.
root@myk8s-control-plane:/# kubectl apply -f istio-$ISTIOV/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-viewer 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/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

Grafana 관련 리소스:

  • serviceaccount/grafana created
    Grafana 애플리케이션을 실행하기 위한 서비스 어카운트가 생성되었습니다.
  • configmap/grafana created
    Grafana의 설정을 정의하는 ConfigMap이 생성되었습니다.
  • service/grafana created
    Grafana에 접근하기 위한 쿠버네티스 서비스가 생성되었습니다.
  • deployment.apps/grafana created
    Grafana를 실행하는 디플로이먼트가 생성되었습니다.
  • configmap/istio-grafana-dashboards created
    Istio 관련 메트릭을 시각화하는 Grafana 대시보드 설정이 생성되었습니다.
  • configmap/istio-services-grafana-dashboards created
    Istio 서비스별 대시보드를 위한 Grafana 설정이 생성되었습니다.

Jaeger 관련 리소스:

  • deployment.apps/jaeger created
    분산 추적 시스템인 Jaeger를 실행하는 디플로이먼트가 생성되었습니다.
  • service/tracing created
    Jaeger의 추적 데이터를 수집하기 위한 서비스가 생성되었습니다.
  • service/zipkin created
    Zipkin 프로토콜을 지원하는 Jaeger 서비스가 생성되었습니다.
  • service/jaeger-collector created
    Jaeger의 데이터 수집을 위한 콜렉터 서비스가 생성되었습니다.

Kiali 관련 리소스:

  • serviceaccount/kiali created
    Kiali 애플리케이션을 실행하기 위한 서비스 어카운트가 생성되었습니다.
  • configmap/kiali created
    Kiali의 설정을 정의하는 ConfigMap이 생성되었습니다.
  • clusterrole.rbac.authorization.k8s.io/kiali-viewer created
    Kiali의 읽기 전용 권한을 정의하는 클러스터 역할이 생성되었습니다.
  • clusterrole.rbac.authorization.k8s.io/kiali created
    Kiali의 전체 권한을 정의하는 클러스터 역할이 생성되었습니다.
  • clusterrolebinding.rbac.authorization.k8s.io/kiali created
    Kiali 서비스 어카운트에 클러스터 역할을 바인딩하여 권한을 부여했습니다.
  • role.rbac.authorization.k8s.io/kiali-controlplane created
    Kiali의 제어 평면 관련 권한을 정의하는 역할이 생성되었습니다.
  • rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
    Kiali 서비스 어카운트에 제어 평면 역할을 바인딩했습니다.
  • service/kiali created
    Kiali에 접근하기 위한 쿠버네티스 서비스가 생성되었습니다.
  • deployment.apps/kiali created
    Kiali 대시보드를 실행하는 디플로이먼트가 생성되었습니다.

Prometheus 관련 리소스:

  • serviceaccount/prometheus created
    Prometheus 애플리케이션을 실행하기 위한 서비스 어카운트가 생성되었습니다.
  • configmap/prometheus created
    Prometheus의 설정(예: 스크래핑 규칙)을 정의하는 ConfigMap이 생성되었습니다.
  • clusterrole.rbac.authorization.k8s.io/prometheus created
    Prometheus가 메트릭을 수집할 수 있도록 클러스터 권한을 정의했습니다.
  • clusterrolebinding.rbac.authorization.k8s.io/prometheus created
    Prometheus 서비스 어카운트에 클러스터 권한을 바인딩했습니다.
  • service/prometheus created
    Prometheus에 접근하기 위한 쿠버네티스 서비스가 생성되었습니다.
  • deployment.apps/prometheus created
    Prometheus 메트릭 수집 서버를 실행하는 디플로이먼트가 생성되었습니다.

  • istio-system 네임스페이스에서 Istio 핵심 컴포넌트(istio-ingressgateway, istiod)와 애드온 도구 (grafana, jaeger, kiali, prometheus)의 파드가 모두 정상적으로 실행 중임을 확인니다.
root@myk8s-control-plane:/# kubectl get pod -n istio-system
NAME                                   READY   STATUS    RESTARTS   AGE
grafana-b854c6c8-pfncw                 1/1     Running   0          43s
istio-ingressgateway-996bc6bb6-vgg65   1/1     Running   0          2m6s
istiod-7df6ffc78d-5swsh                1/1     Running   0          2m21s
jaeger-5556cd8fcf-4tftt                1/1     Running   0          43s
kiali-648847c8c4-sb6n8                 1/1     Running   0          43s
prometheus-7b8b9dd44c-6fbvs            2/2     Running   0          43s
  • myk8s-control-plane 호스트의 루트 셸 세션을 종료하고, ubuntu 사용자의 셸로 돌아갑니다.
root@myk8s-control-plane:/# exit
exit
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$
  • istio-system 네임스페이스의 istio ConfigMap을 보여주며, Istio 메시의 핵심 설정(프록시 발견 주소, Zipkin 추적, Prometheus 통합, 네임스페이스, 신뢰 도메인 등)을 확인합니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-UQRJB87:~/istio-in-action/book-source-code-master$ kubectl get cm -n istio-system istio -o yaml | kubectl neat
apiVersion: v1
data:
  mesh: |-
    defaultConfig:
      discoveryAddress: istiod.istio-system.svc:15012 #프록시가 Istio 제어 평면(Istiod)과 통신할 주소와 포트를 지정
      proxyMetadata: {}
      tracing:
        zipkin:
          address: zipkin.istio-system:9411 #추적 데이터를 Zipkin 서비스(istio-system의 zipkin 서비스, 포트 9411)로 전송하도록 설정
    enablePrometheusMerge: true #Istio 메트릭과 Prometheus 메트릭을 병합하도록 활성화
    rootNamespace: istio-system #Istio의 루트 네임스페이스를 istio-system으로 설정 
    trustDomain: cluster.local #Istio의 보안 신뢰 도메인을 cluster.local로 설정
  meshNetworks: 'networks: {}'
kind: ConfigMap
metadata:
  labels:
    install.operator.istio.io/owning-resource: unknown #ConfigMap을 생성한 리소스가 명시되지 않았음
    install.operator.istio.io/owning-resource-namespace: istio-system
    istio.io/rev: default #Istio 리비전이 기본값(default)으로 설정
    operator.istio.io/component: Pilot #ConfigMap이 Istio의 Pilot 컴포넌트(제어 평면)와 관련 있음
    operator.istio.io/managed: Reconcile #Istio 오퍼레이터가 이 리소스를 관리하며 조정(Reconcile) 중
    operator.istio.io/version: 1.17.8
    release: istio
  name: istio
  namespace: istio-system #ConfigMap이 속한 네임스페이스는 istio-system