이 문서에서는 AKS(Azure Kubernetes Service)에서 Istio 기반 서비스 메시 추가 기능에 대해 Istio CNI를 사용하도록 설정하는 방법을 보여 줍니다. Istio CNI는 서비스 메시 내의 애플리케이션 워크로드에서 권한 있는 네트워크 기능의 필요성을 제거하여 보안을 향상시킵니다.
개요
기본적으로 Istio 서비스 메시는 각 애플리케이션 Pod에서 권한 있는 init 컨테이너(istio-init)를 사용하여 Envoy 사이드카 프록시로의 네트워크 트래픽 리디렉션을 구성합니다. 이러한 init 컨테이너에는 보통 엔터프라이즈 환경에서 보안 문제로 지적되는 NET_ADMIN 및 NET_RAW 기능이 필요합니다.
Istio CNI는 네트워크 구성 책임을 개별 Pod init 컨테이너에서 클러스터 수준 CNI 플러그 인으로 이동하여 이러한 보안 문제를 해결합니다. 이 방법은 다음과 같습니다.
-
보안 향상: 애플리케이션 워크로드에서 권한 있는 네트워크 기능(
NET_ADMIN,NET_RAW)에 대한 필요성을 제거합니다. - Pod 보안 정책 간소화: 애플리케이션 Pod에는 최소한의 기능만 필요합니다.
- 기능 유지 관리: 기존 init 컨테이너 접근 방식과 동일한 트래픽 관리 기능을 제공합니다.
Istio CNI가 사용하도록 설정되면 애플리케이션 Pod는 권한이 있는 istio-validation 컨테이너 대신 모든 기능을 삭제하는 최소 istio-init init 컨테이너를 사용합니다.
비고
Istio CNI는 Azure CNI를 대체하는 것이 아니며 일반적인 AKS 네트워킹을 방해하지 않습니다. 노드 수준에서 Istio의 트래픽 리디렉션 설정을 처리하도록 설계된 별도의 플러그 인으로, 애플리케이션 Pod에서 권한 있는 init 컨테이너의 필요성을 제거하여 보안을 향상합니다.
시작하기 전 주의 사항:
Azure CLI 버전 2.86.0 이상을 설치합니다. 실행
az --version하여 버전을 확인할 수 있습니다. 설치하거나 업그레이드하려면 Azure CLI 설치를 참조하세요.Istio 기반 서비스 메시 추가 기능을 사용하도록 설정된 AKS 클러스터가 필요합니다. 이 설정이 없는 경우 Azure Kubernetes Service에 대한 Istio 기반 서비스 메시 추가 기능 배포를 참조하세요.
Istio 서비스 메시가 수정 버전
asm-1-25이상을 사용하고 있는지 확인합니다. 다음을 사용하여 현재 수정 버전을 확인할 수 있습니다.az aks show --resource-group <resource-group-name> --name <cluster-name> --query 'serviceMeshProfile.istio.revisions'
환경 변수 설정
export CLUSTER=<cluster-name>
export RESOURCE_GROUP=<resource-group-name>
Istio CNI 사용
새 메시 설치에서 Istio CNI 사용
Istio CNI를 사용 설정하려면 매개변수--proxy-redirection-mechanism를 지정하여 서비스 메시 추가 기능을 활성화하십시오.
az aks mesh enable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --proxy-redirection-mechanism CNIChaining
기존 메시 설치에서 Istio CNI 사용
Istio 서비스 메시 추가 기능을 이미 사용하도록 설정한 경우 다음 명령을 사용하여 Istio CNI로 전환할 수 있습니다.
az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism CNIChaining
비고
기존의 파드는 자동으로 istio-validation init 컨테이너로 전환되지 않습니다. Pod가 변경 내용을 선택하도록 Istio CNI를 사용하도록 설정한 후 배포를 다시 시작합니다(예: kubectl rollout restart deployment/<name>).
Istio CNI가 사용하도록 설정되어 있는지 확인
AKS 클러스터에 대한 자격 증명을 가져오려면 az aks get-credentials를 사용하세요.
az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Istio CNI를 사용하도록 설정한 후 CNI DaemonSet이 실행 중인지 확인하여 설치를 확인합니다.
kubectl get daemonset -n aks-istio-system
Istio CNI DaemonSet이 실행되는 것을 볼 수 있습니다.
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
azure-service-mesh-istio-cni-addon-node 3 3 3 3 3 kubernetes.io/os=linux 94s
워크로드 배포 및 동작 확인
보안 향상을 확인하려면 bookinfo 샘플 애플리케이션을 배포하고 워크로드가 권한 istio-validation 있는 컨테이너 대신 보안 istio-init init 컨테이너를 사용하는지 확인할 수 있습니다.
샘플 애플리케이션 배포
먼저, 기본 네임스페이스에 대한 사이드카 주입을 사용하도록 설정합니다.
# Get the current Istio revision
REVISION=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --query 'serviceMeshProfile.istio.revisions[0]' -o tsv)
# Label the namespace for sidecar injection
kubectl label namespace default istio.io/rev=${REVISION}
bookinfo 샘플 애플리케이션을 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml
안전한 init 컨테이너 사용량 확인
배포된 Pod가 istio-validation 대신 보안 istio-init init 컨테이너를 사용하는지 확인합니다.
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'
예상 출력은 삭제된 기능이 있는 init 컨테이너로 istio-validation을 표시해야 합니다.
details-v1-799dc5d847-7x9gl istio-validation {"drop":["ALL"]}
productpage-v1-99d6d698f-89gpj istio-validation {"drop":["ALL"]}
ratings-v1-7545c4bb6c-m7t42 istio-validation {"drop":["ALL"]}
reviews-v1-8679d76d6c-jz4vg istio-validation {"drop":["ALL"]}
reviews-v2-5b9c77895c-b2b7m istio-validation {"drop":["ALL"]}
reviews-v3-5b57874f5f-kk9rt istio-validation {"drop":["ALL"]}
특정 Pod에 대한 YAML을 확인하여 보안 컨텍스트를 확인할 수도 있습니다.
kubectl get pod <pod-name> -n <namespace> -o yaml | grep -A 20 -B 25 "name: istio-validation"
출력은 init 컨테이너에 istio-validation 권한 있는 기능이 없음을 보여 줘야 합니다.
initContainers:
- args:
…
name: istio-validation
…
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
runAsGroup: 1337
runAsNonRoot: true
runAsUser: 1337
Istio CNI 사용 안 함
Istio CNI를 사용하지 않도록 설정하고 기존 init 컨테이너를 사용하여 돌아가려면 다음 명령을 사용합니다.
az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism InitContainers
Istio CNI를 사용하지 않도록 설정하면 다음을 수행합니다.
CNI DaemonSet이 제거됩니다.
kubectl get daemonset azure-service-mesh-istio-cni-addon-node -n aks-istio-system예상 출력(CNI DaemonSet 없음):
Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not found새 워크로드는 네트워크 기능과 함께 기존
istio-initinit 컨테이너를 사용합니다. 모든 기존 배포를 다시 시작하여 변경 사항을 선택합니다.kubectl rollout restart deployment/details-v1 kubectl rollout restart deployment/productpage-v1 kubectl rollout restart deployment/ratings-v1 kubectl rollout restart deployment/reviews-v1 kubectl rollout restart deployment/reviews-v2 kubectl rollout restart deployment/reviews-v3init 컨테이너 이름 및 기능을 확인합니다.
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'네트워크 기능과 함께 예상 출력으로
istio-init가 표시되어야 합니다.details-v1-57bc58c559-722v8 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} productpage-v1-7bb64f657c-jw6gs istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} ratings-v1-57d5594c75-4zd49 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v1-7fd8f9cd59-mdcf9 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v2-7b8bdc9cdf-k9qgb istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v3-588854d9d7-s2f7j istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}