Ssoon

[8주차] 가상 머신 워크로드를 Mesh 에 통합 : VM으로 Mesh 확장 본문

Istio Hands-on Study [1기]

[8주차] 가상 머신 워크로드를 Mesh 에 통합 : VM으로 Mesh 확장

구구달스 2025. 5. 26. 10:42

🌐 서비스 메시 준비하기 : istio, app

🛠️ istio 1.17.8 설치

[istioctl 설치]
export ISTIOV=1.17.8
echo 'export ISTIOV=1.17.8' >> /root/.bashrc
curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV sh -
cp istio-$ISTIOV/bin/istioctl /usr/local/bin/istioctl
istioctl version --remote=false

[클러스터와 가상머신이 다른 네트워크에 있으므로, 이스티오를 설치한 네임스페이스에 네트워크 정보 레이블을 지정]
kubectl create namespace istio-system
kubectl label namespace istio-system topology.istio.io/network=west-network

[demo 프로파일 컨트롤 플레인 배포]
# cat istio-in-action/book-source-code-master/ch13/controlplane/cluster-in-west-network.yaml
apiVersion: install.istio.io/v1alpha1
metadata:
  name: istio-controlplane
  namespace: istio-system
kind: IstioOperator
spec:
  profile: demo
  components:
    egressGateways:
    - name: istio-egressgateway
      enabled: false
  values:
    global:
      meshID: usmesh
      multiCluster:
        clusterName: west-cluster
      network: west-network
      
# istioctl install -f istio-in-action/book-source-code-master/ch13/controlplane/cluster-in-west-network.yaml --set values.global.proxy.privileged=true -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

# 보조 도구 설치
kubectl apply -f istio-$ISTIOV/samples/addons

# 실습을 위한 네임스페이스 설정
kubectl create ns istioinaction
kubectl label namespace istioinaction istio-injection=enabled

# istio-ingressgateway 서비스 : NodePort 변경 및 nodeport 지정 변경 , externalTrafficPolicy 설정 (ClientIP 수집)
kubectl patch svc -n istio-system istio-ingressgateway -p '{"spec": {"type": "NodePort", "ports": [{"port": 80, "targetPort": 8080, "nodePort": 30000}]}}'
kubectl patch svc -n istio-system istio-ingressgateway -p '{"spec": {"type": "NodePort", "ports": [{"port": 443, "targetPort": 8443, "nodePort": 30005}]}}'
kubectl patch svc -n istio-system istio-ingressgateway -p '{"spec":{"externalTrafficPolicy": "Local"}}'

# NodePort 변경 및 nodeport 30001~30003으로 변경 : prometheus(30001), grafana(30002), kiali(30003), tracing(30004)
kubectl patch svc -n istio-system prometheus -p '{"spec": {"type": "NodePort", "ports": [{"port": 9090, "targetPort": 9090, "nodePort": 30001}]}}'
kubectl patch svc -n istio-system grafana -p '{"spec": {"type": "NodePort", "ports": [{"port": 3000, "targetPort": 3000, "nodePort": 30002}]}}'
kubectl patch svc -n istio-system kiali -p '{"spec": {"type": "NodePort", "ports": [{"port": 20001, "targetPort": 20001, "nodePort": 30003}]}}'
kubectl patch svc -n istio-system tracing -p '{"spec": {"type": "NodePort", "ports": [{"port": 80, "targetPort": 16686, "nodePort": 30004}]}}'

🛠️ cool-store 서비스/gw/vs 배포 및 http 요청 확인

  • cool-store 서비스/gw/vs 배포
[cool-store 서비스/gw/vs 배포]
# kubectl -n istioinaction apply -f istio-in-action/book-source-code-master/ch12/webapp-deployment-svc.yaml
kubectl -n istioinaction apply -f istio-in-action/book-source-code-master/ch12/webapp-gw-vs.yaml
kubectl -n istioinaction apply -f istio-in-action/book-source-code-master/ch12/catalog.yaml
serviceaccount/webapp created
service/webapp created
deployment.apps/webapp created
gateway.networking.istio.io/coolstore-gateway created
virtualservice.networking.istio.io/webapp-virtualservice created
serviceaccount/catalog created
service/catalog created
deployment.apps/catalog createdml

# kc get deploy,svc -n istioinaction
kc get gw,vs -n istioinaction
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/catalog   1/1     1            1           17s
deployment.apps/webapp    1/1     1            1           18s

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/catalog   ClusterIP   10.10.200.140   <none>        80/TCP    17s
service/webapp    ClusterIP   10.10.200.79    <none>        80/TCP    18s
NAME                                            AGE
gateway.networking.istio.io/coolstore-gateway   17s

NAME                                                       GATEWAYS                HOSTS                         AGE
virtualservice.networking.istio.io/webapp-virtualservice   ["coolstore-gateway"]   ["webapp.istioinaction.io"]   17s
  • http 요청 확인
    (⎈|default:N/A) root@k3s-s:~# curl -s -H "Host: webapp.istioinaction.io" http://192.168.10.10:30000/api/catalog/items/1 | jq
    {
      "id": 1,
      "color": "amber",
      "department": "Eyewear",
      "name": "Elinor Glasses",
      "price": "282.00"
    }
    
    root@forum-vm:~# APP_IP=43.202.0.70
    root@forum-vm:~# curl -s -H "Host: webapp.istioinaction.io" http://$APP_IP:30000/api/catalog/items/1 | jq
    {
      "id": 1,
      "color": "amber",
      "department": "Eyewear",
      "name": "Elinor Glasses",
      "price": "282.00"
    }
    
    ssoon@DESKTOP-QMAIJOE:~$ APP_IP=43.202.0.70
    ssoon@DESKTOP-QMAIJOE:~$ curl -s -H "Host: webapp.istioinaction.io" http://$APP_IP:30000/api/catalog/items/1 | jq
    {
      "id": 1,
      "color": "amber",
      "department": "Eyewear",
      "name": "Elinor Glasses",
      "price": "282.00"
    }

🌐 VM을 Service Mesh에 통합하기


🚀 VM 통합 기능 활성화

  • VM을 service mesh에 통합하는 기능은 beta phase에 있으며, 기본적으로 비활성화되어 있습니다.
    이를 활성화하려면 Istio의 설정을 업데이트해야 합니다.
    업데이트는 IstioOperator 정의를 사용해 진행하며, 다음과 같은 기능을 활성화합니다:
    • Workload Auto Registration: VM의 워크로드가 자동으로 control plane에 등록됩니다.
    • Health Checks: VM 워크로드의 상태를 주기적으로 확인합니다.
    • DNS Query Capture: DNS 쿼리를 캡처해 sidecar의 DNS proxy로 리다이렉트합니다.
 VM 통합을 위해
workload auto registration, health checks, DNS query capture 기능을 활성화해야 합니다.

🛠️ Istio Control Plane 업데이트

  • Istio 설정을 업데이트하기 위해 아래 IstioOperator 정의를 사용합니다.
    이 정의는 필요한 기능을 활성화하고, 클러스터와 네트워크 정보를 지정합니다.
