关键在于配置 Docker 环境、动态更新镜像地址、安全接入集群及适配 Go 应用:需用 docker/login-action + build-push-action;用 kustomize 替换 image;通过专用 SA 和 kubeconfig 验证连接;合理设置 probes、监听地址与资源限制,并校验 kubectl apply。

GitHub Actions 里怎么触发构建和推送镜像
关键不是“写个 workflow”,而是让 docker build 和 docker push 在 CI 环境里真正跑通。默认 GitHub Actions 运行在 Ubuntu runner 上,不带 Docker daemon;直接用 docker 命令会报 Cannot connect to the Docker daemon。
必须显式启用 docker/setup-buildx-action 或 docker/login-action + docker/build-push-action 组合。推荐后者,更可控:
- 先用
docker/login-action登录你的镜像仓库(ACR、ECR 或自建 Harbor) - 再用
docker/build-push-action构建多阶段镜像并推送到指定 registry - 避免在 workflow 中硬编码密码,全部走
${{ secrets.REGISTRY_PASSWORD }} - 镜像 tag 推荐用
${{ github.sha }}或${{ github.ref_name }},别用latest—— 否则 Kubernetes 拉不到更新
Kubernetes 部署文件怎么动态替换镜像地址
YAML 文件里的 image: 字段不能写死。每次新镜像生成后,得把 image: my-registry.io/app:v1.2.3 替换成刚构建出的 SHA 或 tag。
常见做法是用 sed 或 kustomize:
-
sed -i "s|image:.*|image: ${{ secrets.REGISTRY_URL }}/my-go-app:${{ github.sha }}|" k8s/deployment.yaml—— 简单但脆弱,正则易错 - 更稳的是用
kustomize:在kustomization.yaml里定义images:列表,然后在 workflow 中调用kustomize edit set image - 注意:GitHub Actions 默认没装
kustomize,得用hashicorp/setup-kustomize或actions/setup-go+go install sigs.k8s.io/kustomize/kustomize/v5@latest
部署到集群前,怎么确认 kubeconfig 和权限可用
GitHub Actions 本身没有 kubectl 或集群访问能力。你得手动提供凭证,且必须最小权限:
- 不要用
cluster-admin,为 CI 创建专用 ServiceAccount,绑定edit或自定义 Role(只允许deployments、services、secrets) - 把 SA 的
token和ca.crt编码成 secret,存进 GitHub repo 的SECRETS(如KUBE_CONFIG_B64) - 在 workflow 中解码:
echo "${{ secrets.KUBE_CONFIG_B64 }}" | base64 -d > /tmp/kubeconfig,再设KUBECONFIG=/tmp/kubeconfig - 务必加一步
kubectl get ns default --kubeconfig=/tmp/kubeconfig验证连通性,失败就立刻exit 1,别等到apply报错才中断
为什么 Go 应用上线后经常 503 或重启
不是 CI 流程问题,而是 Kubernetes 层面的适配没做对。Go 二进制启动快,但 probe 配置稍有偏差就会反复 kill:
-
livenessProbe的initialDelaySeconds至少设为 10–15,Go HTTP server 启动虽快,但可能依赖 DB 连接、配置加载等同步初始化逻辑 -
readinessProbe的failureThreshold别设太低(比如 1),网络抖动容易误判,建议 3–5 - 确保 Go 代码监听
0.0.0.0:8080,不是127.0.0.1:8080—— 否则 readiness probe 从 Pod 外部发请求会超时 - 容器资源限制(
resources.limits.memory)至少给 128Mi,Go runtime GC 在小内存下行为不稳定,容易 OOMKilled
最常被忽略的一点:CI 流程里没校验 kubectl apply -f 的返回值。哪怕 YAML 语法错、字段拼错(比如写成 imge:),命令也返回 0。必须加 --dry-run=client -o yaml | kubectl diff -f - 或用 kubectl apply --validate=true(v1.26+)提前拦截。











