Ssoon
[8주차] 가상 머신 워크로드를 Mesh 에 통합 : VM으로 Mesh 확장 본문
🌐 서비스 메시 준비하기 : 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를 지원해 보안과 트래픽 관리를 강화할 수 있습니다.
'Istio Hands-on Study [1기]' 카테고리의 다른 글
[8주차] 가상 머신 워크로드를 Mesh 에 통합 : 에이전트 동작 사용자 지정 (0) | 2025.05.26 |
---|---|
[8주차] 가상 머신 워크로드를 Mesh 에 통합 : DNS Proxy 이해 (0) | 2025.05.26 |
[8주차] 가상 머신 워크로드를 Mesh 에 통합 : Istio의 VM 지원 (0) | 2025.05.26 |
[7주차] 요청 경로에서 Istio 확장 : WebAssembly로 Istio의 Data Plane 확장 (0) | 2025.04.23 |
[7주차] 요청 경로에서 Istio 확장 : Lua로 Istio의 Data Plane 확장 (0) | 2025.04.23 |
Comments