(⎈|default:N/A) root@k3s-s:~# cat istio-in-action/book-source-code-master/ch13/controlplane/cluster-in-west-network-with-vm-features.yaml
apiVersion: install.istio.io/v1alpha1
metadata:
  name: istio-controlplane
  namespace: istio-system
kind: IstioOperator
spec:
  profile: demo
  components:
    egressGateways: #Istio의 이그레스 게이트웨이(클러스터 외부로 나가는 트래픽을 제어하는 게이트웨이) 설정을 정의
    - name: istio-egressgateway
      enabled: false #이그레스 게이트웨이를 비활성화
  meshConfig:
    defaultConfig: # 메시 내의 모든 워크로드에 적용
      proxyMetadata:
        ISTIO_META_DNS_CAPTURE: "true" #사이드카 프록시가 DNS 쿼리를 가로채도록(capture) 지시
  values:
    pilot: # Istio의 컨트롤 플레인 컴포넌트 중 하나인 Pilot에 대한 설정을 정의
      env: # Pilot 컨테이너에 설정될 환경 변수를 정의
        PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION: true
        # Pilot이 WorkloadEntry 리소스의 자동 등록을 활성화하도록 지시
        PILOT_ENABLE_WORKLOAD_ENTRY_HEALTHCHECKS: true
        # Pilot이 WorkloadEntry에 대해 헬스체크(health checks)를 수행하도록 활성화
    global:
      meshID: usmesh #이 Istio 메시의 고유한 ID를 usmesh로 설정
      multiCluster: #다중 클러스터 환경 설정을 정의
        clusterName: west-cluster
      network: west-network #이 클러스터가 속한 네트워크의 이름을 west-network로 지정
  • DNS Query Capture: ISTIO_META_DNS_CAPTURE: "true"를 설정해 DNS 쿼리를 캡처하고 sidecar의 DNS proxy로 리다이렉트합니다.
  • Workload Auto Registration: PILOT_ENABLE_WORKLOAD_ENTRY_AUTOREGISTRATION: true로 워크로드가 자동 등록되도록 합니다.
  • Health Checks: PILOT_ENABLE_WORKLOAD_ENTRY_HEALTHCHECKS: true로 VM 워크로드의 상태를 확인합니다.
  • Network 정보: network: west-network로 VM이 속한 네트워크를 지정합니다.

이 설정을 적용하기 위해 다음 명령어를 실행합니다:

(⎈|default:N/A) root@k3s-s:~# istioctl install -f istio-in-action/book-source-code-master/ch13/controlplane/cluster-in-west-network-with-vm-features.yaml --set values.global.proxy.privileged=true -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete                                                                                   Making this installation the default for injection and validation.

[ Istio의 인그레스 게이트웨이 서비스 의 타입을 NodePort로 변경 ]
Thank you for installing Istio 1.17.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/hMHGiwZHPU7UQRWe9
(⎈|default:N/A) root@k3s-s:~# kubectl patch svc istio-ingressgateway -n istio-system -p '{"spec": {"type": "NodePort"}}'
service/istio-ingressgateway patched
  • 이 명령어는 Istio control plane을 업데이트해 VM 통합에 필요한 기능을 활성화합니다.
IstioOperator 정의를 사용해 control plane을 업데이트하고
VM 통합 기능을 활성화합니다.

🔗 VM과 Control Plane 연결 준비

  • 업데이트된 control plane은 다음과 같은 역할을 수행합니다:
    • DNS 쿼리 처리: 서비스 프록시가 DNS 쿼리를 캡처해 sidecar의 로컬 DNS proxy로 리다이렉트합니다.
    • 워크로드 관리: VM 워크로드가 자동으로 등록되고, istiod에 상태를 보고합니다.
  • 하지만 이 기능들이 제대로 작동하려면 한 가지 조건이 더 필요합니다: 
    VM이 istiod에 연결되어 설정과 identity를 받아야 합니다.
    이는 VM에 istio-agent를 설치하고 적절히 설정하는 다음 단계에서 다룹니다.
VM이 istiod와 연결되어 설정과 identity를 받아야
mesh에 완전히 통합됩니다.

📌 핵심 요약

  • VM 통합 기능: Workload auto registration, health checks, DNS query capture 기능을 활성화해 VM을 mesh에 통합합니다.
  • Control Plane 업데이트: IstioOperator 정의로 control plane을 업데이트하고 필요한 기능을 설정합니다.
  • VM 연결 준비: VM이 istiod에 연결되어 설정과 identity를 받아야 합니다.

🌐 VM에서 Istiod와 클러스터 서비스 연결하기


🚀 VM과 Istiod 연결 설정

  • VM이 service mesh에 통합되려면 istiod(Istio control plane)와 클러스터 서비스에 연결할 수 있어야 합니다.
    VM과 클러스터가 같은 네트워크에 있으면 별도의 설정 없이 연결이 가능하지만, 이번 예시에서는 서로 다른 네트워크에 있으므로 east-west gateway를 설치해 트래픽을 프록시해야 합니다.

VM이 istiod와 클러스터 서비스에 접근하려면 
east-west gateway를 통해 트래픽을 프록시해야 합니다.

🛠️ East-West Gateway 설치

  • east-west gateway를 설치합니다.
    이 gateway는 VM에서 클러스터로의 트래픽을 처리하는 역할을 합니다.
(⎈|default:N/A) root@k3s-s:~# cat istio-in-action/book-source-code-master/ch13/gateways/cluster-east-west-gw.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: istio-eastwestgateway
  namespace: istio-system
spec:
  profile: empty
  components:
    ingressGateways:
    - name: istio-eastwestgateway
      label:
        istio: eastwestgateway
        app: istio-eastwestgateway
        topology.istio.io/network: west-network
      enabled: true
      k8s:
        env:
        - name: ISTIO_META_ROUTER_MODE
          value: "sni-dnat"
        # The network to which traffic is routed
        - name: ISTIO_META_REQUESTED_NETWORK_VIEW
          value: west-network
        service:
          ports:
          - name: status-port
            port: 15021
            targetPort: 15021
          - name: mtls
            port: 15443
            targetPort: 15443
          - name: tcp-istiod
            port: 15012
            targetPort: 15012
          - name: tcp-webhook
            port: 15017
            targetPort: 15017
  values:
    global:
      meshID: usmesh
      multiCluster:
        clusterName: west-cluster
      network: west-network
      
(⎈|default:N/A) root@k3s-s:~# istioctl install -f istio-in-action/book-source-code-master/ch13/gateways/cluster-east-west-gw.yaml -y-y
✔ Ingress gateways installed
✔ Installation complete
Thank you for installing Istio 1.17.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/hMHGiwZHPU7UQRWe9
  • 클러스터에 east-west gateway를 배포해 VM과 클러스터 간 통신을 준비합니다.
east-west gateway를 설치해 VM과 클러스터 간 트래픽 프록시를 설정합니다.

🔗 클러스터 서비스 포트 노출

  • gateway가 설치되었으니, VM이 클러스터 서비스와 istiod에 접근할 수 있도록 필요한 포트를 노출합니다.

Figure 13.11: The Ports that Expose Istiod and Cluster Services to the VM

1️⃣ Multi-Cluster mTLS 포트 노출

  • multi-cluster mTLS 포트(15443) 를 노출VM에서 mesh 내 서비스로의 요청을 프록시합니다.
(⎈|default:N/A) root@k3s-s:~# cat istio-in-action/book-source-code-master/ch13/expose-services.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: cross-network-gateway
  namespace: istio-system
spec:
  selector:
    istio: eastwestgateway
  servers:
    - port:
        number: 15443
        name: tls
        protocol: TLS
      tls:
        mode: AUTO_PASSTHROUGH
      hosts:
        - "*.local"
        
(⎈|default:N/A) root@k3s-s:~# kubectl apply -f istio-in-action/book-source-code-master/ch13/expose-services.yaml
gateway.networking.istio.io/cross-network-gateway created
  • VM에서 클러스터 서비스로의 트래픽을 처리하는 gateway를 생성합니다.
포트 15443을 노출해 VM에서 클러스터 서비스로의 mTLS 트래픽을 프록시합니다.

🌐 Istiod 포트 노출

  • VM이 istiod에 접근할 수 있도록 istiod 포트를 노출합니다.
    이를 위해 Gateway와 VirtualService 리소스를 설정트래픽을 istiod로 라우팅합니다.
(⎈|default:N/A) root@k3s-s:~# cat istio-in-action/book-source-code-master/ch13/expose-istiod.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istiod-gateway
spec:
  selector:
    istio: eastwestgateway
  servers:
    - port:
        name: tls-istiod
        number: 15012
        protocol: tls
      tls:
        mode: PASSTHROUGH
      hosts:
        - "*"
    - port:
        name: tls-istiodwebhook
        number: 15017
        protocol: tls
      tls:
        mode: PASSTHROUGH
      hosts:
        - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: istiod-vs
spec:
  hosts:
  - "*"
  gateways:
  - istiod-gateway
  tls:
  - match:
    - port: 15012
      sniHosts:
      - "*"
    route:
    - destination:
        host: istiod.istio-system.svc.cluster.local
        port:
          number: 15012
  - match:
    - port: 15017
      sniHosts:
      - "*"
    route:
    - destination:
        host: istiod.istio-system.svc.cluster.local
        port:
          number: 443
          
(⎈|default:N/A) root@k3s-s:~# kubectl apply -f istio-in-action/book-source-code-master/ch13/expose-istiod.yaml -n istio-system
gateway.networking.istio.io/istiod-gateway created
virtualservice.networking.istio.io/istiod-vs created
  • Gateway: VM에서 istiod로 들어오는 트래픽을 허용합니다.
  • VirtualService: 트래픽을 istiod로 라우팅하는 규칙을 정의합니다.
Gateway와 VirtualService를 설정해 
VM이 istiod에 접근할 수 있도록 포트를 노출합니다.

🏁 VM 통합 준비 완료

  • 이제 인프라가 설정되고, control plane이 업데이트되었으며, VM이 istiod와 클러스터 서비스에 연결할 수 있는 환경이 마련되었습니다. 다음 단계는 VM이 속한 워크로드 그룹을 정의하는 WorkloadGroup을 생성하는 것입니다.

📌 핵심 요약

  • VM 연결: VM이 istiod와 클러스터 서비스에 접근하려면 east-west gateway를 통해 트래픽을 프록시해야 합니다.
  • Gateway 설치: east-west gateway를 설치해 VM과 클러스터 간 통신을 설정합니다.
  • 포트 노출: 포트 15443을 통해 클러스터 서비스를, Gateway와 VirtualService를 통해 istiod를 노출합니다.
  • 다음 단계: WorkloadGroup을 생성해 VM의 워크로드를 mesh에 등록합니다.

🛠️ WorkloadGroup으로 VM 워크로드 관리하기


🌐 WorkloadGroup으로 VM 워크로드 정의

  • WorkloadGroup은 VM 워크로드의 공통 속성을 정의하는 Istio 리소스로, 애플리케이션 관련 정보(예: 노출 포트, readiness 확인 방법)를 포함합니다. 아래는 forum 워크로드를 위한 WorkloadGroup 정의 예시입니다:
(⎈|default:N/A) root@k3s-s:~# cat istio-in-action/book-source-code-master/ch13/workloadgroup.yaml
apiVersion: networking.istio.io/v1alpha3
kind: WorkloadGroup
metadata:
  name: forum
  namespace: forum-services
spec:
  metadata:
    annotations: {}
    labels:
      app: forum
  template:
    serviceAccount: forum-sa
    network: vm-network
  probe:
    periodSeconds: 5
    initialDelaySeconds: 1
    httpGet:
      port: 8080
      path: /api/healthz

주요 속성 설명

  • labels: Kubernetes 서비스가 WorkloadGroup에 등록된 워크로드를 선택할 수 있도록 합니다. 예: app: forum.
  • network: VM이 속한 네트워크(vm-network)를 지정합니다. 동일 네트워크 내에서는 IP 주소를 사용하고, 다른 네트워크에서는 east-west gateway를 통해 트래픽을 라우팅합니다.
  • serviceAccount: 워크로드의 identity를 나타냅니다. VM은 forum-sa 서비스 계정의 유효한 토큰을 제시해야 이 그룹에 등록할 수 있습니다.
  • probe: istio-agent가 애플리케이션의 readiness를 확인하기 위해 5초마다 포트 8080의 /api/healthz 경로로 HTTP GET 요청을 보냅니다.
WorkloadGroup은 
VM 워크로드의 공통 속성(레이블, 네트워크, 서비스 계정, readiness probe)을 정의합니다.

🛠️ WorkloadGroup 생성

  • WorkloadGroup을 클러스터에 적용하기 위해 네임스페이스와 서비스 계정을 생성한 후, WorkloadGroup 설정을 배포합니다:
(⎈|default:N/A) root@k3s-s:~# kubectl create namespace forum-services
kubectl create serviceaccount forum-sa -n forum-services
kubectl apply -f istio-in-action/book-source-code-master/ch13/workloadgroup.yaml
namespace/forum-services created
serviceaccount/forum-sa created
workloadgroup.networking.istio.io/forum created
  • 이 명령어를 실행하면 클러스터는 forum-sa 서비스 계정의 유효한 토큰을 가진 워크로드를 자동으로 등록하도록 설정됩니다.
네임스페이스와 서비스 계정을 생성하고 WorkloadGroup을 적용해 
워크로드 자동 등록을 준비합니다.

⚙️ VM Sidecar 설정 생성

  • WorkloadGroup은 VM의 istio-agent 설정을 생성하는 데도 사용됩니다. 
    istioctl 명령어를 사용해 WorkloadGroup 정보를 바탕으로 VM 설정 파일을 쉽게 생성할 수 있습니다:
