Skip to content

Version 32.0.0 gke-gcloud-auth-plugin configuration break #2334

Closed
@savvykms

Description

@savvykms

What happened (please include outputs or screenshots):

Attempting to run a simple test program to merely load configuration breaks with a json.dumps TypeError error when using a configuration file similar to those generated by executing the gcloud container clusters get-credentials <cluster> --region <region> --project <gcp_project> command with the gke-gcloud-auth-plugin authentication helper installed:

$ cat test.py
from kubernetes import client, config
config.load_kube_config()
$ KUBECONFIG=config python test.py
ERROR:root:Object of type ConfigNode is not JSON serializable

What you expected to happen:

Empty output (provided a valid non-example configuration is provided and one has the gcloud auth plugin installed).

How to reproduce it (as minimally and precisely as possible):

Create a test Kubernetes configuration file as follows as a file called config:

apiVersion: v1
kind: Config
preferences: {}
contexts:
- context:
    cluster: test-cluster
    user: test-user
  name: test
clusters:
- cluster:
    certificate-authority-data: bm90X2FfcmVhbF9jZXJ0Cg==
    server: https://w.x.y.z
  name: test-cluster
users:
- name: test-user
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      command: gke-gcloud-auth-plugin
      installHint: Install gke-gcloud-auth-plugin for use with kubectl by following
        https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin
      provideClusterInfo: true
current-context: test

Create a test.py script as follows:

from kubernetes import client, config
config.load_kube_config()

Ensure kubernetes 32.0.0 is installed (31.0.0 works for me):

pip install kubernetes==32.0.0

Execute the script, specifying the KUBECONFIG environment variable to override the default location to your test file:

KUBECONFIG=config python test.py

You should receive the following error message from the default logger due to the error being caught and logged without a stacktrace:

ERROR:root:Object of type ConfigNode is not JSON serializable

Anything else we need to know?:

This is likely due to the call here passing in a kubernetes_exec_info structure containing a ConfigNode instance rather than serializable Python native types:
https://github.com/kubernetes-client/python/blob/v32.0.0/kubernetes/base/config/exec_provider.py#L76

I haven't looked extensively into what could have changed between versions, but version 31.0.0 appears to work; FWIW here's the requirements.txt for a more-involved test project where version 31.0.0 appears to function with the test file; swapping kubernetes==32.0.0 in breaks it:

toml==0.10.2
typer==0.15.1
google-cloud-logging==3.11.3
kubernetes==31.0.0

I'm also using pyenv with a virtualenv whereas the gke-gcloud-auth-plugin binary likely uses the system python installation; this shouldn't matter as it's invoked in a subprocess, just as relative versus absolute path in the kube config for it likewise doesn't make a difference. You shouldn't need to even install it to reproduce, as it fails prior to the subprocess call AFAICT; that said, I haven't tried it on a totally 100% clean system without it installed.

Environment:

  • Kubernetes version (kubectl version):
Client Version: v1.31.2
Kustomize Version: v5.4.2
Server Version: v1.31.4-gke.1256000
  • OS:
    Mac OSX 12.6.1

  • Python version (python --version)

Python 3.9.20
  • Python client version (pip list | grep kubernetes)
kubernetes                     32.0.0

Metadata

Metadata

Assignees

Labels

kind/bugCategorizes issue or PR as related to a bug.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions