Pod 安全#
Kubernetes 定义了三种不同的 Pod 安全标准,包括 privileged
、baseline
和 restricted
,以广泛覆盖安全范围。privileged
标准允许用户进行已知的权限提升,因此对于安全性要求高的应用程序来说不够安全。
本文档描述了如何配置 RayCluster YAML 文件以应用 restricted
Pod 安全标准。以下参考资料可以帮助您更好地理解本文档:
准备#
请克隆 KubeRay 仓库 并检出 master
分支。本教程需要仓库中的几个文件。
步骤 1:创建一个 Kind 集群#
# Path: kuberay/
kind create cluster --config ray-operator/config/security/kind-config.yaml --image=kindest/node:v1.26.0
kind-config.yaml
通过 audit-policy.yaml
中定义的审计策略启用审计日志记录。audit-policy.yaml
定义了一个审计策略,用于监听命名空间 pod-security
中的 Pod 事件。通过此策略,我们可以检查我们的 Pod 是否违反了 restricted
标准中的策略。
功能 Pod 安全准入 首先在 Kubernetes v1.22(alpha)中引入,并在 Kubernetes v1.25 中变得稳定。此外,KubeRay 目前支持 Kubernetes 从 v1.19 到 v1.24。(在撰写本文时,我们尚未测试 KubeRay 与 Kubernetes v1.25)。因此,我在此步骤中使用 Kubernetes v1.24。
步骤 2:检查审计日志#
docker exec kind-control-plane cat /var/log/kubernetes/kube-apiserver-audit.log
日志应该是空的,因为命名空间 pod-security
不存在。
步骤 3:创建 pod-security
命名空间#
kubectl create ns pod-security
kubectl label --overwrite ns pod-security \
pod-security.kubernetes.io/warn=restricted \
pod-security.kubernetes.io/warn-version=latest \
pod-security.kubernetes.io/audit=restricted \
pod-security.kubernetes.io/audit-version=latest \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/enforce-version=latest
通过 pod-security.kubernetes.io
标签,内置的 Kubernetes Pod 安全准入控制器将对命名空间 pod-security
中的所有 Pod 应用 restricted
Pod 安全标准。标签 pod-security.kubernetes.io/enforce=restricted
意味着如果 Pod 违反了 restricted
安全标准中定义的策略,该 Pod 将被拒绝。有关这些标签的更多详细信息,请参阅 Pod 安全准入。
步骤 4:安装 KubeRay 操作员#
# Update the field securityContext in helm-chart/kuberay-operator/values.yaml
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
# Path: kuberay/helm-chart/kuberay-operator
helm install -n pod-security kuberay-operator .
步骤 5:创建 RayCluster(选择步骤 5.1 或步骤 5.2)#
如果你选择步骤 5.1,命名空间
pod-security
中将不会创建任何 Pod。如果你选择步骤5.2,Pod可以成功创建。
步骤 5.1:创建一个没有正确 securityContext
配置的 RayCluster#
# Path: kuberay/ray-operator/config/samples
kubectl apply -n pod-security -f ray-cluster.complete.yaml
# Wait 20 seconds and check audit logs for the error messages.
docker exec kind-control-plane cat /var/log/kubernetes/kube-apiserver-audit.log
# Example error messagess
# "pods \"raycluster-complete-head-fkbf5\" is forbidden: violates PodSecurity \"restricted:latest\": allowPrivilegeEscalation != false (container \"ray-head\" must set securityContext.allowPrivilegeEscalation=false) ...
kubectl get pod -n pod-security
# NAME READY STATUS RESTARTS AGE
# kuberay-operator-8b6d55dbb-t8msf 1/1 Running 0 62s
# Clean up the RayCluster
kubectl delete rayclusters.ray.io -n pod-security raycluster-complete
# raycluster.ray.io "raycluster-complete" deleted
在命名空间 pod-security
中不会创建 Pod,并检查审计日志中的错误消息。
步骤 5.2:使用适当的 securityContext
配置创建一个 RayCluster#
# Path: kuberay/ray-operator/config/security
kubectl apply -n pod-security -f ray-cluster.pod-security.yaml
# Wait for the RayCluster convergence and check audit logs for the messages.
docker exec kind-control-plane cat /var/log/kubernetes/kube-apiserver-audit.log
# Forward the dashboard port
kubectl port-forward svc/raycluster-pod-security-head-svc -n pod-security 8265:8265
# Log in to the head Pod
kubectl exec -it -n pod-security ${YOUR_HEAD_POD} -- bash
# (Head Pod) Run a sample job in the Pod
python3 samples/xgboost_example.py
# Check the job status in the dashboard on your browser.
# http://127.0.0.1:8265/#/job => The job status should be "SUCCEEDED".
# (Head Pod) Make sure Python dependencies can be installed under `restricted` security standard
pip3 install jsonpatch
echo $? # Check the exit code of `pip3 install jsonpatch`. It should be 0.
# Clean up the RayCluster
kubectl delete -n pod-security -f ray-cluster.pod-security.yaml
# raycluster.ray.io "raycluster-pod-security" deleted
# configmap "xgboost-example" deleted
将根据 ray-cluster.pod-security.yaml
中指定的内容创建一个头节点 Pod 和一个工作节点 Pod。首先,我们登录到头节点 Pod,运行一个 XGBoost 示例脚本,并在仪表板中检查作业状态。接下来,我们使用 pip
安装一个 Python 依赖项(即 jsonpatch
),并且 pip
命令的退出代码应为 0。