Pod Security Admission を有効にした Istio のインストール
このガイドに従って、Pod Security Admission コントローラー(PSA)を使用して、メッシュ内の名前空間に`baseline` ポリシーを適用する Istio メッシュをインストール、設定、使用します。
デフォルトでは、Istio はメッシュにデプロイされた Pod に init コンテナ `istio-init` を注入します。`istio-init` は、`NET_ADMIN` および `NET_RAW` 機能を持つコンテナをデプロイするための十分な Kubernetes RBAC 権限を、Pod をメッシュにデプロイするユーザーまたはサービスアカウントに必要とします。
しかし、baseline
ポリシーには、許可される機能にNET_ADMIN
またはNET_RAW
が含まれていません。すべてのメッシュ名前空間でprivileged
ポリシーの適用を回避するには、Istio Container Network Interface プラグイン を使用したIstioメッシュを使用する必要があります。istio-system
名前空間内の istio-cni-node
DaemonSet は、ローカルCNIディレクトリにアクセスするためにhostPath
ボリュームを必要とします。これはbaseline
ポリシーでは許可されていないため、CNI DaemonSetがデプロイされる名前空間では、privileged
ポリシー を適用する必要があります。デフォルトでは、この名前空間はistio-system
です。
PSA を使用した Istio のインストール
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
サンプルアプリケーションのデプロイ
デモアプリケーションが実行されるデフォルトの名前空間に
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>
アンインストール
サンプルアプリケーションを削除します。
$ kubectl delete -f samples/bookinfo/platform/kube/bookinfo-psa.yaml
デフォルトの名前空間のラベルを削除します。
$ 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