(⎈|default:N/A) root@k3s-s:~# istioctl x workload entry configure -f istio-in-action/book-source-code-master/ch13/workloadgroup.yaml -o /tmp/my-workload-files/ --clusterID "west-cluster" --autoregister
Warning: a security token for namespace "forum-services" and service account "forum-sa" has been generated and stored at "/tmp/my-workload-files/istio-token"
Configuration generation into directory /tmp/my-workload-files/ was successful

(⎈|default:N/A) root@k3s-s:~# cat /tmp/my-workload-files/hosts
192.168.10.10 istiod.istio-system.svc
  • 이 명령어는 WorkloadGroup과 클러스터 정보를 조회해 VM의 istio-agent 설정 파일을 생성합니다. 생성된 파일에는 다음 정보가 포함됩니다:
    • east-west gateway IP 주소: istiod에 접근하기 위한 주소.
    • root certificate: istiod가 제공하는 인증서의 신뢰성을 검증합니다.
    • service account token: forum-sa 워크로드 그룹의 멤버로 인증하기 위한 토큰.
    • service mesh 설정: WorkloadGroup에 정의된 네트워크와 공통 속성.
  • 이 설정 파일을 통해 istio-agent는 istiod와 보안 연결을 시작하고, SVID(SPIFFE Verifiable Identity Document)를 받아 Envoy 설정을 xDS 프로토콜로 수신해 mesh의 멤버가 됩니다.
 istioctl로 WorkloadGroup을 기반으로 
VM의 istio-agent 설정 파일을 생성합니다

📂 설정 파일을 VM으로 전송

  • 생성된 설정 파일에는 service account token과 같은 민감한 데이터가 포함되어 있으므로 안전하게 VM으로 전송해야 합니다. 데모에서는 SSH를 사용해 파일을 전송합니다.
  • 실제 프로덕션 환경에서는 이 과정을 자동화하고 수동 작업을 최소화해야 합니다:
[현재 실습 환경 편리성으로 경유 복사]

(⎈|default:N/A) root@k3s-s:/tmp# chmod +x my-workload-files/

ssoon@DESKTOP-QMAIJOE:~$ APP_IP=43.202.0.70
ssoon@DESKTOP-QMAIJOE:~$ mkdir my-workload-files
ssoon@DESKTOP-QMAIJOE:~$ sudo scp -i istio-ssoon.pem ubuntu@$APP_IP:/tmp/my-workload-files/* ./my-workload-files
cluster.env                                                             100%  635    40.9KB/s   00:00
hosts                                                                   100%   38     2.5KB/s   00:00
istio-token                                                             100%  844    57.9KB/s   00:00
mesh.yaml                                                               100%  792    46.8KB/s   00:00
root-cert.pem                                                           100% 1094    86.7KB/s   00:00

[로컬 PC의 파일들을 forum-vm로 복사]
ssoon@DESKTOP-QMAIJOE:~$ FORUM=54.180.240.239
ssoon@DESKTOP-QMAIJOE:~$ scp -iistio-ssoon.pem ./my-workload-files/cluster.env ubuntu@$FORUM:/tmp/
scp -iistio-ssoon.pem ./my-workload-files/istio-token ubuntu@$FORUM:/tmp/
scp -iistio-ssoon.pem ./my-workload-files/mesh.yaml ubuntu@$FORUM:/tmp/
scp -iistio-ssoon.pem ./my-workload-files/root-cert.pem ubuntu@$FORUM:/tmp/
cluster.env                                                             100%  635    60.4KB/s   00:00
istio-token                                                             100%  844   102.8KB/s   00:00
mesh.yaml                                                               100%  792   102.5KB/s   00:00
root-cert.pem                                                           100% 1094    82.2KB/s   00:00

[forum-vm 에서 확인]
root@forum-vm:~# ls -l /tmp
total 36
-rwxr-xr-x 1 ubuntu ubuntu  635 May 26 13:22 cluster.env
-rwxr-xr-x 1 ubuntu ubuntu  844 May 26 13:22 istio-token
-rwxr-xr-x 1 ubuntu ubuntu  792 May 26 13:22 mesh.yaml
-rwxr-xr-x 1 ubuntu ubuntu 1094 May 26 13:22 root-cert.pem

 


🏁 VM 통합 준비 완료

설정 파일이 VM에 전송되었으므로, 이제 istio-agent를 설치하고 설정해 VM을 service mesh에 완전히 통합할 준비가 되었습니다.


📌 핵심 요약

  • WorkloadGroup 정의: VM 워크로드의 공통 속성(레이블, 네트워크, 서비스 계정, readiness probe)을 정의합니다.
  • WorkloadGroup 생성: 네임스페이스와 서비스 계정을 생성하고 WorkloadGroup을 적용해 워크로드 등록을 준비합니다.
  • 설정 생성: istioctl로 WorkloadGroup을 기반으로 VM의 istio-agent 설정 파일을 생성합니다.
  • 파일 전송: 민감한 설정 파일을 rsync와 SSH로 VM에 안전하게 전송합니다.

🖥️ VM에 Istio-Agent 설치 및 설정하기


🌐 forum-vm 가상머신에 istio-agent 를 다운로드하고 설치

root@forum-vm:~# resolvectl status
Global
       Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub

Link 2 (ens5)
    Current Scopes: DNS
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.0.2
       DNS Servers: 192.168.0.2
        DNS Domain: ap-northeast-2.compute.internal
  • stub 모드는 systemd-resolved 서비스가 로컬 DNS 스텁 리졸버 역할을 한다는 의미입니다. 즉, 애플리케이션들은 /etc/resolv.conf에 명시된 로컬 스텁 리졸버(일반적으로 127.0.0.53)에게 DNS 쿼리를 보내고, 이 스텁 리졸버가 실제 업스트림 DNS 서버(아래 Link 2에서 보이는 192.168.0.2와 같은)로 쿼리를 전달합니다.

📦 Istio-Agent 설치

  • VM에 istio-agent를 설치해야 합니다. Istio는 다음과 같은 패키지 형식으로 agent를 제공합니다:
    • Debian 패키지(.deb): Ubuntu, Linux Mint 등 Debian 기반 배포판에 사용.
    • RPM 패키지(.rpm): Fedora, RHEL, CentOS 등 Red Hat 기반 배포판에 사용.
  • .deb 패키지를 다운로드하고 설치합니다:
root@forum-vm:~# curl -LO https://storage.googleapis.com/istio-release/releases/1.17.8/deb/istio-sidecar.deb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 41.4M  100 41.4M    0     0  16.9M      0  0:00:02  0:00:02 --:--:-- 16.9M

root@forum-vm:~# file istio-sidecar.deb
istio-sidecar.deb: Debian binary package (format 2.0), with control.tar.gz, data compression gz

root@forum-vm:~# dpkg -i istio-sidecar.deb
Selecting previously unselected package istio-sidecar.
(Reading database ... 67385 files and directories currently installed.)
Preparing to unpack istio-sidecar.deb ...
Unpacking istio-sidecar (1.17.8) ...
Setting up istio-sidecar (1.17.8) ...

root@forum-vm:~# which pilot-agent
/usr/local/bin/pilot-agent

root@forum-vm:~# pilot-agent version
version.BuildInfo{Version:"1.17.8", GitRevision:"a781f9ee6c511d8f22140d8990c31e577b2a9676", GolangVersion:"go1.20.10", BuildStatus:"Clean", GitTag:"1.17.8"}

root@forum-vm:~# which envoy
/usr/local/bin/envoy

root@forum-vm:~# envoy --version
envoy  version: e1222b5645a29ad3d02b280797ac1219dd88cfbc/1.25.10/Clean/RELEASE/BoringSSL

root@forum-vm:~# tree /etc/istio
/etc/istio
├── config
│   └── mesh
├── envoy
│   ├── envoy_bootstrap_tmpl.json
│   └── sidecar.env
├── extensions
│   ├── metadata-exchange-filter.compiled.wasm
│   ├── metadata-exchange-filter.wasm
│   ├── stats-filter.compiled.wasm
│   └── stats-filter.wasm
└── proxy

4 directories, 7 files

root@forum-vm:~# tree /var/lib/istio/
/var/lib/istio/
├── config
│   └── mesh
├── envoy
│   ├── envoy_bootstrap_tmpl.json
│   └── sidecar.env
├── extensions
│   ├── metadata-exchange-filter.compiled.wasm
│   ├── metadata-exchange-filter.wasm
│   ├── stats-filter.compiled.wasm
│   └── stats-filter.wasm
└── proxy

4 directories, 7 files

 

Ubuntu VM에 .deb 패키지를 사용해 istio-agent를 설치합니다.

⚙️ 설정 파일 배치

  • istio-agent는 특정 디렉토리에서 설정 파일을 읽습니다. 이전에 VM으로 전송한 설정 파일을 적절한 위치로 이동합니다:
    root@forum-vm:~# mkdir -p /etc/certs
    root@forum-vm:~# mkdir -p /var/run/secrets/tokens
    root@forum-vm:~#
    cp /tmp/root-cert.pem /etc/certs/root-cert.pem
    cp /tmp/istio-token /var/run/secrets/tokens/istio-token
    cp /tmp/cluster.env /var/lib/istio/envoy/cluster.env
    cp /tmp/mesh.yaml /etc/istio/config/mesh
  • root-cert.pem: /etc/certs/ 디렉토리에 배치해 istiod 인증서를 검증합니다.
  • istio-token: /var/run/secrets/tokens/ 디렉토리에 배치해 서비스 계정 토큰을 제공합니다.
  • cluster.env, mesh.yaml: 각각 Envoy와 mesh 설정을 정의합니다.
istio-agent가 읽을 수 있도록 설정 파일을 지정된 디렉토리로 이동합니다.

🌐 호스트 파일 설정

  • istio-agent가 istiod에 연결하려면 istiod.istio-system.svc 호스트 이름을 east-west gateway의 IP 주소로 해석해야 합니다. 
root@forum-vm:~# cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
192.168.10.200  forum-vm

root@forum-vm:~# echo "192.168.10.10 istiod.istio-system.svc" | sudo sh -c 'cat >> /etc/hosts'

root@forum-vm:~# cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
192.168.10.200  forum-vm
192.168.10.10 istiod.istio-system.svc

🔒 디렉토리 권한 설정

istio-agent가 읽고 쓰는 디렉토리에 적절한 권한을 부여합니다:

root@forum-vm:~# cat /etc/passwd | tail -n 3
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/false
istio-proxy:x:998:999::/var/lib/istio:/bin/sh

root@forum-vm:~# tree /etc/istio
/etc/istio
├── config
│   └── mesh
├── envoy
│   ├── cluster.env
│   ├── envoy_bootstrap_tmpl.json
│   └── sidecar.env
├── extensions
│   ├── metadata-exchange-filter.compiled.wasm
│   ├── metadata-exchange-filter.wasm
│   ├── stats-filter.compiled.wasm
│   └── stats-filter.wasm
└── proxy

4 directories, 8 files

root@forum-vm:~# chown -R istio-proxy /var/lib/istio /etc/certs /etc/istio/proxy /etc/istio/config /var/run/secrets /etc/certs/root-cert.pem
istio-agent가 사용할 디렉토리에 istio-proxy 사용자 권한을 설정합니다.

🚀 Istio-Agent 시작

  • 이제 istio-agent를 시스템 서비스로 시작합니다:
  • 서비스 상태를 확인해 정상적으로 실행 중인지 확인합니다:
root@forum-vm:~# systemctl status istio
○ istio.service - istio-sidecar: The Istio sidecar
     Loaded: loaded (/lib/systemd/system/istio.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: http://istio.io/

root@forum-vm:~# systemctl start istio
systemctl enable istio
Created symlink /etc/systemd/system/multi-user.target.wants/istio.service → /lib/systemd/system/istio.service.

root@forum-vm:~# systemctl status istio
● istio.service - istio-sidecar: The Istio sidecar
     Loaded: loaded (/lib/systemd/system/istio.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2025-05-26 13:32:28 KST; 3s ago
       Docs: http://istio.io/
 istio-agent를 시스템 서비스로 시작하고 상태를 확인합니다.

📜 Istio-Agent 로그 확인

  • istio-agent가 istiod에 성공적으로 연결되었는지 확인하려면 로그를 확인합니다. 로그는 다음 위치에 저장됩니다:
    • 표준 출력: /var/log/istio/istio.log
    • 표준 에러: /var/log/istio/istio.err.log
  • 다음 명령어로 표준 출력 로그를 확인합니다:
root@forum-vm:~# cat /var/log/istio/istio.log | grep xdsproxy
2025-05-26T04:32:28.717132Z     info    xdsproxy        Initializing with upstream address "istiod.istio-system.svc:15012" and cluster "west-cluster"
2025-05-26T04:32:28.943331Z     info    xdsproxy        connected to upstream XDS server: istiod.istio-system.svc:15012
  • xdsproxy 관련 로그에 connected to upstream XDS server가 표시되면 istiod 연결이 성공한 것입니다.
    로그 파일이 생성되지 않았다면 서비스 시작에 실패했을 가능성이 있으므로, 다음 명령어로 systemd 로그를 확인하세요:
# journalctl -u istio -f
istio-agent 로그를 확인해 istiod 연결 상태를 검증합니다. 

✅ 워크로드 등록 확인

  • WorkloadGroup에서 workload auto-registration이 활성화되었으므로, istio-agent가 istiod에 연결되면 자동으로 WorkloadEntry가 생성됩니다. 클러스터에서 이를 확인합니다:
(⎈|default:N/A) root@k3s-s:~# kubectl get workloadentries -n forum-services
NAME                              AGE   ADDRESS
forum-192.168.10.200-vm-network   83s   192.168.10.200
  • 출력에 WorkloadEntry가 표시되면 VM이 mesh에 성공적으로 등록된 것입니다.
    이 항목에는 VM의 IP 주소와 서비스 연결 정보가 포함됩니다.
WorkloadEntry를 확인해 
VM이 service mesh에 등록되었는지 검증합니다.

📌 핵심 요약

  • VM 접속: SSH로 VM에 접속해 istio-agent 설치를 준비합니다.
  • Agent 설치: Ubuntu VM에 .deb 패키지를 사용해 istio-agent를 설치합니다.
  • 설정 배치: 설정 파일을 적절한 디렉토리로 이동합니다.
  • 호스트 설정: /etc/hosts에 istiod와 VM 호스트 이름을 추가해 이름 해석을 보장합니다.
  • 권한 설정: istio-proxy 사용자에게 디렉토리 권한을 부여합니다.
  • 서비스 시작: istio-agent를 시작하고 상태를 확인합니다.
  • 로그 확인: 로그를 통해 istiod 연결을 검증합니다.
  • 워크로드 등록: WorkloadEntry를 확인해 VM이 mesh에 등록되었는지 확인합니다.

🚀 VM에서 클러스터 서비스로 트래픽 라우팅하기


🌐 클러스터 서비스로 트래픽 테스트

  • VM이 service mesh에 통합되었는지 확인하려면 VM에서 클러스터의 webapp 서비스로 요청을 보내야 합니다.
    VM에서 다음 curl 명령어를 실행해 webapp의 catalog 데이터를 요청합니다:
root@forum-vm:~# dig +short webapp.istioinaction
10.10.200.79
root@forum-vm:~# curl -s webapp.istioinaction/api/catalog/items/1 | jq
{
  "id": 1,
  "color": "amber",
  "department": "Eyewear",
  "name": "Elinor Glasses",
  "price": "282.00"
}
  • 성공적인 응답은 VM에서 클러스터 서비스로 트래픽이 올바르게 라우팅되었음을 확인해줍니다.
VM에서 curl 요청을 보내 클러스터 서비스로의 트래픽 라우팅을 테스트합니다.

🔍 트래픽 라우팅 과정 이해

  • VM에서 클러스터 서비스로 요청이 성공적으로 전달되기까지 어떤 과정이 진행되었는지 자세히 살펴보겠습니다. 

  • DNS 해석: 애플리케이션이 요청을 보내기 위해 호스트 이름(webapp.istioinaction)을 IP 주소로 해석해야 합니다. 이 DNS 쿼리는 DNS proxy로 리다이렉트됩니다.
  • 요청 리다이렉션: 호스트 이름이 IP 주소로 해석되면, 애플리케이션의 아웃바운드 요청은 iptables 규칙에 의해 Envoy proxy로 리다이렉트됩니다.
  • Envoy 프록시 라우팅: Envoy proxy는 트래픽을 east-west gateway로 라우팅합니다.
  • Gateway 프록시: east-west gateway는 요청을 webapp 서비스로 프록시하고, webapp은 catalog 서비스를 쿼리해 데이터를 반환합니다.

VM에서 클러스터 서비스로의 트래픽은 
DNS 해석, Envoy proxy, east-west gateway를 거쳐 라우팅됩니다.

📌 핵심 요약

  • 트래픽 테스트: VM에서 curl 요청을 보내 webapp 서비스로 트래픽이 라우팅되는지 확인합니다.
  • 라우팅 과정: 트래픽은 DNS proxy로 호스트 이름을 해석하고, Envoy proxy와 east-west gateway를 통해 클러스터 서비스로 전달됩니다.
  • 결과 확인: 성공적인 응답은 VM이 service mesh에 올바르게 통합되었음을 보여줍니다.

🚀 클러스터에서 VM WorkloadEntry로 트래픽 라우팅하기


🌐 Kubernetes Service로 WorkloadEntry 선택

  • 클러스터에서 VM의 forum 서비스로 트래픽을 보내려면 VM의 IP 주소를 직접 사용하면 안 됩니다.
    Kubernetes에서 Pod의 IP를 직접 사용하지 않는 것처럼, 워크로드의 유연한 교체를 위해 Kubernetes Service를 생성해 WorkloadEntry를 선택해야 합니다.
  • 아래는 forum 워크로드를 선택하는 Kubernetes Service 정의입니다:
    • selector: app: forum 레이블을 가진 모든 워크로드(Pod 또는 WorkloadEntry)를 선택합니다.
    • ports: 외부 포트 80을 VM의 forum 애플리케이션 포트 8080으로 매핑합니다
(⎈|default:N/A) root@k3s-s:~# cat istio-in-action/book-source-code-master/services/forum/kubernetes/forum-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: forum
  name: forum
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: forum
  • 이 서비스를 클러스터에 적용합니다:
(⎈|default:N/A) root@k3s-s:~# kubectl apply -f istio-in-action/book-source-code-master/services/forum/kubernetes/forum-svc.yaml -n forum-services
service/forum created

(⎈|default:N/A) root@k3s-s:~# kubectl get svc,ep -n forum-services
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/forum   ClusterIP   10.10.200.244   <none>        80/TCP    78s

NAME              ENDPOINTS   AGE
endpoints/forum   <none>      78s
  • forum 서비스를 생성하고, istiod가 WorkloadEntry의 엔드포인트를 데이터 플레인에 동적으로 설정하도록 합니다.
Kubernetes Service를 생성해 
app: forum 레이블로 WorkloadEntry를 선택하고 트래픽 라우팅을 준비합니다.

🔍 트래픽 라우팅 테스트

  • forum-vm 의 envoy config 확인
root@forum-vm:~# export ISTIOV=1.17.8
echo 'export ISTIOV=1.17.8' >> /root/.bashrc
root@forum-vm:~# curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV sh -
cp istio-$ISTIOV/bin/istioctl /usr/local/bin/istioctl

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!

root@forum-vm:~# curl -s localhost:15000/config_dump | istioctl proxy-config secret --file -
RESOURCE NAME     TYPE           STATUS     VALID CERT     SERIAL NUMBER                               NOT AFTER                NOT BEFORE
default           Cert Chain     ACTIVE     true           233359400348792292654324870024909295450     2025-05-27T05:24:31Z     2025-05-26T05:22:31Z
ROOTCA            CA             ACTIVE     true           83766859697462706637207922702918382200      2035-05-24T01:27:59Z     2025-05-26T01:27:59Z

 

  • 서비스가 생성되었으니, 클러스터에서 VM의 forum 서비스로 트래픽이 라우팅되는지 테스트합니다. 
    Istio ingress gateway의 외부 IP를 확인하고, webapp을 통해 forum 서비스로 요청을 보냅니다:
(⎈|default:N/A) root@k3s-s:~# curl -s -H "Host: webapp.istioinaction.io" http://$APP_IP:30000/api/users -I
HTTP/1.1 500 Internal Server Error
date: Mon, 26 May 2025 05:53:43 GMT
content-length: 27
content-type: text/plain; charset=utf-8
x-envoy-upstream-service-time: 3
server: istio-envoy
  • 요청이 실패했습니다. 이는 설정에 문제가 있음을 나타냅니다. 문제를 해결하기 위해 트러블슈팅을 시작해야 합니다.
curl 요청으로 클러스터에서 VM의 forum 서비스로 트래픽을 테스트했으나,
500 에러가 발생했습니다.

🛠️ 트러블슈팅: Webapp 로그 확인

  • 요청이 실패한 원인을 찾기 위해 webapp 워크로드의 Envoy 액세스 로그를 확인합니다:
(⎈|default:N/A) root@k3s-s:~# kubectl logs -n istioinaction deploy/webapp -c istio-proxy | tail -2
[2025-05-26T05:53:43.566Z] "GET /api/users HTTP/1.1" 503 UH no_healthy_upstream - "-" 0 19 0 - "43.202.0.70" "beegoServer" "9452a064-5e71-4226-9d77-a2f48a586575" "forum.forum-services:80" "-" outbound|80||forum.forum-services.svc.cluster.local - 10.10.200.244:80 43.202.0.70:0 - default
[2025-05-26T05:53:43.564Z] "HEAD /api/users HTTP/1.1" 500 - via_upstream - "-" 0 0 2 2 "43.202.0.70" "curl/7.81.0" "9452a064-5e71-4226-9d77-a2f48a586575" "webapp.istioinaction.io" "172.16.0.12:8080" inbound|8080|| 127.0.0.6:34693 172.16.0.12:8080 43.202.0.70:0 outbound_.80_._.webapp.istioinaction.svc.cluster.local default

Figure 13.13: The Envoy Access Logs of the Webapp Service

  • 로그에 UH (No healthy upstream) 응답 플래그가 표시됩니다. 이는 forum 서비스에 건강한 엔드포인트가 없음을 의미합니다.
  • 엔드포인트가 있는지 확인하기 위해 istioctl로 webapp의 엔드포인트를 조회합니다:
(⎈|default:N/A) root@k3s-s:~# istioctl proxy-config endpoint deploy/webapp.istioinaction | grep for
  • forum 서비스의 엔드포인트가 없습니다
    WorkloadEntry는 등록되었지만, 건강 상태(health checks)가 실패했을 가능성이 있습니다.
webapp 로그에 UH 플래그가 표시되며, 
forum 서비스의 엔드포인트가 없음을 확인했습니다.

🔎 WorkloadEntry 건강 상태 확인

  • WorkloadEntry의 건강 상태를 확인하려면 해당 리소스의 상세 정보를 YAML 형식으로 출력합니다:
(⎈|default:N/A) root@k3s-s:~# kc get workloadentries -n forum-services -o yaml
...
  status:
    conditions:
    - lastProbeTime: "2025-05-26T05:53:13.391615285Z"
      lastTransitionTime: "2025-05-26T05:53:13.391615527Z"
      message: 'Get "http://192.168.10.200:8080/api/healthz": dial tcp 127.0.0.6:0->192.168.10.200:8080:
        connect: connection refused'
      status: "False"
      type: Healthy
...
  • status: "False"는 WorkloadEntry가 건강하지 않음을 나타냅니다. 오류 메시지는 포트 8080의 /api/healthz 경로에 연결할 수 없다고 보고합니다. 이는 VM에서 forum 애플리케이션이 실행되고 있지 않기 때문입니다. 
WorkloadEntry의 건강 상태가 False로, 
forum 애플리케이션이 실행되지 않아 health checks가 실패했습니다.

▶️ VM에서 Forum 애플리케이션 시작

  • VM에서 forum 애플리케이션을 시작해 문제를 해결합니다.
    다음 명령어로 바이너리를 다운로드하고 실행 권한을 부여한 후 애플리케이션을 시작합니다:
root@forum-vm:~# wget -O forum https://git.io/J3QrT
--2025-05-26 15:01:00--  https://git.io/J3QrT
Resolving git.io (git.io)... 140.82.112.22
Connecting to git.io (git.io)|140.82.112.22|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://github.com/istioinaction/book-source-code/raw/master/services/forum/forum-linux-amd64 [following]
--2025-05-26 15:01:02--  https://github.com/istioinaction/book-source-code/raw/master/services/forum/forum-linux-amd64
Resolving github.com (github.com)... 20.200.245.247
Connecting to github.com (github.com)|20.200.245.247|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/istioinaction/book-source-code/master/services/forum/forum-linux-amd64 [following]
--2025-05-26 15:01:03--  https://raw.githubusercontent.com/istioinaction/book-source-code/master/services/forum/forum-linux-amd64
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.110.133, 185.199.109.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7555365 (7.2M) [application/octet-stream]
Saving to: ‘forum’

forum                100%[===================>]   7.21M  41.7MB/s    in 0.2s

2025-05-26 15:01:03 (41.7 MB/s) - ‘forum’ saved [7555365/7555365]

root@forum-vm:~# file forum
forum: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=trQtLS4PXPBMx2f_5fvT/FjJvgMs4NbpPqqnG_oas/gHZZYnBj4Z8pFLRo0xzI/a8toFDYJMxdaqdJV2Cex, not stripped
root@forum-vm:~# chmod +x forum
root@forum-vm:~# ./forum
Server is listening in port:8080

[ forum-vm 다른 터미널 ]
root@forum-vm:~# curl http://localhost:8080/api/healthz -v
*   Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api/healthz HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Mon, 26 May 2025 06:02:48 GMT
< Content-Length: 0
<
* Connection #0 to host localhost left intact

root@forum-vm:~# ss -tnlp | grep 8080
LISTEN 0      4096               *:8080             *:*    users:(("forum",pid=5135,fd=3))
  • 애플리케이션이 포트 8080에서 수신 대기 중입니다.
    health probes가 성공할 때까지 몇 초 기다린 후, WorkloadEntry의 상태를 다시 확인합니다:
(⎈|default:N/A) root@k3s-s:~# istioctl proxy-config endpoint deploy/webapp.istioinaction --cluster 'outbound|80||forum.forum-services.svc.cluster.local'
ENDPOINT                STATUS      OUTLIER CHECK     CLUSTER
192.168.10.200:8080     HEALTHY     OK                outbound|80||forum.forum-services.svc.cluster.local
(⎈|default:N/A) root@k3s-s:~# kc get workloadentries -n forum-services -o yaml
...
  status:
    conditions:
    - lastProbeTime: "2025-05-26T06:01:27.154585646Z"
      lastTransitionTime: "2025-05-26T06:01:27.154586391Z"
      status: "True"
      type: Healthy
  • status: "True"는 워크로드가 건강함을 나타냅니다. 이제 istiod가 webapp의 데이터 플레인에 forum 엔드포인트를 추가합니다. 엔드포인트를 다시 확인합니다:
(⎈|default:N/A) root@k3s-s:~# istioctl proxy-config endpoint deploy/webapp.istioinaction | grep forum
192.168.10.200:8080                                     HEALTHY     OK                outbound|80||forum.forum-services.svc.cluster.loca
  • forum 엔드포인트가 건강한 상태로 추가되었습니다.
VM에서 forum 애플리케이션을 시작해 
health checks를 성공시키고 엔드포인트를 추가했습니다.

✅ 트래픽 라우팅 재테스트

  • 문제가 해결되었으니, 클러스터에서 forum 서비스로 트래픽을 다시 테스트합니다:
(⎈|default:N/A) root@k3s-s:~# curl -is -H "Host: webapp.istioinaction.io" http://$APP_IP:30000/api/users | grep HTTP
HTTP/1.1 200 OK

(⎈|default:N/A) root@k3s-s:~# kubectl logs -n istioinaction deploy/webapp -c istio-proxy | tail -2
[2025-05-26T06:10:07.577Z] "GET /api/users HTTP/1.1" 200 - via_upstream - "-" 0 5645 15 15 "218.234.104.56" "beegoServer" "a66a993f-63da-484d-a46e-d3369eb4b56b" "forum.forum-services:80" "192.168.10.200:8080" outbound|80||forum.forum-services.svc.cluster.local 172.16.0.12:57422 10.10.200.244:80 218.234.104.56:0 - default
[2025-05-26T06:10:07.575Z] "GET /api/users HTTP/1.1" 200 - via_upstream - "-" 0 3679 18 18 "218.234.104.56" "curl/8.5.0" "a66a993f-63da-484d-a46e-d3369eb4b56b" "webapp.istioinaction.io" "172.16.0.12:8080" inbound|8080|| 127.0.0.6:58761 172.16.0.12:8080 218.234.104.56:0 outbound_.80_._.webapp.istioinaction.svc.cluster.local default
  • 요청이 성공적으로 처리되었습니다!
    이는 클러스터에서 VM의 forum 워크로드로 트래픽이 올바르게 라우팅되었음을 보여줍니다.

forum 애플리케이션 시작 후 트래픽이 성공적으로 라우팅되었습니다.

 


📌 핵심 요약

  • Kubernetes Service: app: forum 레이블로 WorkloadEntry를 선택하는 서비스를 생성합니다.
  • 트래픽 테스트: 클러스터에서 forum 서비스로 요청을 보내 500 에러를 확인했습니다.
  • 트러블슈팅: webapp 로그와 엔드포인트를 확인해 forum 엔드포인트가 없음을 발견했습니다.
  • 건강 상태 확인: WorkloadEntry가 건강하지 않으며, forum 애플리케이션이 실행되지 않은 것이 원인이었습니다.
  • 애플리케이션 시작: VM에서 forum 애플리케이션을 시작해 health checks를 성공시켰습니다.
  • 재테스트: 트래픽이 성공적으로 라우팅되어 HTTP 200 응답을 받았습니다.
  • Istio 이점: 건강한 워크로드만 트래픽을 받아 안정성을 보장합니다.

🔒 VM에 상호 인증 적용하기


🌐 VM의 현재 보안 상태 확인

  • VM은 service mesh에 통합되어 sidecar proxy가 네트워크 트래픽을 관리합니다. 하지만 현재 VM의 포트 8080은 누구나 접근할 수 있는 상태입니다. 이를 확인하기 위해 로컬 컴퓨터(메시 외부)에서 VM으로 요청을 보냅니다:
ssoon@DESKTOP-QMAIJOE:~$ curl -is $FORUM:8080/api/users | grep HTTP
HTTP/1.1 200 OK
  • 요청이 성공적으로 처리되었습니다. 이는 인증되지 않은 사용자도 VM의 서비스에 접근할 수 있음을 보여줍니다. 이 상태는 보안에 취약하므로, mutual TLS를 강제해 인증된 트래픽만 허용하도록 설정해야 합니다.
현재 VM의 포트 8080은 인증 없이 누구나 접근 가능하며, 
이를 차단해야 합니다.

🔐 PeerAuthentication으로 mTLS 강제

  • Istio의 PeerAuthentication 정책을 사용해 메시 전체에 mutual TLS를 강제합니다. 이 정책은 서비스 간 트래픽이 상호 인증된 경우에만 허용되도록 설정하여 보안을 강화합니다. 다음 명령어로 정책을 적용합니다:
(⎈|default:N/A) root@k3s-s:~# cat istio-in-action/book-source-code-master/ch13/strict-peer-auth.yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT
(⎈|default:N/A) root@k3s-s:~# kubectl apply -f istio-in-action/book-source-code-master/ch13/strict-peer-auth.yaml
peerauthentication.security.istio.io/default created
(⎈|default:N/A) root@k3s-s:~# kubectl get peerauthentication -A
NAMESPACE      NAME      MODE     AGE
istio-system   default   STRICT   18s
  • 잠시 기다린 후, 인증되지 않은 트래픽이 차단되는지 확인합니다:
ssoon@DESKTOP-QMAIJOE:~$ curl -is $FORUM:8080/api/users -v
*   Trying 54.180.143.253:8080...
* Connected to 54.180.143.253 (54.180.143.253) port 8080
> GET /api/users HTTP/1.1
> Host: 54.180.143.253:8080
> User-Agent: curl/8.5.0
> Accept: */*
>
* Recv failure: Connection reset by peer
* Closing connection
  • 요청이 거부되었습니다! 이는 sidecar proxy가 인증되지 않은 트래픽을 차단했음을 의미합니다.
