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

GitLab Runner执行kubectl apply提示未授权如何排查解决

GitLab CI执行kubectl出现Unauthorized授权失败问题排查

问题背景

在.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
      
  • 校验Runner挂载配置是否异常
    如果Runner是通过挂载宿主机kubeconfig文件给Job容器使用的:
    • 检查Runner配置文件config.toml中对应Docker执行器的挂载规则是否被误修改,确认宿主机~/.kube/config文件的权限为600、属主正确,容器内执行任务的root用户有读取权限
    • 检查近期是否做过K8s集群证书更新、RBAC权限调整,确认当前上下文绑定的kubernetes-admin用户权限未被回收、客户端证书未过有效期
  • 补充前置校验逻辑
    现有脚本中kubectl config set-context仅修改默认命名空间,不会自动校验凭证有效性,建议在所有kubectl写操作前先加连通性、权限校验步骤,出现问题时可以快速定位根因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:01:40