Kubernetes Goat 基于 KIND 的本地部署:用 Docker 容器节点构建可攻防的 Kubernetes 学习集群
2026/9/17 6:39:25 网站建设 项目流程

Kubernetes Goat 基于 KIND 的本地部署:用 Docker 容器节点构建可攻防的 Kubernetes 学习集群

【免费下载链接】kubernetes-goatKubernetes Goat is a "Vulnerable by Design" cluster environment to learn and practice Kubernetes security using an interactive hands-on playground 🚀项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-goat

本文以 Kubernetes Goat 仓库中的 KIND 部署指南为核心,完整讲解如何在本地用 KIND(Kubernetes IN Docker)一键拉起 Kubernetes 集群并部署全部漏洞场景:从kindkubectlhelm三个前置工具的准备,到setup-kind-cluster-and-goat.sh的逐行行为剖析、场景清单与端口映射,再到环境访问与安全环境销毁。读完后,你应能在自己的主机上从零搭建、验证并彻底拆除一套完整的 Kubernetes 安全攻防演练环境。

什么是 KIND,为什么用它跑 Kubernetes Goat

KIND 是一个基于 Docker 容器充当 Kubernetes 节点("container nodes")来运行本地 Kubernetes 集群的工具。它最初是为测试 Kubernetes 本身而设计的,同样适用于本地开发或 CI 场景。选择 KIND 的意义在于:

  • 不依赖云厂商账号与配额,一个 Docker 宿主就能承载完整的控制面与数据面;
  • 集群即容器,销毁集群只需删除几个容器,非常适合"用完即拆"的安全实验;
  • Kubernetes Goat 的所有漏洞场景(特权容器、hostPath 挂载、DinD 等)在 KIND 节点容器上都能直接复现,"宿主机"就是 KIND 节点容器本身,隔离边界清晰、不污染宿主机。

仓库中 KIND 相关的落地代码集中在 platforms/kind-setup 目录,包含一键部署脚本、集群配置、访问脚本与拆机脚本;官方文档入口为 guide/docs/how-to-run/kind.md。

前置条件:kind、kubectl 与 helm

按文档要求,开始部署前需在宿主系统上准备好三样工具,并逐一验证:

工具用途验证命令
kind创建并管理基于 Docker 的本地集群kind version
kubectl对集群执行 k8s 资源操作,且需要cluster-admin 级别访问权限kubectl version
helm部署 metadata-db 等 Helm Chart 场景helm version

三项工具的安装方式可分别参照 kind、kubectl 与 Helm 的官方安装文档,安装完成后确保它们在PATH中可用。kubectl version能正常返回版本信息,说明 kubectl 与集群凭据链路基本就绪。

一键部署流程

部署步骤在 guide/docs/how-to-run/kind.md 中只有三步,但背后是一条完整的自动化链路。

第 1 步:克隆仓库

git clone https://github.com/madhuakula/kubernetes-goat.git

第 2 步:进入 KIND 部署目录

cd kubernetes-goat/platforms/kind-setup

第 3 步:运行部署脚本

bash setup-kind-cluster-and-goat.sh

脚本内部到底做了什么

阅读 platforms/kind-setup/setup-kind-cluster-and-goat.sh 源码,可以看到脚本分四段执行:

  1. 环境自检:先执行kind version,未安装则提示并退出;再执行docker version --format '{{.Server.Version}}'确认 Docker 守护进程可用,任一失败都会提前终止,避免后续步骤在半配置状态下执行。

  2. 创建 KIND 集群

    kind create cluster --config kind-cluster-setup.yaml --name kubernetes-goat-cluster

    集群名固定为kubernetes-goat-cluster。配套的 kind-cluster-setup.yaml 内容极简:

    kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane

    即默认拓扑——单节点、control-plane 角色。这也意味着所有 workload(包括特权容器与 hostPath 挂载类场景)都运行在这个唯一的 KIND 节点容器上。

  3. 切回仓库根目录cd ../..,因为后续部署脚本引用的是仓库根目录下的scenarios/清单。

  4. 部署 Kubernetes Goat:调用根目录的 setup-kubernetes-goat.sh 完成全部场景的部署。

值得注意的脚本细节是,setup-kubernetes-goat.sh支持两个可选参数(见其开头的参数解析循环):

  • --insecure:设置KUBECTL_INSECURE="--insecure-skip-tls-verify"HELM_INSECURE="--kube-insecure-skip-tls-verify",用于跳过 API Server 的 TLS 证书校验(本地 KIND 集群通常自带受信 CA,一般无需此参数);
  • --kubeconfig <path>:显式指定 KUBECONFIG,便于多集群环境下精确指向kubernetes-goat-cluster

