
Kubernetes Goat Home 门户实战用多阶段 Docker 构建 Hugo 站点并部署到 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 项目中的 Home 门户组件infrastructure/goat-home展开完整讲解如何用多阶段 Dockerfile 把一套 Hugo 静态站点含 22 个安全场景的入口页打包成镜像、推送到镜像仓库再通过 Deployment Service 部署进集群最后经kubectl port-forward在http://127.0.0.1:1234访问。读完后你能够复现该门户容器的完整构建与部署链路并理解静态站点镜像在最小化构建、资源限额和安全基线方面的实践要点。组件定位Kubernetes Goat 的统一入口Kubernetes Goat Home 是一个运行在集群内的静态网站容器作为整个攻击练习环境的统一入口。进入该页面后用户可以浏览所有场景Scenario 1 到 22、查看各场景的说明notes与指引label是练习者发现、利用、攻击整个流程的起点。从站点内容结构看门户的素材全部位于 home/content 目录包含introduction.md和scenario-1.md到scenario-22.md共 24 个 Markdown 文件。以 introduction.md 为例其 front matter 使用scenario、title、notes、label等字段--- scenario: 0 title: Introduction notes: - Refer to the Kubernetes Goat guide at https://madhuakula.com/kubernetes-goat/ label: Guide ---这些字段被 Hugo 主题渲染为左侧导航与右侧详情区即门户页面上场景列表 详情的布局来源。新增场景时作者模板 home/archetypes/default.md 提供了标准的 front matter 骨架title、date、draft保证新页面不会遗漏必需字段。站点配置Hugo 的 config.toml 解析门户的站点级配置位于 home/config.toml核心配置项如下配置项取值说明baseURLhttp://localhost:1234站点访问基地址与port-forward暴露的本地端口 1234 对应title/params.titleKubernetes Goat页面标题与主题导航标题params.descriptionKubernetes Goat is designed to be an intentionally vulnerable cluster environment...站点描述文案params.logokubernetes-goat.png导航栏 Logo取自 home/static 目录themetoc-page使用的 Hugo 主题名Paginate1000分页大小设为 1000相当于单页展示全部内容disableKinds[taxonomy, taxonomyTerm, RSS]关闭分类页与 RSS 生成静态站点更精简[social]Github/Twitter页面底部的社交链接键值对值得注意的是baseURL http://localhost:1234这与 access-kubernetes-goat.sh 中为appkubernetes-goat-homePod 建立的1234:80端口转发完全对应说明站点 URL 与本地访问端口在设计上是联动的。构建镜像两阶段 Dockerfile 全解读原始文档给出的构建命令为docker build -t madhuakula/k8s-goat-home .真正的工作发生在 infrastructure/goat-home/Dockerfile 中它采用经典的多阶段构建multi-stage build结构FROM alpine AS build LABEL MAINTAINERMadhu Akula INFOKubernetes Goat WORKDIR /build ENV HUGO_VERSION0.84.0 ENV HUGO_BINARYhugo_${HUGO_VERSION}_Linux-64bit.tar.gz RUN set -x \ apk add --update wget git ca-certificates imagemagick \ if [ uname -m aarch64 ]; then \ HUGO_BINARYhugo_${HUGO_VERSION}_Linux-ARM64.tar.gz; \ else \ HUGO_BINARYhugo_${HUGO_VERSION}_Linux-64bit.tar.gz; \ fi; \ wget https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/${HUGO_BINARY} \ tar xzf ${HUGO_BINARY} \ mv hugo /usr/bin COPY home . RUN git clone https://github.com/madhuakula/toc-page-hugo-theme.git themes/toc-page \ /usr/bin/hugo FROM nginx:alpine-slim LABEL MAINTAINERMadhu Akula INFOKubernetes Goat COPY --frombuild /build/public /usr/share/nginx/html从源码结构看这个构建过程有几个值得注意的实现细节构建阶段alpine AS build基础镜像为 Alpine通过apk add安装wget下载 Hugo、git拉取主题、ca-certificatesHTTPS 证书与imagemagick主题图片处理。Hugo 版本被固定为0.84.0以环境变量HUGO_VERSION显式声明避免使用latest造成构建漂移。架构自适应uname -m判断 CPU 架构aarch64Apple Silicon 等 ARM 机器选用Linux-ARM64.tar.gz其余平台x86_64选用Linux-64bit.tar.gz。这让同一个 Dockerfile 在 Intel/AMD 与 M 系列芯片上都能直接构建。主题外置toc-page主题不在本仓库内而是构建期从外部仓库git clone到themes/toc-page。这意味着该镜像的构建依赖外部网络可达且主题更新不受本仓库版本控制约束——从构建可复现性角度看这是一个可以推断出的潜在风险点。Hugo 构建产物/usr/bin/hugo在/build目录下执行该目录已含COPY home .拷贝进来的config.toml、content/、static/静态产物输出到默认的public/目录。运行阶段nginx:alpine-slim最终镜像只包含 nginx 与public/目录的静态文件COPY --frombuild /build/public /usr/share/nginx/html。构建阶段的 Hugo 二进制、git、imagemagick 等全部被丢弃最终镜像体积极小也天然契合 Deployment 中50Mi内存限额的低开销预期。构建成功后按文档推送镜像docker push madhuakula/k8s-goat-home部署到集群Deployment 与 Service 清单门户的集群侧清单位于 scenarios/kubernetes-goat-home/deployment.yaml包含 Deployment 和 Service 两个资源apiVersion: apps/v1 kind: Deployment metadata: name: kubernetes-goat-home-deployment namespace: default spec: selector: matchLabels: app: kubernetes-goat-home template: metadata: labels: app: kubernetes-goat-home spec: containers: - name: kubernetes-goat-home image: madhuakula/k8s-goat-home resources: limits: memory: 50Mi cpu: 30m ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: kubernetes-goat-home-service namespace: default spec: ports: - protocol: TCP port: 80 targetPort: 80 selector: app: kubernetes-goat-home清单要点镜像madhuakula/k8s-goat-home未打标签latest与 README 中docker push使用的默认 tag 一致。资源限制仅设置limits50Mi 内存 / 30m CPU而未设置requests对纯静态站点nginx 只读文件、无外部调用而言这是合理的低成本配置。ServiceClusterIP 类型默认80 到 80 的透传映射选择器与 Pod 标签app: kubernetes-goat-home对应。该清单是 setup-kubernetes-goat.sh 部署流程的一部分脚本在检查 kubectl 可用后依次 apply 各场景清单其中包含门户kubectl $KUBECTL_INSECURE apply -f scenarios/kubernetes-goat-home/deployment.yaml访问门户port-forward 的 1234 端口链路集群内部门户通过kubernetes-goat-home-service在 80 端口提供服务但练习者实际访问走的是 access-kubernetes-goat.sh 建立的本地端口转发。脚本中针对门户的片段为# Exposing Kubernetes Goat Home export POD_NAME$(kubectl $KUBECTL_INSECURE get pods --namespace default -l appkubernetes-goat-home -o jsonpath{.items[0].metadata.name}) # 轮询等待 Pod Running 且容器 ready 后 kubectl $KUBECTL_INSECURE port-forward $POD_NAME --address 0.0.0.0 1234:80完整链路为Pod容器 80 端口nginx→ 本地0.0.0.0:1234→ 浏览器访问http://127.0.0.1:1234与config.toml的baseURL精确吻合。脚本还统一支持--insecure与--kubeconfig参数用于 TLS 校验跳过和指定 kubeconfig 文件适配不同环境的集群。安全基线视角Checkov 对该组件的告警作为Vulnerable by Design项目门户自身的清单也出现在项目的安全扫描报告中。guide/docs/security-reports/checkov.md 对scenarios/kubernetes-goat-home/deployment.yaml命中了多条 K8s 检查项CKV_K8S_包括未配置 liveness/readiness 探针、缺少 memory/CPU requests、未设置 securityContextallowPrivilegeEscalation、seccomp、runAsNonRoot 等、使用 default 命名空间、镜像未固定 tag 与 digest 等对 Dockerfile 侧CKV_DOCKER_则提示基础镜像使用 latest 风格标签、缺少 HEALTHCHECK、未创建专用用户。这些告警在本项目中是预期结果而非疏漏项目目标是让学习者通过扫描工具Checkov、KICS、KubeEscape 等练习识别不安全配置门户清单恰好提供了一个真实样本。理解这一点有助于正确解读扫描报告也提醒生产环境部署同类静态站点时应补上探针、requests、securityContext 与固定镜像 digest。小结Kubernetes Goat Home 组件展示了一条完整的静态站点上云链路Hugo 站点内容24 个场景 Markdown 文件config.toml站点配置 → 两阶段 Docker 构建Alpine 下载 Hugo 0.84.0 并做 ARM/x86 自适应最终镜像仅含 nginx 静态产物→ 构建并推送madhuakula/k8s-goat-home镜像 → Deployment/Service 清单入集群 →port-forward 1234:80本地访问。涉及的三个核心文件 Dockerfile、config.toml 与 deployment.yaml 之间的参数端口 80/1234、镜像名、Hugo 输出目录public/相互咬合是理解该项目部署体系的入门样本。【免费下载链接】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),仅供参考