Failed to negotiate an API version when using Kubernetes RBAC authorizer plugin

7/11/2016

I followed the instruction in reference document. I created a ClusterRole called 'admin-roles' granting admin privilege, and bound the role to user 'tester'.

In k8s master:

# curl localhost:8080/apis/rbac.authorization.k8s.io/v1alpha1/clusterroles
{
  "kind": "ClusterRoleList",
  "apiVersion": "rbac.authorization.k8s.io/v1alpha1",
  "metadata": {
    "selfLink": "/apis/rbac.authorization.k8s.io/v1alpha1/clusterroles",
    "resourceVersion": "480750"
  },
  "items": [
    {
      "metadata": {
        "name": "admins-role",
        "selfLink": "/apis/rbac.authorization.k8s.io/v1alpha1/clusterroles/admins-role",
        "uid": "88a58ac6-471a-11e6-9ad4-52545f942a3b",
        "resourceVersion": "479484",
        "creationTimestamp": "2016-07-11T03:49:56Z"
      },
      "rules": [
        {
          "verbs": [
            "*"
          ],
          "attributeRestrictions": null,
          "apiGroups": [
            "*"
          ],
          "resources": [
            "*"
          ]
        }
      ]
    }

# curl localhost:8080/apis/rbac.authorization.k8s.io/v1alpha1/clusterrolebindings
{
  "kind": "ClusterRoleBindingList",
  "apiVersion": "rbac.authorization.k8s.io/v1alpha1",
  "metadata": {
    "selfLink": "/apis/rbac.authorization.k8s.io/v1alpha1/clusterrolebindings",
    "resourceVersion": "480952"
  },
  "items": [
    {
      "metadata": {
        "name": "bind-admin",
        "selfLink": "/apis/rbac.authorization.k8s.io/v1alpha1/clusterrolebindings/bind-admin",
        "uid": "c53bbc34-471a-11e6-9ad4-52545f942a3b",
        "resourceVersion": "479632",
        "creationTimestamp": "2016-07-11T03:51:38Z"
      },
      "subjects": [
        {
          "kind": "User",
          "name": "tester"
        }
      ],
      "roleRef": {
        "kind": "ClusterRole",
        "name": "admins-role",
        "apiVersion": "rbac.authorization.k8s.io/v1alpha1"
      }
    }

But when run kubectl get pods with 'tester' as user:

error: failed to negotiate an api version; server supports: map[], client supports: map[extensions/v1beta1:{} authentication.k8s.io/v1beta1:{} autoscaling/v1:{} batch/v1:{} federation/v1alpha1:{} v1:{} apps/v1alpha1:{} componentconfig/v1alpha1:{} policy/v1alpha1:{} rbac.authorization.k8s.io/v1alpha1:{} authorization.k8s.io/v1beta1:{} batch/v2alpha1:{}]
-- Haoyuan Ge
kubernetes

1 Answer

7/11/2016

You can't hit the discovery API. Update the your ClusterRole to include "nonResourceURLs": ["*"].

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1alpha1
metadata:
  name: admins-role
rules:
  - apiGroups: ["*"]
    resources: ["*"]
    verbs: ["*"]
    nonResourceURLs: ["*"]
-- eric chiang
Source: StackOverflow