脚本内部按以下顺序部署(可对照 setup-kubernetes-goat.sh 逐行验证):

  1. 校验kubectl可用;
  2. 部署insecure super admin场景:kubectl apply -f scenarios/insecure-rbac/setup.yaml,创建集群级越权 RBAC(这是后续多场景攻击链的起点);
  3. 通过 Helm 安装 metadata-db 场景:helm install metadata-db scenarios/metadata-db/
  4. 依次kubectl apply各漏洞场景清单:scenarios/batch-check/job.yamlscenarios/build-code/deployment.yamlscenarios/cache-store/deployment.yamlscenarios/health-check/deployment.yamlscenarios/hunger-check/deployment.yamlscenarios/internal-proxy/deployment.yamlscenarios/kubernetes-goat-home/deployment.yamlscenarios/poor-registry/deployment.yamlscenarios/system-monitor/deployment.yamlscenarios/hidden-in-layers/deployment.yaml
  5. 输出提示:确保所有 Pod 处于 Running 状态后再运行access-kubernetes-goat.sh

部署完成后的验证

脚本执行完毕后,回到仓库根目录确认资源就绪:

kubectl get pods

此时应看到kubernetes-goat-homehealth-checkinternal-proxysystem-monitorpoor-registryhunger-checkbatch-check等负载陆续进入 Running 状态。

访问 Kubernetes Goat 环境

集群与场景就绪后,在仓库根目录执行:

bash access-kubernetes-goat.sh

access-kubernetes-goat.sh 的工作方式是:对每个目标 Pod 循环轮询其status.phasecontainerStatuses[*].ready(未就绪时每 10 秒重试一次),全部就绪后为各 Pod 建立kubectl port-forward,把本地 1230~1236 端口段映射到集群内各服务:

本地端口目标 Pod / 容器端口对应场景
1230build-code:3000代码库中泄露敏感密钥
1231health-check:80Docker-in-Docker 利用
1232internal-proxy:3000K8s 世界中的 SSRF
1233system-monitor:8080容器逃逸访问宿主系统
1234kubernetes-goat-home:80Goat 门户首页
1235poor-registry:5000攻击私有镜像仓库
1236hunger-check:8080big-monolith命名空间)资源 DoS

随后浏览器访问http://127.0.0.1:1234即可进入 Kubernetes Goat 首页,逐个点开场景开始演练。该脚本同样支持--insecure--kubeconfig参数,解析逻辑与 setup 脚本一致。

KIND 环境下的安全特性:为什么漏洞场景能生效

Kubernetes Goat 的许多场景依赖特权容器与 hostPath 挂载,例如 scenarios/health-check/deployment.yaml 中:

  • Pod 的securityContext.privileged: true
  • hostPath: /只读挂载宿主根目录(host-root卷),由一个busyboxinit 容器探测containerd.sockdocker.sock的位置,再软链到统一卷container-socket-unified,主容器把该 socket 挂到/var/run/docker.sock/run/docker.sock等多个路径。

在普通 Kubernetes 集群中,这些挂载指向的是物理/虚拟机宿主;而在 KIND 上,"宿主"就是kubernetes-goat-cluster对应的 KIND 节点容器——你在其中做容器逃逸、DinD 利用,边界止于该节点容器,这正是 KIND 适合安全实验的原因:真实漏洞链可完整复现,但影响面可控。

访问与拆除:README 的完整操作对照

platforms/kind-setup/README.md 将 Bash 与 Windows(PowerShell)两套入口并列给出,与本文主体流程完全一致:

操作BashWindows PowerShell
部署集群 + Goatbash setup-kind-cluster-and-goat.sh.\setup-kind-cluster-and-goat.ps1
暴露场景到本地bash access-kubernetes-goat.sh.\access-kubernetes-goat.ps1
拆除环境bash teardown-cluster.sh.\teardown-cluster.ps1

其中 teardown-cluster.sh 只有两行核心逻辑:先调用根目录的 teardown-kubernetes-goat.sh 清理 Goat 资源(删除 superadmin ClusterRoleBinding 与 ServiceAccount、删除 all-your-base / belong-to-us 等 RBAC、helm delete metadata-db --no-hooks、删除 kube-system 中的 tiller-deploy,并逐一kubectl delete -f各场景清单),再执行kind delete cluster --name kubernetes-goat-cluster销毁整个 KIND 集群。README 也建议:练习结束后彻底删除集群,比逐个清理资源更干净。

小结与下一步

本文沿仓库 KIND 部署文档的主线,覆盖了前置工具准备、一键部署脚本的内部机制、集群配置拓扑、场景部署顺序、端口转发映射、KIND 下漏洞场景的生效原理以及环境拆除方式。部署成功后,可继续按 Getting Started 指南 从http://127.0.0.1:1234门户进入各个场景逐一演练;各场景的完整 YAML 与镜像构建代码均可在仓库 scenarios 与 infrastructure 目录中对照阅读,便于从"能跑通"深入到"看得懂为什么这么脆弱"。

【免费下载链接】kubernetes-goatKubernetes Goat is a "Vulnerable by Design" cluster environment to learn and practice Kubernetes security using an interactive hands-on playground 🚀项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-goat

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询