不使用 kubectl 访问 Kubernetes API
Access Kubernetes API without kubectl
我正在尝试直接访问 Kubernetes API 而无需 运行 kubectl -proxy
。
但是当我使用 serviceaccount default 的令牌时,我得到了 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作为Subject并将资源更改为pods)
然后我应用配置并尝试通过 curl 访问 pods:
$ 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
}
我猜错误消息显示身份验证部分没问题,因为看起来请求被正确识别为来自服务帐户 default:default。
但是我需要做什么才能授权此(或其他服务帐户)访问有关 pods 或节点的信息?
我在从 Pod 外部调用 curl 时看到此错误,但如果我 - 例如 - 使用 kubernetes java 客户端使用安装的秘密从 Pod 内访问 API在 /var/run/secrets.
下
我是一个K8s新手,所以如果这是一个愚蠢的问题,请原谅我。
关于配置:
我在具有一个主节点和两个工作节点的 Raspberry Pi 集群上安装了 K8s 1.8 运行。
我没有给 kubeadm init 传递太多信息,所以我猜它应该有默认配置。
FWIW kubectl describe 为 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
我认为你的 curl 路径有点问题,它应该是 /api/v1/namespaces/...
而不是 /v1/api/namespaces/...
。参见例如https://kubernetes.io/docs/api-reference/v1.8/#list-62
我正在尝试直接访问 Kubernetes API 而无需 运行 kubectl -proxy
。
但是当我使用 serviceaccount default 的令牌时,我得到了 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作为Subject并将资源更改为pods)
然后我应用配置并尝试通过 curl 访问 pods:
$ 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
}
我猜错误消息显示身份验证部分没问题,因为看起来请求被正确识别为来自服务帐户 default:default。 但是我需要做什么才能授权此(或其他服务帐户)访问有关 pods 或节点的信息?
我在从 Pod 外部调用 curl 时看到此错误,但如果我 - 例如 - 使用 kubernetes java 客户端使用安装的秘密从 Pod 内访问 API在 /var/run/secrets.
下我是一个K8s新手,所以如果这是一个愚蠢的问题,请原谅我。
关于配置: 我在具有一个主节点和两个工作节点的 Raspberry Pi 集群上安装了 K8s 1.8 运行。 我没有给 kubeadm init 传递太多信息,所以我猜它应该有默认配置。 FWIW kubectl describe 为 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
我认为你的 curl 路径有点问题,它应该是 /api/v1/namespaces/...
而不是 /v1/api/namespaces/...
。参见例如https://kubernetes.io/docs/api-reference/v1.8/#list-62