PeerAuthentication 정책을 적용해 mutual TLS를 강제하고, 
인증되지 않은 트래픽을 차단했습니다.

✅ 서비스 간 트래픽 확인

  • mTLS 정책이 적용되었더라도, 메시 내 서비스 간 트래픽은 정상적으로 작동해야 합니다. 이를 확인하기 위해 클러스터의 webapp 서비스에서 VM의 forum 서비스로 요청을 보냅니다:
ssoon@DESKTOP-QMAIJOE:~$ curl -is -H "Host: webapp.istioinaction.io" http://$APP_IP:30000/api/users | grep HTTP
HTTP/1.1 200 O
  • 요청이 성공적으로 처리되었습니다. 이는 webapp과 forum 간 트래픽이 mTLS를 통해 인증되어 정상적으로 라우팅되었음을 보여줍니다.
mTLS 정책 적용 후에도 메시 내 서비스 간 트래픽은 정상적으로 작동합니다.

📌 핵심 요약

  • 현재 상태: VM의 포트 8080은 인증 없이 접근 가능해 보안 취약점이 있었습니다.
  • mTLS 적용: PeerAuthentication 정책으로 mutual TLS를 강제해 인증되지 않은 트래픽을 차단했습니다.
  • 서비스 간 트래픽: mTLS 적용 후에도 webapp에서 forum으로의 트래픽은 정상적으로 작동합니다.
  • Istio 기능: VM은 Istio의 모든 API를 지원해 보안과 트래픽 관리를 강화할 수 있습니다.

 

 

Comments