当前位置: 首页 > 知识库问答 >
问题:

不使用kubectl访问Kubernetes API

谈萧迟
2023-03-14

我试图直接访问Kubernetes API,而不运行kubectl-proxy。但是当我使用serviceaccount默认值的令牌时,我得到一个403。即使在为此serviceaccount创建了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。但是,我必须做些什么才能授权这个(或另一个服务帐户)访问有关POD或节点的信息呢?

当从Pod外部调用curl时,我会看到这个错误,但如果我使用kubernetes java客户机使用/var/run/secrets下挂载的秘密从Pod内部访问API,也会看到这个错误。

我是一个K8s新手,所以请原谅我,如果这是一个愚蠢的问题。

关于配置:我在一个Raspberry PI集群上运行K8S1.8,该集群有一个主节点和两个工作节点。我没有给kubeadm init传递太多信息,所以我想它应该有默认配置。FWIW kubectl description显示了Apiserver的以下命令:

  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个答案

公孙阳羽
2023-03-14

我认为您的curl路径有一点问题,应该是/api/v1/namespaces/...而不是/v1/api/namespaces/...。参见https://kubernetes.io/docs/api-reference/v1.8/#list-62

 类似资料:
  • kubectl 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes。 使用格式有两种: kubectl [flags]kubectl [command] get 显示一个或多个资源 describe 显示资源详情 create 从文件或标准输入创建资源 update 从文件或标准输入更新资源 delete 通过文件名、标准输入、资源名或者 label selector

  • 问题内容: 我正在寻找一种在Java App(使用JDBC)中打开Access MDB文件的方法。 快速的Google搜索建议我为此需要JDBC-ODBC Bridge。 这是否意味着我需要配置要在其上运行应用程序的每个系统,以便为要打开的MDB提供ODBC DSN? 还有一个问题(因为我以前从未使用过ODBC):通信是通过某种套接字(以客户机/服务器方式)还是通过方法/函数调用(例如嵌入Derb

  • null 我的问题是 为什么在一个集群中有三个操作来执行相同的任务? 这些操作的用例是什么? 他们在引擎盖下有什么不同?

  • 问题内容: 我正在使用Access,并尝试复制在MSDN上发现的某些语法。不幸的是,Access语法中的FROM语句似乎有问题。我不知道为什么。 问题答案: MS Access中枢转的语法与sql server不同。您必须使用该功能来旋转数据。 语法将类似于以下内容:

  • 我想访问用户的一个驱动器上传一个文件或检索文件使用图形API。我在网上看到了多个例子,这些例子要求用户使用标准登录页面进行登录。您需要从登录页面获得授权代码,然后使用它获得令牌,最后可以使用令牌访问像Drive这样的资源。 我正在寻找一种方法来做到这一点,而不需要通过登录页面。我可以有我自己的登录页面,我可以要求用户登录。 简而言之,我想使用像Postman这样的REST客户机访问Graph AP

  • 问题内容: 我正在尝试使用访存api来带回一些数据,但是一旦检索到它就无法将其映射到控制台。 我得到的错误是 response.map不是函数 所以我试图解析响应(即var data = JSON.parse),该响应不起作用,并显示错误 有趣的是,当对XMLHttp请求执行相同操作时,需要解析它,因此我也想知道为什么这两种检索数据方法之间的区别。 如果有人能指出正确的方向,我将不胜感激。 问题答