使用RBAC访问kubernetes中的单个pod

使用RBAC访问kubernetes中的单个pod,kubernetes,devops,rbac,Kubernetes,Devops,Rbac,我只想使用kubectl远程访问一个吊舱,所以遵循前面提到的说明 为此,我在kubernetes中创建了一个access.yml文件: --- apiVersion: v1 kind: ServiceAccount metadata: name: devops-user namespace: default --- kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: devops-user

我只想使用kubectl远程访问一个吊舱,所以遵循前面提到的说明

为此,我在kubernetes中创建了一个
access.yml
文件:

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: devops-user
  namespace: default

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: devops-user-limited-access
  namespace: default
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: devops-user-view
  namespace: default
subjects:
- kind: ServiceAccount
  name: devops-user
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: devops-user-limited-access
在我的远程笔记本电脑中,我在
~/.kube/config
中创建了一个文件,如下所示:

apiVersion: v1
kind: Config
preferences: {}

# Define the cluster
clusters:
- cluster:
    certificate-authority-data: <my-ca.crt>
    # You'll need the API endpoint of your Cluster here:
    server: https://<server-ip>:6443
  name: kubernetes

# Define the user
users:
- name: devops-user
  user:
    as-user-extra: {}
    client-key-data: <my-ca.crt>
    token: <token-created-by-k8s>

# Define the context: linking a user to a cluster
contexts:
- context:
    cluster: kubernetes
    namespace: default
    user: devops-user
  name: default

# Define current context
current-context: default
apiVersion:v1 种类:配置 首选项:{} #定义集群 集群: -群集: 证书颁发机构数据: #此处需要集群的API端点: 服务器:https://:6443 姓名:kubernetes #定义用户 用户: -姓名:devops用户 用户: 作为用户额外:{} 客户端密钥数据: 代币: #定义上下文:将用户链接到集群 上下文: -背景: 集群:kubernetes 名称空间:默认值 用户:devops用户 名称:默认值 #定义当前上下文 当前上下文:默认值 现在我可以“完全访问”所有播客,但这不是我想要的。我只想:

我只想“完全访问”一个吊舱


只需将其添加到您的角色文件中

resourceNames: ["POD_NAME"]
所以您的角色yaml文件应该是这样的

kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: devops-user-limited-access
  namespace: default
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["pods", "pods/log"]
  resourceNames: ["POD_NAME"] <-------------------------------here
  verbs: ["get", "list"]
种类:角色
apiVersion:rbac.authorization.k8s.io/v1beta1
元数据:
名称:devops用户有限访问
名称空间:默认值
规则:
-APIgroup:[“”、“扩展”、“应用程序”]
资源:[“pods”,“pods/log”]

resourceNames:[“POD_NAME”]我建议用不同的方法来解决这个问题。您可以使用特定的键值标记pod,然后使用策略引擎并使用策略语言编写策略,该语言允许特定服务帐户使用该特定的标签在pod上执行某些操作,如读、写等

在OPA中,验证webhook将根据您定义的策略允许或拒绝请求


正如其他答案中所建议的,如果您的pod是由部署创建的,那么kubernetes提供的RBAC将不起作用,因为在这种情况下,pod名称是动态生成的。使用OPA,您可以比Kubernetes RBAC拥有更精细的控制。

现在
kubectl get pod
抛出此错误:服务器错误(禁止):pod被禁止:用户“系统:服务帐户:默认:devops用户”无法在命名空间“默认”中列出API组“”中的资源“pod”@VahidF您确定您在默认名称空间中拥有该pod和角色吗?@VahidF通过使用
kubectl auth can-i get pods-n default-作为devops用户检查您得到的答案。确保你想要的豆荚在同一个位置namespace@VahidF你能描述一下devops用户有限访问的角色吗?
kubectl否。我正在设法向你展示输出。