首页 > 解决方案 > 由于上下文,Kubernetes 部署失败

问题描述

我已经为本地部署创建了上下文。

root@jenkins-linux-vm:/usr/lib# kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
          K8sCluster-CC-pre-release     kubernetes   kubernetes-admin   K8sCluster-CC-pre-release
          PR                            kubernetes   kubernetes-admin   PR
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin

当我的詹金斯运行构建时,即使我已经创建了上下文及其指向(*),我也遇到了错误。

+ kubectl '--kubeconfig=****' '--context=K8sCluster-CC-pre-release' apply -f ./environment/pre-release '-n=pre-release'
error: context "K8sCluster-CC-pre-release" does not exist
tage('deployment') {
        container('kubectl') {
            withCredentials([kubeconfigFile(credentialsId: 'KUBERNETES_CLUSTER_CONFIG', variable: 'KUBECONFIG')]) {
            def kubectl
            echo 'Deployment Start'
              if(gitBranch == "future-master-fix") {
                 kubectl = "kubectl --kubeconfig=${KUBECONFIG} --context=K8sCluster-CC-pre-release"
                echo 'deploy to PRERELEASE!'
                sh "${kubectl} apply -f ./environment/pre-release -n=pre-release"
                echo 'Deployment End'
              }   
            }
        }
      }

标签: kubernetes

解决方案


当您进行配置时,您可能使用了更流行Jenkins的基于 as 的配置。Kubeconfig

基于Kubernetes CLI

该插件根据构建中提供的参数生成一个 kubeconfig 文件。该文件存储在 Jenkins 执行器上的一个临时文件夹中,确切的路径可以在 KUBECONFIG 环境变量中找到。kubectl 自动从这个环境变量中获取路径。一旦构建完成(或退出管道块),临时 kubeconfig 文件将自动删除。

当您使用时,kubectl config get-contexts您使用了来自${HOME}/.kube/config.

如果您检查kubectl config --help,您将获得:

  1. 如果设置了 --kubeconfig 标志,则仅加载该文件。该标志只能设置一次,并且不会发生合并。
  2. 如果设置了 $KUBECONFIG 环境变量,那么它将用作路径列表(系统的正常路径分隔规则)。这些路径被合并。当一个值被修改时,它在定义该节的文件中被修改。创建值时,它会在存在的第一个文件中创建。如果链中不存在文件,则创建列表中的最后一个文件。
  3. 否则,使用 ${HOME}/.kube/config 并且不会进行合并。

这意味着如果您在Kubernetes本地使用,您正在使用 option 3
Jenkins您使用选项1时,因此每次运行时都kubectl使用不同的配置,其中不包含 required context

在这个命令中:kubectl = "kubectl --kubeconfig=${KUBECONFIG} --context=K8sCluster-CC-pre-release"你正在覆盖kubeconfig,所以它找不到这个context

--kubeconfig=${KUBECONFIG}从代码中删除并重试。它应该工作。


推荐阅读