我有一个脚本在集群外部调用kubectl -server $server --certificate-authority $ca --token $token get pod --all-namespaces
,其中$token
来自服务帐户my-sa
(在命名空间my-ns
中),并且在RBAC下具有适当的限制权限。
我现在想重构它,以便脚本改为调用kubectl --kubeconfig my-service.conf get pod --all-namespaces
,即脚本应该引用kubeconfig文件而不是设置本地参数。遵循Kubernetes在/etc/kubernetes
中围绕自己的kubeconfigs的约定。
我尝试了以下kubeconfig my-service.conf
; <CA_DATA>
是/etc/kubernetes/pki/ca.crt
的base64编码内容,<SERVER>
与$server
相同,<TOKEN>
与$token
相同:
apiVersion: v1
kind: Config
clusters:
- cluster:
certificate-authority-data: <CA_DATA>
server: <SERVER>
name: my-cluster
contexts:
- context:
name: default-context
context:
cluster: my-cluster
user: default-user
current-context: default-context
users:
- name: my-service
user:
token: <TOKEN>
kubectl --kubeconfig /dev/null --server $server --certificate-authority /etc/kubernetes/pki/ca.crt --token $token get pods --all-namespaces
在命令行上有效,但是kubectl --kubeconfig my-service.conf get pod --all-namespaces
产生以下错误消息:
来自服务器的错误(禁止):禁止使用pods:用户 “ system:anonymous”无法在API组“”中列出资源“ pods” 集群范围
因此structure of my kubeconfig file仍然存在问题。为什么客户没有authenticate as system:serviceaccount:my-ns:my-sa
?怎么了?
更新我想知道在群集外部使用服务帐户令牌是否不合适(Kubernetes自己的kubeconfig使用客户端证书代替)。但是documentation然后清楚地声明:“服务帐户承载令牌在群集外使用是完全有效的。”
答案 0 :(得分:1)
您的上下文配置引用的凭据不存在...
您的凭据被指定为- name: my-service
,因此您的上下文应为:
- context:
name: default-context
context:
cluster: my-cluster
user: my-service # instead of default-user