Posted in

【Go语言云原生CI/CD实战指南】:阿里云ACK+GitHub Actions零基础落地全流程(附2024最新避坑清单)

第一章:Go语言云原生CI/CD落地全景图

云原生CI/CD并非工具链的简单堆砌,而是围绕Go语言特性深度协同的工程实践体系。Go的静态编译、极简依赖、原生并发模型与快速构建能力,使其天然适配容器化交付节奏——一次go build -o app ./cmd即可产出无依赖二进制,为不可变镜像奠定基础。

核心组件协同范式

  • 代码层:利用go mod vendor固化依赖快照,配合.golangci.yml统一静态检查规则;
  • 构建层:基于BuildKit加速多阶段Docker构建,关键指令示例如下:
    
    # 使用Go官方builder镜像进行交叉编译
    FROM golang:1.22-alpine AS builder
    WORKDIR /app
    COPY go.mod go.sum ./
    RUN go mod download
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o /bin/app ./cmd

极简运行时镜像

FROM alpine:latest COPY –from=builder /bin/app /app CMD [“/app”]

该流程规避C库依赖,镜像体积常低于15MB。

### 流水线关键决策点  
| 维度         | 推荐实践                          | 说明                                  |
|--------------|-----------------------------------|---------------------------------------|
| 触发机制     | Git tag + PR合并事件双轨触发       | Tag触发生产发布,PR触发测试与镜像预构建    |
| 测试策略     | 单元测试(`go test -race`)+ 契约测试 | `-race`启用竞态检测,保障并发安全          |
| 部署单元     | Helm Chart + Kustomize混合管理       | Go生成器(如`kubebuilder`)自动同步CRD定义 |

