#L4 정책 (Layer 4)
IP/포트 단위로 허용/차단
트래픽 내용까지는 보지 않음
성능이 빠르고 단순함
#L7 정책 (Layer 7)
HTTP 요청의 경로, 메서드, 헤더 등을 기반으로 제어
더 정밀한 제어 가능 (예: GET만 허용, POST 차단)
성능은 약간 더 소모됨
#Ambient Mode에서 L4 제어는 ztunnel이, L7 제어는 waypoint가 담당합니다.
#Istio CLI 다운로드
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.25.2
export PATH=$PWD/bin:$PATH
#버전 확인
istioctl version
#Calico VXLAN 활성화
#ipip: 인터넷 프로토콜 헤더 안에 또 다른 IP 패킷을 집어넣는 방식. 환경에 따라 커널 지원이나 방화벽 이슈가 많음.
#vxlan: UDP 기반의 레이어2 오버레이. 대부분 환경에서 별도 설정 없이 작동.
#istiod<->ztunnel간 연결 하기 위한 설정
kubectl patch ippool default-ipv4-ippool \
--type merge \
-p '{"spec":{"ipipMode":"Never","vxlanMode":"Always"}}'
#Istio 클러스터에 설치하기
istioctl install --set profile=ambient --skip-confirmation
#crd 설정
kubectl get crd [gateways.gateway.networking.k8s.io](http://gateways.gateway.networking.k8s.io/) &> /dev/null || \
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml
##############방법2 helm으로 설치########################
helm upgrade --install istio-base ./manifests/charts/base \
-n istio-system --create-namespace
helm upgrade --install istio-cni ./manifests/charts/istio-cni \
-n istio-system \
--set global.istioNamespace=istio-system \
--set cni.ambient.enabled=true
helm upgrade --install istiod ./manifests/charts/istio-control/istio-discovery \
-n istio-system \
--set global.istioNamespace=istio-system \
--set meshConfig.defaultConfig.proxyMetadata.ENABLE_HBONE=true \
--set global.cni.ambient.enabled=true \
--set pilot.env.PILOT_ENABLE_AMBIENT=true
helm upgrade --install ztunnel ./manifests/charts/ztunnel \
-n istio-system \
--set global.istioNamespace=istio-system
##kiali 설치##
kubectl apply -f samples/addons/kiali.yaml
kubectl apply -f samples/addons/prometheus.yaml
#kiali nodeport로 설정
kubectl -n istio-system patch svc kiali --type merge -p '{
"spec": {
"type": "NodePort",
"ports": [
{
"name": "http",
"port": 20001,
"targetPort": 20001,
"nodePort": 30001
},
{
"name": "metrics",
"port": 9090,
"targetPort": 9090,
"nodePort": 30090
}
]
}
}'
#istio gateway로 외부 접속 하는법
apiVersion: v1
kind: Service
metadata:
name: kiali-svc
namespace: istio-system
labels:
app: kiali
spec:
selector:
app: kiali
ports:
- name: http
protocol: TCP
port: 80
targetPort: 20001 # Kiali 기본 포트
type: ClusterIP
---
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: kiali-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
### kiali-gateway.yaml (예시)
```bash
apiVersion: [networking.istio.io/v1beta1](http://networking.istio.io/v1beta1)
kind: VirtualService
metadata:
name: kiali-vs
namespace: istio-system
spec:
hosts:
- "*"
gateways:
- kiali-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: kiali.istio-system.svc.cluster.local
port:
number: 20001
##테스트용 프로젝트 설치
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
kubectl apply -f samples/bookinfo/platform/kube/bookinfo-versions.yaml
kubectl apply -f samples/bookinfo/gateway-api/bookinfo-gateway.yaml
kubectl get gateway
Ztunnel = L4 (네트워크 레벨) 프록시
Waypoint = L7 (애플리케이션 레벨) 프록시
→ 두 프록시 조합으로 세분화된 보안 제어가 가능해집니다.
여기서는 bookinfo gateway → productpage 간 L4 연결 허용 (즉, TCP 수준에서만 허용).
아직 L7 제어는 안 되며, 모든 요청(GET/POST/DELETE 등)은 통과될 수 있습니다.
#L4 Ztunnel 연결
kubectl apply -f - <<EOF
apiVersion: [security.istio.io/v1](http://security.istio.io/v1)
kind: AuthorizationPolicy
metadata:
name: productpage-ztunnel
namespace: default
spec:
selector:
matchLabels:
app: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/bookinfo-gateway-istio
EOF
kubectl apply -f samples/curl/curl.yaml
#테스트
curl → productpage 접근 시도
현재는 curl 이 bookinfo-gateway가 아니므로 접근 불가
curl 을 L4에서 열어주거나, L7에서 위임해야 함
kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage"
#L7 Waypoint 설치
이 프록시는 L7 요청들(GET/POST 등)을 감시함
동시에 namespace에 라벨이 추가됨:
istioctl waypoint apply --enroll-namespace --wait
#L7 수준 AuthorizationPolicy 적용 (Waypoint가 감시)
curl → productpage로 GET 요청만 허용
POST, DELETE 등은 거부됨
다른 서비스 예: reviews-v1 → 접근도 차단됨
kubectl apply -f - <<EOF
apiVersion: [security.istio.io/v1](http://security.istio.io/v1)
kind: AuthorizationPolicy
metadata:
name: productpage-waypoint
namespace: default
spec:
targetRefs:
- kind: Service
group: ""
name: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/curl
to:
- operation:
methods: ["GET"]
EOF
#Ztunnel 정책도 Waypoint 를 추가 허용
기존 L4 정책에서는 Waypoint가 productpage로 보내는 요청이 차단되므로,
→ Waypoint도 허용 주체에 추가해야 합니다.
kubectl apply -f - <<EOF
apiVersion: [security.istio.io/v1](http://security.istio.io/v1)
kind: AuthorizationPolicy
metadata:
name: productpage-ztunnel
namespace: default
spec:
selector:
matchLabels:
app: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/bookinfo-gateway-istio
- cluster.local/ns/default/sa/waypoint
EOF
kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage" -X DELETE
RBAC: access denied
kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage
RBAC: access denied
kubectl exec deploy/curl -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
#트래픽 관리 (Manage traffic)
이제 Waypoint 프록시가 설치되었으니, 서비스 간 트래픽을 분할하는 방법을 배워보겠습니다.
🔸 서비스 간 트래픽 분할
Bookinfo 애플리케이션에는 reviews 서비스가 v1, v2, v3 총 3개의 버전이 있습니다.
이 중 v1과 v2에 대해 트래픽을 나눠서 테스트할 수 있습니다. (예: A/B 테스트, Canary 배포 등)
다음은 트래픽을 reviews-v1에 90%, reviews-v2에 10% 보내도록 구성하는 예시입니다:
kubectl apply -f - <<EOF
apiVersion: [gateway.networking.k8s.io/v1](http://gateway.networking.k8s.io/v1)
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v1
port: 9080
weight: 90
- name: reviews-v2
port: 9080
weight: 10
EOF
#트래픽 분배 확인 방법
curl 파드에서 100번 요청을 보내서 몇 번이 reviews-v2로 가는지 확인할 수 있습니다:
kubectl exec deploy/curl -- sh -c "for i in \$(seq 1 100); do curl -s http://productpage:9080/productpage | grep reviews-v.-; done"
실행 결과에서 reviews-v2가 출력된 횟수가 대략 10% 정도면 정상입니다.
#지우는 방법
kubectl label namespace default [istio.io/use-waypoint-](http://istio.io/use-waypoint-)
istioctl waypoint delete --all
kubectl label namespace default [istio.io/dataplane-mode-](http://istio.io/dataplane-mode-)
#샘플 파일 지우기
kubectl delete httproute reviews
kubectl delete authorizationpolicy productpage-viewer
kubectl delete -f samples/curl/curl.yaml
kubectl delete -f samples/bookinfo/platform/kube/bookinfo.yaml
kubectl delete -f samples/bookinfo/platform/kube/bookinfo-versions.yaml
kubectl delete -f samples/bookinfo/gateway-api/bookinfo-gateway.yaml
#istio 지우기
istioctl uninstall -y --purge
kubectl delete namespace istio-system
#Remove the Kubernetes Gateway API CRDs
kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml