通过 Pod 安全准入安装 Istio

遵循以下指南,使用 Pod Security 准入控制器 (PSA) 在网格中针对命名空间执行 baseline 策略, 从而安装、配置并使用 Istio 网格。

Istio 默认会将 Init 容器 istio-init 注入到网格中部署的 Pod 内。 istio-init 需要用户或服务账号将 Pod 部署到网格上,还需要具备足够的 Kubernetes RBAC 权限以部署具有 NET_ADMIN 和 NET_RAW 能力的容器

然而,baseline 策略在其允许的权能列表中并未包含 NET_ADMINNET_RAW。为了避免在所有网格化的命名空间中执行 privileged 策略, 有必要使用具有Istio CNI 插件 的 Istio 网格。 istio-system 命名空间中的 istio-cni-node DaemonSet 需要 hostPath 卷访问本地 CNI 目录。 因为这在 baseline 策略中是不被允许的,将部署 CNI DaemonSet 的命名空间需要执行 privileged 策略。 此命名空间默认为 istio-system

网格中的命名空间也可以使用 restricted 策略。 您将需要按照策略规范为应用程序配置 seccompProfile

通过 PSA 安装 Istio

  1. 创建 istio-system 命名空间并为其打标签以执行 privileged 策略。

    1. $ kubectl create namespace istio-system
    2. $ kubectl label --overwrite ns istio-system \
    3. pod-security.kubernetes.io/enforce=privileged \
    4. pod-security.kubernetes.io/enforce-version=latest
    5. namespace/istio-system labeled
  2. 在 Kubernetes 集群版本 1.25 或更高版本上通过 CNI 安装 Istio

    1. $ istioctl install --set components.cni.enabled=true -y
    2. Istio core installed
    3. Istiod installed
    4. Ingress gateways installed
    5. CNI installed
    6. Installation complete

部署样例应用

  1. 添加命名空间标签,以便为将要运行 demo 应用的 default 命名空间执行 baseline 策略:

    1. $ kubectl label --overwrite ns default \
    2. pod-security.kubernetes.io/enforce=baseline \
    3. pod-security.kubernetes.io/enforce-version=latest
    4. namespace/default labeled
  2. 使用启用 PSA 的配置资源来部署样例应用:

    Zip

    1. $ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-psa.yaml@
    2. service/details created
    3. serviceaccount/bookinfo-details created
    4. deployment.apps/details-v1 created
    5. service/ratings created
    6. serviceaccount/bookinfo-ratings created
    7. deployment.apps/ratings-v1 created
    8. service/reviews created
    9. serviceaccount/bookinfo-reviews created
    10. deployment.apps/reviews-v1 created
    11. deployment.apps/reviews-v2 created
    12. deployment.apps/reviews-v3 created
    13. service/productpage created
    14. serviceaccount/bookinfo-productpage created
    15. deployment.apps/productpage-v1 created
  3. 通过检查响应的页面标题,确认应用正在集群内运行且正提供 HTML 页面:

    1. $ 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>"
    2. <title>Simple Bookstore App</title>

卸载

  1. 删除样例应用

    1. $ kubectl delete -f samples/bookinfo/platform/kube/bookinfo-psa.yaml
  2. 删除 default 命名空间上的标签

    1. $ kubectl label namespace default pod-security.kubernetes.io/enforce- pod-security.kubernetes.io/enforce-version-
  3. 卸载 Istio

    1. $ istioctl uninstall -y --purge
  4. 删除 istio-system 命名空间

    1. $ kubectl delete namespace istio-system