GitLab Runner执行kubectl apply提示未授权如何排查解决
问题背景
在.gitlab-ci.yml中配置的deploy_internal_dev部署阶段任务此前一直可正常运行,近期GitLab Runner执行kubectl相关命令时突然出现授权失败问题。
现有CI配置
deploy_internal_dev: stage: deploy_internal only: - master image: image environment: name: Dev url: url script: - pwd - whoami - kubectl config set-context --current --namespace=xxx - kubectl delete -f kube/kube-dev/deployment.yml --now --timeout=100s || { echo "gracefull delete failed" ; kubectl delete -f kube/kube-dev/deployment.yml --grace-period=0 --force ; } || true - kubectl apply -f kube/kube-dev tags: - development dependencies: [ ]
任务执行报错日志
Executing "step_script" stage of the job script Using docker image sha256:88fd9345c2d8e3a95a9b1f792c3f330e7e529b7c217ee1d607ef9cb2a62288ca for docker.xxxx.net/xxx/kubectl-dev:1.0.0 with digest docker.xxx.net/xxxx/kubectl-dev@sha256:73548cd419ff37db648cb88285c4fc6dc1b3c9ab1addc7a050b2866e5f51bb78 ... $ pwd /builds/xxx-ckdu/xxx-api $ whoami root $ kubectl config set-context --current --namespace=xxx Context "kubernetes-admin@kubernetes" modified. $ kubectl delete -f kube/kube-dev/deployment.yml --now --timeout=100s || { echo "gracefull delete failed" ; kubectl delete -f kube/kube-dev/deployment.yml --grace-period=0 --force ; } || true error: unable to recognize "kube/kube-dev/deployment.yml": Unauthorized gracefull delete failed warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely. error: unable to recognize "kube/kube-dev/deployment.yml": Unauthorized $ kubectl apply -f kube/kube-dev error: You must be logged in to the server (the server has asked for the client to provide credentials) ERROR: Job failed: exit code 1
已确认现象
- SSH登录对应Runner所在服务器时,直接执行相同kubectl命令可正常完成Kubernetes资源配置应用,宿主机kube配置无异常。
排查与解决方案
- 校验容器内kube凭证有效性
当前使用的自定义kubectl镜像如果是把kubeconfig直接打包在镜像内部,90%以上的同类突发故障都是集群证书轮转、绑定的ServiceAccount过期/权限被回收导致:- 先在CI脚本kubectl操作前新增
kubectl config view、kubectl cluster-info命令,打印容器内加载的集群地址、证书、用户信息,和宿主机上正常可用的~/.kube/config内容做逐行比对 - 禁止把kubeconfig硬编码打包进镜像,改为通过GitLab项目级CI/CD变量存储kubeconfig的base64编码内容,任务执行时动态写入配置,避免证书更新后需要重新构建镜像,示例脚本:
# 提前在GitLab CI变量中配置KUBE_CONFIG_DEV,值为本地正常kubeconfig文件base64编码后的结果 mkdir -p ~/.kube echo "$KUBE_CONFIG_DEV" | base64 -d > ~/.kube/config # 提前做权限校验,避免后续流程执行到一半才报错 kubectl auth can-i get deployments -n xxx
- 先在CI脚本kubectl操作前新增
- 校验Runner挂载配置是否异常
如果Runner是通过挂载宿主机kubeconfig文件给Job容器使用的:- 检查Runner配置文件
config.toml中对应Docker执行器的挂载规则是否被误修改,确认宿主机~/.kube/config文件的权限为600、属主正确,容器内执行任务的root用户有读取权限 - 检查近期是否做过K8s集群证书更新、RBAC权限调整,确认当前上下文绑定的
kubernetes-admin用户权限未被回收、客户端证书未过有效期
- 检查Runner配置文件
- 补充前置校验逻辑
现有脚本中kubectl config set-context仅修改默认命名空间,不会自动校验凭证有效性,建议在所有kubectl写操作前先加连通性、权限校验步骤,出现问题时可以快速定位根因。
内容的提问来源于stack exchange,提问作者Bawantha
相关产品推荐
相关产品推荐