### 可观测性嵌入方式  
在Go服务启动时注入OpenTelemetry SDK,通过环境变量控制采样率:  
```go
// 初始化TracerProvider(生产环境建议使用Jaeger exporter)
provider := sdktrace.NewTracerProvider(
  sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(0.1))),
)
otel.SetTracerProvider(provider)

CI阶段自动注入OTEL_EXPORTER_OTLP_ENDPOINT,实现链路追踪零配置接入。

第二章:阿里云ACK集群的Go应用部署基建构建

2.1 ACK集群选型与Go应用适配性分析(含K8s版本、容器运行时与Go模块兼容性)

阿里云ACK(Alibaba Cloud Kubernetes)当前主流版本为v1.26–v1.28,对应默认容器运行时已全面切换至containerd v1.7+(CRI-O已逐步退出生产推荐)。Go应用需特别关注三方面协同:

  • K8s API 兼容性:Go client-go v0.28+ 要求 K8s server ≥ v1.26(因移除 batch/v1beta1 等废弃组)
  • 容器运行时行为差异:containerd 默认启用 unified cgroup v2,影响 Go runtime.GOMAXPROCS 自动探测逻辑
  • Go 模块依赖收敛:k8s.io/apimachinery v0.28.0 要求 Go ≥ 1.20.6(修复 net/http TLS 1.3 handshake race)
// 示例:显式设置 GOMAXPROCS 避免 cgroup v2 下 CPU quota 误判
func init() {
    if n := os.Getenv("K8S_CPU_LIMIT"); n != "" {
        if limit, err := strconv.ParseInt(n, 10, 64); err == nil {
            runtime.GOMAXPROCS(int(limit)) // 适配 containerd cgroup v2 的 cpu.max 解析
        }
    }
}

该初始化逻辑确保 Go 程序在 ACK 限制 CPU 的 Pod 中不因 runtime 自动探测导致线程数溢出。

K8s 版本 推荐 Go 版本 client-go 版本 关键注意事项
v1.26 ≥1.19.12 v0.26.x 移除 extensions/v1beta1
v1.28 ≥1.20.6 v0.28.x 强制启用 cgroup v2
graph TD
    A[ACK集群创建] --> B{K8s版本选择}
    B -->|v1.26+| C[containerd v1.7+]
    B -->|<v1.26| D[已停售/不推荐]
    C --> E[Go应用需适配cgroup v2 + client-go版本对齐]

2.2 基于Helm+Go模板的ACK环境标准化部署实践(含values.yaml动态注入与go.mod依赖校验)

Helm Chart结构设计

标准Chart目录需包含Chart.yaml、values.yaml、templates/及go.mod(用于Go模板编译校验):

# values.yaml —— 支持多环境动态注入
global:
  cluster: "prod-ack"
  region: "cn-hangzhou"
app:
  replicaCount: 3
  image:
    repository: "registry.aliyuncs.com/ack/app"
    tag: "{{ .Values.global.cluster }}-v1.2.0"  # Go模板变量插值

此处{{ .Values.global.cluster }}在Helm渲染时由--set global.cluster=staging等参数动态覆盖,实现环境隔离;tag字段依赖Go模板语法,需确保Helm版本≥3.8以支持完整text/template特性。

Go依赖与模板安全性校验

在CI流水线中执行:

helm template . --dry-run --debug | grep -q 'Error' || true
go mod verify  # 校验go.mod/go.sum一致性,防止恶意模板函数注入
校验项 工具 作用
模板语法合法性 helm template 静态渲染+语法检查
Go依赖完整性 go mod verify 确保自定义模板函数无篡改

部署流程自动化

graph TD
  A[CI触发] --> B[go mod verify]
  B --> C[helm lint]
  C --> D[helm template --dry-run]
  D --> E[ACK集群apply]

2.3 Go应用容器镜像最佳实践:多阶段构建、静态链接与安全扫描集成

多阶段构建精简镜像体积

利用 golang:alpine 构建器与 scratch 运行时分离编译与运行环境:

# 构建阶段
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-s -w' -o /usr/local/bin/app .

# 运行阶段
FROM scratch
COPY --from=builder /usr/local/bin/app /app
ENTRYPOINT ["/app"]

CGO_ENABLED=0 禁用 cgo 实现纯静态链接;-s -w 剥离符号表与调试信息,镜像体积可缩减 60%+。

安全左移:CI 中集成 Trivy 扫描

trivy image --severity HIGH,CRITICAL --format table my-go-app:latest
扫描项 工具 集成时机
OS 漏洞 Trivy 构建后推送前
Go 依赖漏洞 Trivy + SBOM go list -json -deps 输出解析

构建流程可视化

graph TD
    A[源码] --> B[Builder Stage:编译+静态链接]
    B --> C[Scratch Stage:仅含二进制]
    C --> D[Trivy 扫描]
    D --> E{无 CRITICAL 漏洞?}
    E -->|是| F[推送 registry]
    E -->|否| G[阻断流水线]

2.4 ACK服务网格(ASM)与Go微服务可观测性预埋方案(Metrics/Tracing/Logging三件套配置)

在ASM托管服务网格中,Go微服务需通过标准OpenTelemetry SDK实现可观测性“开箱即用”。核心在于统一采集层与网格Sidecar的协同。

预埋三件套集成策略

  • Metrics:使用otelmetric导出至Prometheus,通过ASM注入的istio-proxy自动抓取/metrics端点
  • Tracing:启用W3C Trace Context传播,Go服务默认注入traceparent头,ASM自动注入Jaeger Collector endpoint
  • Logging:结构化JSON日志经stdout输出,由Fluent Bit Sidecar采集并打标app, pod, trace_id

OpenTelemetry Go SDK关键配置

// 初始化全局TracerProvider(对接ASM Jaeger)
tp := sdktrace.NewTracerProvider(
    sdktrace.WithSampler(sdktrace.AlwaysSample()),
    sdktrace.WithSpanProcessor(
        sdktrace.NewBatchSpanProcessor(
            jaeger.New(jaeger.WithCollectorEndpoint(
                jaeger.WithEndpoint("http://tracing.istio-system.svc.cluster.local:14268/api/traces"),
            )),
        ),
    ),
)

该配置将Span直连ASM内置Jaeger Collector;AlwaysSample确保全量采样(生产环境建议替换为TraceIDRatioBased(0.01));WithEndpoint指向ASM系统命名空间内服务地址,依赖Kubernetes DNS解析。

组件 协议 ASM默认端点 数据流向
Metrics HTTP http://prometheus.istio-system.svc:9090 Prometheus → Grafana
Tracing gRPC/HTTP tracing.istio-system.svc:14268 (Thrift over HTTP) Jaeger UI
Logging stdout Fluent Bit → Loki LogQL查询
graph TD
    A[Go App] -->|OTLP/metrics| B[Prometheus Scraper]
    A -->|W3C traceparent| C[istio-proxy Sidecar]
    C -->|Thrift| D[Jaeger Collector in ASM]
    A -->|JSON stdout| E[Fluent Bit]
    E --> F[Loki]

2.5 面向Go应用的ACK弹性伸缩策略:HPA+VPA协同调优与goroutine泄漏防护机制

HPA与VPA职责解耦

HPA(Horizontal Pod Autoscaler)响应CPU/内存指标扩缩Pod副本数;VPA(Vertical Pod Autoscaler)动态调整单Pod资源请求(requests),二者互补而非互斥。关键在于避免资源争抢——VPA需禁用updateMode: Off以防止自动覆盖HPA触发的调度决策。

goroutine泄漏主动拦截

在Go应用入口注入健康检查钩子:

// 启动前注册goroutine泄漏检测
func init() {
    go func() {
        ticker := time.NewTicker(30 * time.Second)
        defer ticker.Stop()
        for range ticker.C {
            if n := runtime.NumGoroutine(); n > 500 {
                log.Warnf("goroutine leak detected: %d", n)
                debug.WriteHeapDump(os.Stderr) // 触发诊断快照
            }
        }
    }()
}

逻辑分析:每30秒采样goroutine数量,超阈值时写入堆转储供pprof分析;debug.WriteHeapDump非阻塞,避免影响主业务流;阈值500需根据应用基准线动态校准。

协同调优参数对照表

组件 关键参数 推荐值 作用
HPA targetCPUUtilizationPercentage 60% 触发扩容的CPU使用率基准
VPA minAllowed.memory 256Mi 防止内存请求过低导致OOMKilled
Prometheus Adapter metricsServer.timeout 30s 确保HPA指标采集不超时

弹性伸缩决策流程

graph TD
    A[Metrics Server采集指标] --> B{HPA判断}
    B -->|CPU>60%| C[增加Pod副本]
    B -->|CPU<40%| D[减少Pod副本]
    A --> E{VPA Recommender}
    E -->|内存request偏低| F[更新PodTemplate中requests]
    C & D & F --> G[RollingUpdate生效]

第三章:GitHub Actions驱动Go项目CI流水线设计

3.1 Go模块化CI流程编排:从go test -race到go vet的全链路质量门禁

质量门禁分层设计

CI流水线需按风险等级分阶段执行静态与动态检查:

  • 快速反馈层:go fmt + go vet(毫秒级,阻断明显语法/逻辑缺陷)
  • 可靠验证层:go test -short + go test -race(并发竞态检测,需 -race 标志启用数据竞争探测器)
  • 深度保障层:go test -coverprofile=coverage.out + golangci-lint run(覆盖率达85%+才允许合并)

关键命令解析

# 并发安全检查:启用竞态检测器,需链接时注入 runtime/race 包
go test -race -timeout=60s ./...  

-race 启用竞态检测器,为每个 goroutine 注入内存访问监控钩子;-timeout 防止死锁测试无限挂起;./... 确保递归覆盖所有子模块。

门禁执行顺序(Mermaid)

graph TD
    A[go fmt] --> B[go vet]
    B --> C[go test -short]
    C --> D[go test -race]
    D --> E[golangci-lint]

检查项对比表

工具 检测类型 平均耗时 可配置性
go vet 静态语义缺陷 高(可通过 -vet 参数开关)
go test -race 运行时竞态 2–5s 中(仅支持全局开启)

3.2 GitHub Actions缓存策略深度优化:Go build cache、vendor目录与Docker layer复用三重加速

Go Build Cache 复用

GitHub Actions 中启用 actions/cache 为 $HOME/go/pkg/mod 和 $GOCACHE 双路径缓存:

- name: Cache Go modules
  uses: actions/cache@v4
  with:
    path: |
      ~/go/pkg/mod
      ~/.cache/go-build
    key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}

hashFiles('**/go.sum') 确保依赖变更时缓存自动失效;~/.cache/go-build 是 Go 1.12+ 默认构建缓存路径,避免重复编译 .a 归档。

vendor 目录精准命中

若项目使用 go mod vendor,应单独缓存 vendor/ 并前置于 go build 步骤:

- name: Cache vendor directory
  uses: actions/cache@v4
  with:
    path: vendor
    key: ${{ runner.os }}-vendor-${{ hashFiles('go.mod', 'go.sum') }}

此策略规避 go build -mod=vendor 时的冗余扫描,提升中大型项目构建稳定性。

Docker Layer 智能复用

Docker 构建阶段需对 go mod download 与 COPY . . 分层隔离:

层级 指令 缓存友好性
1 COPY go.mod go.sum ./ 高(依赖变更才失效)
2 RUN go mod download 中(依赖内容决定)
3 COPY . . 低(源码频繁变动)
graph TD
  A[Checkout] --> B[Cache Go mod]
  B --> C[go mod download]
  C --> D[Cache vendor]
  D --> E[Docker build --cache-from]

3.3 Go单元测试覆盖率精准上报与Codecov集成(含go-coverprofile合并与分支保护联动)

覆盖率采集:多包合并生成统一 profile

执行以下命令并合并各子模块的 coverage.out 文件:

# 并行采集各包覆盖率(-covermode=count 更精确)
go test -covermode=count -coverprofile=coverage-unit.out ./pkg/...  
go test -covermode=count -coverprofile=coverage-cli.out ./cmd/...

# 使用 go tool cover 合并多个 profile(需 go1.22+)
go tool cover -func=coverage-unit.out,coverage-cli.out > coverage-summary.txt

go tool cover -func 支持逗号分隔的多个 .out 文件,自动加权合并计数型覆盖率;-covermode=count 比 atomic 更适合 Codecov 解析行级命中次数。

Codecov 自动化上报流程

# .codecov.yml 示例(关键字段)
coverage:
  precision: 2
  round: down
  range: "70...100"
  status:
    project: true
    patch: false
字段 说明 是否必需
precision 小数位数(影响阈值判断) ✅
status.project 主分支覆盖率失败时阻断 PR ✅

分支保护与覆盖率门禁联动

graph TD
  A[PR 提交] --> B[CI 运行 go test + codecov]
  B --> C{覆盖率 ≥ 85%?}
  C -->|是| D[允许合并]
  C -->|否| E[GitHub Status 失败 + 评论提示]
  • 所有 main 分支保护规则启用 Require status checks to pass before merging
  • Codecov status check 名为 codecov/project,由 codecov-action@v4 自动注册

第四章:CD阶段Go服务灰度发布与生产就绪保障

4.1 基于Argo Rollouts的Go服务金丝雀发布实战(含Prometheus指标驱动与自定义健康检查探针)

部署Rollout资源定义核心字段

apiVersion: argoproj.io/v1alpha1
kind: Rollout
spec:
  strategy:
    canary:
      steps:
      - setWeight: 10                 # 初始流量10%
      - pause: {duration: 60s}        # 观察60秒
      - analysis:
          templates:
          - templateName: prom-metrics # 关联Prometheus分析模板

setWeight 控制灰度流量比例;pause 提供人工/自动决策缓冲期;analysis 触发指标评估,避免硬编码阈值。

Prometheus分析模板关键配置

字段 说明 示例值
successCondition 指标达标逻辑表达式 rollout-canary-success-rate > 95
metrics 查询语句与窗口 sum(rate(http_request_duration_seconds_count{job="go-app",canary="true"}[5m]))

自定义健康检查探针集成

// /healthz endpoint returns structured readiness status
func healthzHandler(w http.ResponseWriter, r *http.Request) {
  status := map[string]interface{}{
    "ready":  dbPing() && cacheWarm(),
    "checks": map[string]bool{"db": dbPing(), "cache": cacheWarm()},
  }
  json.NewEncoder(w).Encode(status)
}

该探针被Argo Rollouts通过livenessProbe.httpGet.path: /healthz调用,返回结构化JSON供Rollout解析ready字段。

发布流程概览

graph TD
  A[Deploy Rollout CR] --> B[创建Canary ReplicaSet]
  B --> C[路由10%流量至新版本]
  C --> D[执行Prometheus指标分析]
  D --> E{达标?}
  E -- Yes --> F[推进至下一权重]
  E -- No --> G[自动回滚]

4.2 Go应用配置热更新与ACK ConfigMap/Secret动态挂载的可靠性验证

数据同步机制

ACK通过informer监听ConfigMap/Secret变更,触发kubelet更新挂载卷中的文件(/etc/config),并发送SIGHUP信号至容器内进程。

Go应用热加载实现

// 监听文件系统事件,触发配置重载
watcher, _ := fsnotify.NewWatcher()
watcher.Add("/etc/config/app.yaml")
for {
    select {
    case event := <-watcher.Events:
        if event.Op&fsnotify.Write == fsnotify.Write {
            cfg, _ := loadConfig("/etc/config/app.yaml") // 重新解析YAML
            atomic.StorePointer(&globalConfig, unsafe.Pointer(&cfg))
        }
    }
}

fsnotify.Write确保仅响应写入事件;atomic.StorePointer保障配置指针更新的原子性,避免竞态读取。

可靠性验证维度

验证项 方法 期望结果
挂载延迟 修改ConfigMap后秒级检测 ≤1.2s(ACK SLA)
配置一致性 对比Pod内文件与APIServer版本 SHA256哈希完全一致
进程无中断 持续HTTP请求压测中更新配置 99.99%请求零超时/失败
graph TD
    A[ConfigMap Update] --> B[etcd写入]
    B --> C[kube-apiserver广播]
    C --> D[kubelet informer接收]
    D --> E[更新本地volume cache]
    E --> F[触发mount bind reload]
    F --> G[Go应用fsnotify捕获]

4.3 生产级Go服务回滚机制:ACK快照备份、镜像版本追溯与GitHub Actions一键回退工作流

ACK集群快照策略

阿里云ACK支持通过aliyun cs CLI对节点池与ETCD执行定时快照,配合Terraform模块化管理:

# 每2小时触发一次ETCD快照(保留7天)
aliyun cs DescribeCluster --cluster-id $CLUSTER_ID \
  --output json | jq '.etcd_backup_config'

该命令验证快照配置是否启用;etcd_backup_config中enable字段为true且retention_days=7是生产基线要求。

镜像版本追溯链

组件 标识方式 追溯路径
Go二进制 git commit SHA Dockerfile 中 ARG COMMIT_SHA
Docker镜像 registry/v1:sha256-xxx manifest.json digest校验
Helm Release revision=12 helm history -o json 解析

GitHub Actions一键回退流程

- name: Rollback to previous stable release
  run: |
    PREV_REVISION=$(helm history ${{ env.RELEASE_NAME }} --max 2 | tail -n1 | awk '{print $1}')
    helm rollback ${{ env.RELEASE_NAME }} $PREV_REVISION

逻辑分析:helm history输出含revision、status、description三列,tail -n1取倒数第二条(最新成功部署),awk '{print $1}'提取revision编号用于精准回滚。

graph TD A[触发rollback事件] –> B[读取Helm历史] B –> C[定位上一个Successful revision] C –> D[执行helm rollback] D –> E[验证Pod Ready状态]

4.4 Go内存与GC行为监控接入ACK Prometheus:pprof暴露、runtime/metrics采集与告警阈值设定

pprof HTTP端点暴露

在Go服务中启用标准pprof接口:

import _ "net/http/pprof"

func startPprof() {
    go func() {
        log.Println(http.ListenAndServe("localhost:6060", nil)) // 仅限内网,不可暴露公网
    }()
}

localhost:6060 提供 /debug/pprof/heap、/goroutine 等端点;ACK Prometheus通过ServiceMonitor抓取需配合prometheus.io/scrape: "true"注解。

runtime/metrics 集成

Go 1.17+ 原生指标需显式注册:

import "runtime/metrics"

func registerRuntimeMetrics(reg prometheus.Registerer) {
    desc := prometheus.NewDesc("go_runtime_gc_pauses_seconds", "GC pause quantiles", nil, nil)
    reg.MustRegister(prometheus.NewGoCollector(
        prometheus.WithGoCollectorRuntimeMetrics(
            metrics.All,
        ),
    ))
}

metrics.All 包含 /gc/heap/allocs:bytes、/gc/pauses:seconds 等20+高精度指标,替代旧版runtime.ReadMemStats。

关键告警阈值建议

指标 阈值 触发场景
go_gc_pauses_quantiles{quantile="0.99"} > 50ms GC STW过长,影响RT
go_memstats_heap_inuse_bytes > 80% of container limit 内存压力预警
go_goroutines > 5000 协程泄漏风险
graph TD
    A[Go应用] -->|/debug/pprof/heap| B[Prometheus scrape]
    A -->|runtime/metrics| C[OpenMetrics exporter]
    B & C --> D[ACK Prometheus TSDB]
    D --> E[Alertmanager: GC pause > 50ms]

第五章:2024年Go+ACK+GitHub Actions避坑清单与演进展望

镜像拉取超时导致CI卡死

在阿里云ACK集群中,GitHub Actions Runner通过docker pull拉取私有镜像时,若未配置--registry-mirror或内网DNS解析异常,常触发10分钟超时后失败。2024年实测发现,将/etc/docker/daemon.json中添加"registry-mirrors": ["https://<your-vpc-registry>.mirror.aliyuncs.com"]并重启docker服务,可将平均拉取耗时从87s降至3.2s。需注意该镜像地址必须与ACK集群VPC同地域且已开通VPC内网访问权限。

Go模块校验失败引发构建中断

使用Go 1.22+构建时,go build -mod=readonly在Actions中频繁报错verifying github.com/xxx@v1.2.3: checksum mismatch。根本原因是Runner缓存的go.sum与私有仓库Git Tag签名不一致。解决方案为在steps中显式清除模块缓存并禁用校验:

- name: Clean Go mod cache
  run: |
    go clean -modcache
    echo "GOPROXY=https://goproxy.cn,direct" >> $GITHUB_ENV
    echo "GOSUMDB=off" >> $GITHUB_ENV

ACK Pod就绪探针与Actions部署竞态

当GitHub Actions执行kubectl apply -f deployment.yaml后立即调用curl http://svc:8080/healthz验证,常因Pod尚未通过readinessProbe而失败。2024年推荐采用wait-for-it.sh配合指数退避:

until curl -sf http://my-app.default.svc.cluster.local:8080/healthz; do
  echo "Waiting for pod..." && sleep $((RANDOM % 5 + 2))
done

GitHub Actions并发策略引发资源争抢

同一仓库多个PR触发Actions时,若均部署至共享ACK命名空间,易出现ConfigMap冲突或HPA指标覆盖。建议按PR ID隔离环境: PR编号 命名空间 Service名称
#123 pr-123 app-pr123
#456 pr-456 app-pr456

Go泛型编译错误在ARM64节点暴露

某团队将Go 1.21编写的泛型代码部署至ACK ARM64节点(c7a.large)时,go test ./...随机失败,错误为internal compiler error: unexpected nil type。经排查系Go 1.21.6对ARM64泛型优化存在缺陷,升级至Go 1.22.3后问题消失。需在.github/workflows/ci.yml中强制指定setup-go版本:

- uses: actions/setup-go@v4
  with:
    go-version: '1.22.3'
    architecture: 'arm64'

Mermaid流程图:ACK滚动更新与Actions协同机制

flowchart LR
  A[GitHub Push] --> B[Actions触发]
  B --> C[Build Docker镜像]
  C --> D[Push至ACR]
  D --> E[更新K8s Deployment Image]
  E --> F{RollingUpdate启动}
  F --> G[新Pod Ready?]
  G -->|Yes| H[旧Pod Terminating]
  G -->|No| I[回滚至上一版本]
  H --> J[更新Service Endpoint]

持续交付链路监控缺口

某生产事故源于Actions成功推送镜像后,ACK未触发自动滚动更新——原因在于Deployment的imagePullPolicy: Always被误设为IfNotPresent,且ACR镜像Tag被覆盖。2024年已在集群侧部署Prometheus告警规则:

kube_deployment_status_replicas_updated{namespace="prod"} != kube_deployment_spec_replicas{namespace="prod"}

Go内存泄漏检测盲区

在ACK中运行pprof分析时,发现Actions生成的二进制文件未启用-gcflags="-m"编译参数,导致逃逸分析缺失。现统一在CI脚本中加入:

go build -gcflags="-m -m" -o ./bin/app ./cmd/main.go

网络策略导致健康检查失败

启用ACK NetworkPolicy后,GitHub Actions Runner无法访问Pod的/metrics端点。经抓包确认是calico-node拦截了来自kube-system命名空间的ICMP请求。解决方案为添加NetworkPolicy白名单:

- apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
  metadata:
    name: allow-runner-metrics
  spec:
    podSelector:
      matchLabels:
        app: my-service
    ingress:
    - from:
      - namespaceSelector:
          matchLabels:
            kubernetes.io/metadata.name: kube-system
      ports:
      - protocol: TCP
        port: 9090

扎根云原生,用代码构建可伸缩的云上系统。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注