Pod 보안 승인(Pod Security Admission)으로 Istio 설치
Pod 보안 승인(Pod Security Admission)으로 Istio 설치 (Install Istio with Pod Security Admission)
이 가이드를 따라 메시의 네임스페이스에 baseline 정책을 적용하는 Pod 보안 승인 컨트롤러(PSA)와 함께 Istio 메시를 설치, 구성, 사용해보세요.
출처: Istio 문서
본문
기본적으로 Istio는 메시에 배포되는 파드에 istio-init이라는 init 컨테이너를 인젝션해요. istio-init은 메시에 파드를 배포하는 사용자나 서비스 어카운트가 NET_ADMIN과 NET_RAW capability를 가진 컨테이너를 배포할 수 있는 충분한 Kubernetes RBAC 권한을 가지고 있어야 해요.
하지만 baseline 정책은 허용되는 capability에 NET_ADMIN이나 NET_RAW를 포함하지 않아요. 모든 메시 네임스페이스에서 privileged 정책을 적용하는 것을 피하기 위해서는 Istio mesh를 Istio Container Network Interface 플러그인과 함께 사용해야 해요. istio-system 네임스페이스에 있는 istio-cni-node DaemonSet은 로컬 CNI 디렉터리에 접근하기 위해 hostPath 볼륨이 필요해요. 이는 baseline 정책에서 허용되지 않으므로, CNI DaemonSet이 배포될 네임스페이스는 privileged 정책을 적용해야 해요. 기본적으로 이 네임스페이스는 istio-system이에요.
메시의 네임스페이스는 restricted 정책을 사용할 수도 있어요. 정책 사양에 따라 애플리케이션의 seccompProfile을 구성해야 해요.
PSA로 Istio 설치 (Install Istio with PSA)
istio-system 네임스페이스를 만들고 privileged 정책을 적용하도록 라벨을 지정해요.
$ kubectl create namespace istio-system
$ kubectl label --overwrite ns istio-system \
pod-security.kubernetes.io/enforce=privileged \
pod-security.kubernetes.io/enforce-version=latest
namespace/istio-system labeled
Kubernetes 클러스터 1.25 이상에서 CNI와 함께 Istio를 설치해요.
$ istioctl install --set components.cni.enabled=true -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ CNI installed
✔ Installation complete
샘플 애플리케이션 배포 (Deploy the sample application)
데모 애플리케이션이 실행될 default 네임스페이스에 baseline 정책을 적용하는 네임스페이스 라벨을 추가해요:
$ kubectl label --overwrite ns default \
pod-security.kubernetes.io/enforce=baseline \
pod-security.kubernetes.io/enforce-version=latest
namespace/default labeled
PSA가 활성화된 구성 리소스를 사용해 샘플 애플리케이션을 배포해요:
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-psa.yaml@
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
응답에서 페이지 제목을 확인해서 앱이 클러스터 안에서 실행되며 HTML 페이지를 제공하고 있는지 검증해요:
$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
제거 (Uninstall)
샘플 애플리케이션 삭제:
$ kubectl delete -f samples/bookinfo/platform/kube/bookinfo-psa.yaml
default 네임스페이스의 라벨 삭제:
$ kubectl label namespace default pod-security.kubernetes.io/enforce- pod-security.kubernetes.io/enforce-version-
Istio 제거:
$ istioctl uninstall -y --purge
istio-system 네임스페이스 삭제:
$ kubectl delete namespace istio-system