You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GitHub应用实现Kubernetes访问GHCR的认证及imagePullSecrets构建

使用GitHub应用实现Kubernetes访问GHCR的认证方案

核心思路

GitHub应用能生成短期、权限可控的访问令牌,比个人令牌更安全。我们要利用GitHub应用的身份凭证,生成Kubernetes可识别的imagePullSecrets密钥,实现拉取GHCR镜像的认证。

步骤分解

1. 创建并配置GitHub应用

  • 注册应用时,勾选读取和写入包权限(针对GHCR)。
  • 生成并下载应用的私钥(PEM格式),妥善保存,后续用来签名JWT获取访问令牌。

2. 生成GitHub应用访问令牌

用私钥签名JWT,向GitHub API请求短期令牌,可通过脚本实现:

# 替换为你的应用ID和私钥路径
APP_ID=123456
PRIVATE_KEY_PATH="./app-private-key.pem"

# 生成有效期10分钟的JWT
JWT=$(openssl dgst -sha256 -sign $PRIVATE_KEY_PATH <(echo -n "{
  \"iat\": $(date +%s),
  \"exp\": $(( $(date +%s) + 600 )),
  \"iss\": \"$APP_ID\"
}") | base64 | tr -d '\n' | tr '/+' '_-' | tr -d '=')

# 请求访问令牌,替换<INSTALLATION_ID>为你的应用安装ID
TOKEN=$(curl -s -X POST "https://api.github.com/app/installations/<INSTALLATION_ID>/access_tokens" \
  -H "Authorization: Bearer $JWT" \
  -H "Accept: application/vnd.github+json" | jq -r '.token')
  • 令牌默认有效期1小时,适合定期刷新。

3. 创建Kubernetes的imagePullSecrets密钥

GHCR对GitHub应用的认证有固定规则:用户名必须是_github-app,密码为上面获取的令牌:

kubectl create secret docker-registry ghcr-secret \
  --docker-server=ghcr.io \
  --docker-username=_github-app \
  --docker-password=$TOKEN \
  --docker-email=your-email@example.com

4. 在Kubernetes资源中引用密钥

在Deployment或Pod配置里指定imagePullSecrets:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  template:
    spec:
      imagePullSecrets:
        - name: ghcr-secret
      containers:
        - name: my-app
          image: ghcr.io/your-username/your-image:tag

5. 自动刷新令牌(可选)

因为令牌有效期短,建议用CronJob定期更新密钥:

  • 编写脚本重复步骤2和3,更新ghcr-secret的密码字段。
  • 创建CronJob,每50分钟运行一次脚本,确保令牌始终有效。

注意事项

  • 最小权限:GitHub应用只授予必要的包权限,避免过度授权。
  • 私钥安全:私钥不要存代码仓库,用Kubernetes Secrets管理,脚本中读取。
  • 令牌有效期:遵循短期令牌的安全最佳实践,不要设置过长。

内容的提问来源于stack exchange,提问作者ozlevka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:02:10