Доступ к Kubernetes API без kubectl

Я пытаюсь получить доступ к API Kubernetes напрямую без запуска kubectl -proxy, Но когда я использую токен учетной записи службы по умолчанию, я получаю 403. Даже после создания ClusterRole и ClusterRoleBinding для этой учетной записи, запрос отклоняется с 403.

Конфигурация, которую я применил, выглядит следующим образом:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: pod-reader
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

(Это почти тот же документ, что и на kubernetes io, он просто использовал ServiceAccount в качестве субъекта и изменил ресурс на pods).

Затем я применил конфигурацию и попытался получить доступ к модулям через curl:

$ kubectl apply -f secrets.yaml 
clusterrole "pod-reader" created
clusterrolebinding "pod-reader" created
$ curl https://192.168.1.31:6443/v1/api/namespaces/default/pods --header "Authorization: Bearer $TOKEN" --insecure
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "forbidden: User \"system:serviceaccount:default:default\" cannot get path \"/v1/api/namespaces/default/pods\"",
  "reason": "Forbidden",
  "details": {

  },
  "code": 403
}

Я предполагаю, что сообщение об ошибке показывает, что часть аутентификации в порядке, потому что похоже, что запрос был правильно идентифицирован как исходящий из значения serviceaccount default: default. Но что мне нужно сделать, чтобы дать этой (или другой учетной записи службы) право доступа к информации о модулях или узлах?

Я вижу эту ошибку при вызове curl извне Pod, но также, если я, например, использую Java-клиент kubernetes для доступа к API из Pod, используя секрет, смонтированный в /var/run/secrets.

Я новичок K8s, поэтому, пожалуйста, прости меня, если это глупый вопрос.

Что касается конфигурации: у меня K8s 1.8 работает на кластере Raspberry Pis с одним главным и двумя рабочими узлами. Я мало что передал kubeadm init, так что я думаю, что он должен иметь конфигурацию по умолчанию. FWIW kubectl description показывает эту команду для сервера:

  kube-apiserver
  --requestheader-group-headers=X-Remote-Group
  --service-account-key-file=/etc/kubernetes/pki/sa.pub
  --admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota
  --secure-port=6443
  --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
  --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
  --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
  --advertise-address=192.168.1.31
  --service-cluster-ip-range=10.96.0.0/12
  --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
  --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
  --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
  --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
  --enable-bootstrap-token-auth=true
  --requestheader-username-headers=X-Remote-User
  --allow-privileged=true
  --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
  --requestheader-extra-headers-prefix=X-Remote-Extra-
  --requestheader-allowed-names=front-proxy-client
  --client-ca-file=/etc/kubernetes/pki/ca.crt
  --insecure-port=0
  --authorization-mode=Node,RBAC
  --etcd-servers=http://127.0.0.1:2379

1 ответ

Решение

Я думаю, что у вас есть небольшая проблема на пути скручивания, это должно быть /api/v1/namespaces/... и не /v1/api/namespaces/..., Смотрите, например, https://kubernetes.io/docs/api-reference/v1.8/

Другие вопросы по тегам