我有一个Kubernetes v1.9.3(无OpenShift)集群,我想通过ManageIQ(gaprindashvili-3作为Docker容器运行)进行管理。
我准备在these instructions之后与k8s集群进行ManageIQ交互。请注意,我仅执行了上一节中列出的步骤(准备将群集与ManageIQ一起使用),因为之前的步骤是用于设置k8s群集的,并且我已经有一个正在运行的群集。
我已成功将k8s容器提供程序添加到ManageIQ,但仪表板未报告任何内容:0个节点,0个容器,0个服务等...,而集群中确实有节点,服务和正在运行的容器。我查看了ManageIQ的/var/log/evm.log
的内容,发现此错误:
[----] E, [2018-06-21T10:06:40.397410 #13333:6bc9e80] ERROR – : [KubeException]: events is forbidden: User “system:serviceaccount:management-infra:management-admin” cannot list events at the cluster scope: clusterrole.rbac.authorization.k8s.io “cluster-reader” not found Method:[block in method_missing]
因此,群集中未定义ClusterRole
cluster-reader
。我仔细检查了kubectl get clusterrole cluster-reader
,并确认cluster-reader
丢失。作为解决方案,我尝试手动创建
cluster-reader
。我在k8s文档中找不到任何引用,尽管OpenShift文档中已提及它。因此,我研究了OpenShift v3.9中cluster-reader
的定义。它的定义在不同的OpenShift版本中有所不同,我选择了3.9,因为它基于我正在使用的k8s v1.9。因此,这就是我在OpenShift 3.9文档中发现的内容:Name: cluster-reader
Labels: <none>
Annotations: authorization.openshift.io/system-only=true
rbac.authorization.kubernetes.io/autoupdate=true
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
[*] [] [get]
apiservices.apiregistration.k8s.io [] [] [get list watch]
apiservices.apiregistration.k8s.io/status [] [] [get list watch]
appliedclusterresourcequotas [] [] [get list watch]
我编写了以下yaml定义,以便在集群中创建等效的ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-reader
rules:
- apiGroups: ["apiregistration"]
resources: ["apiservices.apiregistration.k8s.io", "apiservices.apiregistration.k8s.io/status"]
verbs: ["get", "list", "watch"]
- nonResourceURLs: ["*"]
verbs: ["get"]
我没有在受监视的资源中包括
appliedclusterresourcequotas
,因为据我了解这是仅OpenShift的资源(但我可能会误会)。我在ManageIQ上删除了旧的k8s容器提供程序,并在创建了
cluster-reader
后创建了一个新的容器提供程序,但未进行任何更改,仪表板仍然不显示任何内容(0个节点,0个 pods 等)。我查看了ManageIQ中/var/log/evm.log
的内容,这次报告了这些错误:[----] E, [2018-06-22T11:15:39.041903 #2942:7e5e1e0] ERROR -- : MIQ(ManageIQ::Providers::Kubernetes::ContainerManager::EventCatcher::Runner#start_event_monitor) EMS [kubernetes-01] as [] Event Monitor Thread aborted because [events is forbidden: User "system:serviceaccount:management-infra:management-admin" cannot list events at the cluster scope]
[----] E, [2018-06-22T11:15:39.042455 #2942:7e5e1e0] ERROR -- : [KubeException]: events is forbidden: User "system:serviceaccount:management-infra:management-admin" cannot list events at the cluster scope Method:[block in method_missing]
那我在做什么错?我该如何解决这个问题?
如果它有任何用处,here,您可以找到我用来设置k8s集群以与ManageIQ交互的整个.yaml文件(也存在所有必需的 namespace ,服务帐户和集群角色绑定(bind))。
最佳答案
为了使ClusterRole
生效,必须将其绑定(bind)到组management-infra
或用户management-admin
上。
创建组绑定(bind)的示例:
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-cluster-state
subjects:
- kind: Group
name: management-infra
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-reader
apiGroup: rbac.authorization.k8s.io
应用此文件后,更改将立即发生。无需重启集群。
查看更多信息here。