使用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
相关产品推荐
相关产品推荐

