K8s集群构建签名验证部署实操

📅 2026/8/25 4:41:33
K8s集群构建签名验证部署实操
K8s集群构建签名验证部署实操技术栈Kubernetes v1.32.13 RBAC OIDC Vault Jenkins/GitLab CI Rocky Linux 8.6操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案K8s集群构建签名验证部署实操操作环境K8s 集群版本 v1.32.13已配置 RBAC 授权CI/CD 工具Jenkins / GitLab CI / GitHub Actions / ArgoCD密钥管理HashiCorp Vault外部 Secrets 管理OIDC 提供商GitLab / GitHub / KeycloakSSO 认证镜像仓库 Harbor v2.10.x项目级权限控制审计日志K8s Audit Log CI 审计日志对接原理流水线权限对接是 CI/CD 安全的核心确保构建和部署过程遵循最小权限原则防止凭据泄露和越权操作。K8s 侧通过 RBACRole/ClusterRole RoleBinding/ClusterRoleBinding为 CI ServiceAccount 授予最小权限区分命名空间级别Role和集群级别ClusterRole权限避免使用 cluster-admin 等超管权限。CI 侧通过凭据管理Jenkins Credentials / GitLab Variables / GitHub Secrets存储敏感信息支持掩码Masked、受保护Protected、环境作用域Environment scope防止日志泄露和未授权访问。高级方案OIDC 联邦认证无密钥GitHub Actions/GitLab CI 通过 OIDC Token 换取 K8s 短期凭证、Vault 动态密钥短期数据库凭据、云厂商 Access Key、External Secrets Operator从 Vault 同步到 K8s Secret。权限审计定期审查 CI 凭据和 K8s RBAC启用 K8s Audit Log 记录 API 操作CI 流水线记录所有执行操作。详细步骤1. 流水线权限基础操作# 查看 ServiceAccount kubectl get serviceaccount -n ci # 查看 Role kubectl get role -n default # 查看 RoleBinding kubectl get rolebinding -n default # 验证权限 kubectl auth can-i create deployments --assystem:serviceaccount:ci:ci-deployer -n default # 查看 kubeconfig kubectl config view # 轮换 Token kubectl delete secret ci-deployer-token -n ci kubectl apply -f ci-token.yaml2. 权限排错命令# 查看 ServiceAccount 权限 kubectl auth can-i --list --assystem:serviceaccount:ci:ci-deployer -n default # 查看 Role 详情 kubectl describe role ci-deployer-role -n default # 查看 RoleBinding kubectl describe rolebinding ci-deployer-binding -n default # 查看 Token 内容 kubectl get secret ci-deployer-token -n ci -o jsonpath{.data.token} | base64 -d | cut -d. -f2 | base64 -d | jq . # 测试 API 访问 APISERVER$(kubectl config view --minify -o jsonpath{.clusters[0].cluster.server}) TOKEN$(kubectl get secret ci-deployer-token -n ci -o jsonpath{.data.token} | base64 -d) curl -k --header Authorization: Bearer $TOKEN $APISERVER/api/v1/namespaces/default/pods验证流程# 1. 验证 ServiceAccount 权限 kubectl auth can-i create deployments --assystem:serviceaccount:ci:ci-deployer -n default # yes kubectl auth can-i delete namespaces --assystem:serviceaccount:ci:ci-deployer # no最小权限 ​ # 2. 验证 kubeconfig 可用 export KUBECONFIGci-kubeconfig.yaml kubectl get pods -n default # 正常列出 Pod kubectl get nodes # 应被拒绝无集群权限 ​ # 3. 验证 CI 凭据掩码 # Jenkins/GitLab/GitHub 构建日志中 # $HARBOR_PASS 显示为 ****** 或 [MASKED] # 不出现明文密码 ​ # 4. 验证 OIDC如配置 # GitHub Actions 日志显示: # OIDC token acquired # kubeconfig configured # 无需配置 K8S_SA_TOKEN Secret ​ # 5. 验证 Vault 动态密钥 # 数据库中查看临时用户 # SELECT usename FROM pg_user WHERE usename LIKE v-token-myapp-%; # 显示动态生成的用户TTL 过期后自动删除 ​ # 6. 验证审计日志 grep ci-deployer /var/log/kubernetes/audit.log | tail -5 # 显示 CI 的操作记录时间、用户、操作、资源 ​ # 7. 验证环境隔离 kubectl auth can-i create deployments --assystem:serviceaccount:ci:ci-deployer-dev -n production # nodev 环境 SA 无 production 权限排错方案CI 部署 Forbidden检查 ServiceAccount 是否存在Role/RoleBinding 是否正确绑定到目标命名空间资源和动词是否在 Role 中授权kubeconfig Token 是否正确kubectl auth can-i 验证Token 过期无效K8s v1.24 默认 Token 无过期但需手动创建 Secret检查 Secret 是否存在Token 是否被删除使用 OIDC 或 Vault 短期 Token 避免长期 Token 问题凭据日志泄露检查 CI 变量是否设置为 Masked/ProtectedwithCredentials 是否正确绑定是否在脚本中 echo 密码是否启用了凭据掩码插件日志中搜索密码关键词Harbor 推送 403检查机器人账号是否有项目推送权限Token 是否过期项目是否为私有且账号是否为项目成员不可变标签规则是否阻止覆盖Vault 认证失败检查 K8s Auth Method 配置ServiceAccount 是否匹配 roleVault Policy 是否授予读取权限Vault 地址是否可从 CI 访问Token 是否过期OIDC 登录失败检查 kube-apiserver OIDC 配置issuer-url/client-idGitHub Actions permissions 是否包含 id-token: writeRBAC 用户名称是否与 OIDC sub 匹配CA 证书是否正确审计日志不记录检查 kube-apiserver 是否配置 audit-policy-file 和 audit-log-path审计策略规则是否匹配日志文件路径是否可写kube-apiserver 是否重启生效环境越权检查 RoleBinding 的 namespace 是否正确ServiceAccount 是否绑定到正确环境NetworkPolicy 是否生效CI 流水线是否使用了错误环境的凭据定期审计权限绑定