Running kubectl patch --local fails due to missing config

12/31/2020

I have a GitHub Actions workflow that substitutes value in a deployment manifest. I use kubectl patch --local=true to update the image. This used to work flawlessly until now. Today the workflow started to fail with a Missing or incomplete configuration info error.

I am running kubectl with --local flag so the config should not be needed. Does anyone know what could be the reason why kubectl suddenly started requiring a config? I can't find any useful info in Kubernetes GitHub issues and hours of googling didn't help.

Output of the failed step in GitHub Actions workflow:

Run: kubectl patch --local=true -f authserver-deployment.yaml -p '{"spec":{"template":{"spec":{"containers":[{"name":"authserver","image":"test.azurecr.io/authserver:20201230-1712-d3a2ae4"}]}}}}' -o yaml > temp.yaml && mv temp.yaml authserver-deployment.yaml

error: Missing or incomplete configuration info.  Please point to an existing, complete config file:


  1. Via the command-line flag --kubeconfig
  2. Via the KUBECONFIG environment variable
  3. In your home directory as ~/.kube/config

To view or setup config directly use the 'config' command.
Error: Process completed with exit code 1.

Output of kubectl version:

Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", 
GitCommit:"ffd68360997854d442e2ad2f40b099f5198b6471", GitTreeState:"clean", 
BuildDate:"2020-11-18T13:35:49Z", GoVersion:"go1.15.0", Compiler:"gc", 
Platform:"linux/amd64"}
-- Rafa de King
github-actions
kubectl
kubernetes

4 Answers

1/4/2021

You still need to set the config to access kubernetes cluster. Even tho you are modifying the file locally, you are still executing kubectl command that has to be ran against the cluster. By default, kubectl looks for a file named config in the $HOME/.kube directory.

error: current-context is not set indicates that there is no current context set for the cluster and kubectl cannot be executed against a cluster. You can create a context for Service Account using this tutorial.

-- kool
Source: StackOverflow

1/12/2021

Exporting KUBERNETES_MASTER environment variable should do the trick:

$ export KUBERNETES_MASTER=localhost:8081  # 8081 port, just to ensure it works 

$ kubectl version

Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.8", GitCommit:"9f2892aab98fe339f3bd70e3c470144299398ace", GitTreeState:"clean", BuildDate
:"2020-08-13T16:12:48Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8081 was refused - did you specify the right host or port?

# Notice the port 8081 in the error message ^^^^^^

Now patch also should work as always:

$ kubectl patch --local=true -f testnode.yaml -p '{"metadata":{"managedFields":[]}}'    # to get the file content use  -o yaml 
node/k8s-w1 patched

Alternatively, you can update kubectl to a later version. (v1.18.8 works fine even without the trick)

Explanation section:

The change is likely to be introduced by PR #86173 stop defaulting kubeconfig to http://localhost:8080

The change was reverted in Revert "stop defaulting kubeconfig to http://localhost:8080" #90243 for the later 18.x versions, see the issue kubectl --local requires a valid kubeconfig file #90074 for the details

-- VAS
Source: StackOverflow

2/10/2021

I ended up using sed to replace the string with image

  - name: Update manifests with new images
    working-directory: test/cloud
    run: |
      sed -i "s~image:.*$~image: ${{ steps.image_tags.outputs.your_new_tag }}~g" your-deployment.yaml

Works like a charm now.

-- Rafa de King
Source: StackOverflow

1/5/2021

As a workaround I installed kind (it does take longer for the job to finish, but at least it's working and it can be used for e2e tests later).

Added this step:

- name: Setup kind
        run: kubectl version
        uses: engineerd/setup-kind@v0.5.0

Also use --dry-run=client as an option for your kubectl command.

I do realize this is not the proper solution.

-- Akos Veres
Source: StackOverflow