1. import json
  2. from kubernetes import client, config
  3. config.kube_config.load_kube_config(config_file="./kubeconfig.yaml")
  4. api_client = client.ApiClient()
  5. namesapce = '???'
  6. url = '/apis/metrics.k8s.io/v1beta1/namespaces/' + namesapce + '/pods'
  7. ret_metrics = api_client.call_api(url, 'GET', auth_settings=['BearerToken'], response_type='json', _preload_content=False)
  8. response = ret_metrics[0].data.decode('utf-8')
  9. res = json.loads(response)
  10. for i in res['items']:
  11. for j in i['containers']:
  12. ## j['name'] ## 'le-15ccaef4-b63d-4e23-ae0c-418ab706d23b'
  13. ## j['usage']['cpu'] ## '1434540n'
  14. print('## memory: ',j['usage']['memory']) ## 'memory': '52308Ki'
  15. ## memory: 628128Ki
  16. ## memory: 6844156Ki
  17. ## memory: 52352Ki
  18. ## memory: 6208008Ki
  19. podname = '?????'
  20. url_pod = '/apis/metrics.k8s.io/v1beta1/namespaces/' + namesapce + '/pods/' + podname
  21. ret_metric = api_client.call_api(url_pod, 'GET', auth_settings=['BearerToken'], response_type='json', _preload_content=False)
  22. response = ret_metric[0].data.decode('utf-8')
  23. res = json.loads(response)
  24. for j in res['containers']:
  25. print('## memory: ',j['usage']['memory'])
  1. _token="XXXX"
  2. """
  3. ## /etc/lico/kube_server.csv
  4. ##
  5. #name,display_name,kube_cluster_addr,ingress_ctrl_addr,gpu_resource_name,prometheus_server
  6. mykube,My k8s,https://10.240.208.162:6443,http://10.240.208.94:31484,nvidia.com/gpu,http://10.240.208.94:31893
  7. """
  8. _pvc="zhouyj-pvc"
  9. _namespace="zhouyj"
  10. _job_name = "-e37d851f9b86"
  11. _stateful_name = "e37d851f9b86"
  12. _service_url="https://10.240.208.162:6443"
  13. gpu_resource_name="nvidia.com/gpu"
  14. from scheduler.adapter.kube.kuberesource.kube_client import KubeClient
  15. from scheduler.adapter.scheduler_factory import create_kubernetes_scheduler
  16. from client.auth.dataclass import RequireUserContext
  17. from scheduler.adapter.kube.kube_config import SchedulerConfig as KubeConfig
  18. _scheduler = create_kubernetes_scheduler(service_url=_service_url, namespace=_namespace, token=_token, pvc=_pvc, config=KubeConfig(gres_resource_dict={gpu_resource_name: "gpu"}))
  19. _scheduler._kube_client.list_job_pods(_namespace, _job_name)
  20. _scheduler._kube_client.list_stateful_pods(_namespace, _stateful_name)
  21. _get_mem(_scheduler._kube_client.api_client, _namespace, )
  22. # _kube_client = KubeClient(_token, _service_url)
  23. # _kube_client.list_job_pods(_namespace, _job_name)
  24. # _kube_client.list_stateful_pods(_namespace, _stateful_name)
  25. def _get_mem(api_client, namesapce, podname):
  26. import json
  27. url_pod = '/apis/metrics.k8s.io/v1beta1/namespaces/' + namesapce + '/pods/' + podname
  28. ret_metric = api_client.call_api(url_pod, 'GET', auth_settings=['BearerToken'], response_type='json', _preload_content=False)
  29. response = ret_metric[0].data.decode('utf-8')
  30. res = json.loads(response)
  31. for j in res['containers']:
  32. # print('## memory: ',j['usage']['memory'])
  33. return j['usage']['memory']
  34. _get_mem(_kube_client.api_client, _namespace, )
  35. _service_url="https://10.240.208.162:6443"
  36. _kube_client = KubeClient(_token, _service_url);_kube_client.list_job_pods(_namespace, _job_name)
  1. _get_mem(_scheduler._kube_client.api_client, _namespace, 'e37d851f9b86-gfk2b')
  2. /usr/lib/python3.6/site-packages/urllib3/connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  3. InsecureRequestWarning)
  4. Traceback (most recent call last):
  5. File "<console>", line 1, in <module>
  6. File "<console>", line 4, in _get_mem
  7. File "/usr/lib/python3.6/site-packages/kubernetes/client/api_client.py", line 353, in call_api
  8. _preload_content, _request_timeout, _host)
  9. File "/usr/lib/python3.6/site-packages/kubernetes/client/api_client.py", line 184, in __call_api
  10. _request_timeout=_request_timeout)
  11. File "/usr/lib/python3.6/site-packages/kubernetes/client/api_client.py", line 377, in request
  12. headers=headers)
  13. File "/usr/lib/python3.6/site-packages/kubernetes/client/rest.py", line 243, in GET
  14. query_params=query_params)
  15. File "/usr/lib/python3.6/site-packages/kubernetes/client/rest.py", line 233, in request
  16. raise ApiException(http_resp=r)
  17. kubernetes.client.exceptions.ApiException: (403)
  18. Reason: Forbidden
  19. HTTP response headers: HTTPHeaderDict({'Cache-Control': 'no-cache, private', 'Content-Type': 'application/json', 'X-Content-Type-Options': 'nosniff', 'Date': 'Sun, 25 Apr 2021 11:09:46 GMT', 'Content-Length': '438'})
  20. HTTP response body: b'{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"pods.metrics.k8s.io \\"8d73-e37d851f9b86-gfk2b\\" is forbidden: User \\"system:serviceaccount:zhou:default\\" cannot get resource \\"pods\\" in API group \\"metrics.k8s.io\\" in the namespace \\"zhou\\"","reason":"Forbidden","details":{"name":"e37d851f9b86-gfk2b","group":"metrics.k8s.io","kind":"pods"},"code":403}\n'
  21. >>>

问题

is forbidden

  1. [root@k8s-master k8s_api]# kubectl get apiservices
  2. NAME SERVICE AVAILABLE AGE
  3. v1. Local True 75d
  4. v1.admissionregistration.k8s.io Local True 75d
  5. v1.apiextensions.k8s.io Local True 75d
  6. v1.apps Local True 75d
  7. v1.authentication.k8s.io Local True 75d
  8. v1.authorization.k8s.io Local True 75d
  9. v1.autoscaling Local True 75d
  10. v1.batch Local True 75d
  11. v1.certificates.k8s.io Local True 60d
  12. v1.coordination.k8s.io Local True 75d
  13. v1.events.k8s.io Local True 60d
  14. v1.networking.k8s.io Local True 75d
  15. v1.rbac.authorization.k8s.io Local True 75d
  16. v1.scheduling.k8s.io Local True 75d
  17. v1.storage.k8s.io Local True 75d
  18. v1beta1.admissionregistration.k8s.io Local True 75d
  19. v1beta1.apiextensions.k8s.io Local True 75d
  20. v1beta1.authentication.k8s.io Local True 75d
  21. v1beta1.authorization.k8s.io Local True 75d
  22. v1beta1.batch Local True 75d
  23. v1beta1.certificates.k8s.io Local True 75d
  24. v1beta1.coordination.k8s.io Local True 75d
  25. v1beta1.discovery.k8s.io Local True 75d
  26. v1beta1.events.k8s.io Local True 75d
  27. v1beta1.extensions Local True 75d
  28. v1beta1.metrics.k8s.io kube-system/metrics-server True 59d
  29. v1beta1.networking.k8s.io Local True 75d
  30. v1beta1.node.k8s.io Local True 75d
  31. v1beta1.policy Local True 75d
  32. v1beta1.rbac.authorization.k8s.io Local True 75d
  33. v1beta1.scheduling.k8s.io Local True 75d
  34. v1beta1.storage.k8s.io Local True 75d
  35. v2beta1.autoscaling Local True 75d
  36. v2beta2.autoscaling Local True 75d
  37. [root@k8s-master k8s_api]# kubectl get svc metrics-server -n kube-system -o yaml > metrics-server.yaml
  38. [root@k8s-master k8s_api]# cat metrics-server.yaml
  39. apiVersion: v1
  40. kind: Service
  41. metadata:
  42. annotations:
  43. kubectl.kubernetes.io/last-applied-configuration: |
  44. {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"addonmanager.kubernetes.io/mode":"Reconcile","kubernetes.io/cluster-service":"true","kubernetes.io/name":"Metrics-server"},"name":"metrics-server","namespace":"kube-system"},"spec":{"ports":[{"nodePort":30731,"port":443,"protocol":"TCP","targetPort":"https"}],"selector":{"k8s-app":"metrics-server"},"type":"NodePort"}}
  45. creationTimestamp: "2021-02-25T03:27:04Z"
  46. labels:
  47. addonmanager.kubernetes.io/mode: Reconcile
  48. kubernetes.io/cluster-service: "true"
  49. kubernetes.io/name: Metrics-server
  50. managedFields:
  51. - apiVersion: v1
  52. fieldsType: FieldsV1
  53. fieldsV1:
  54. f:metadata:
  55. f:annotations:
  56. .: {}
  57. f:kubectl.kubernetes.io/last-applied-configuration: {}
  58. f:labels:
  59. .: {}
  60. f:addonmanager.kubernetes.io/mode: {}
  61. f:kubernetes.io/cluster-service: {}
  62. f:kubernetes.io/name: {}
  63. f:spec:
  64. f:externalTrafficPolicy: {}
  65. f:ports:
  66. .: {}
  67. k:{"port":443,"protocol":"TCP"}:
  68. .: {}
  69. f:nodePort: {}
  70. f:port: {}
  71. f:protocol: {}
  72. f:targetPort: {}
  73. f:selector:
  74. .: {}
  75. f:k8s-app: {}
  76. f:sessionAffinity: {}
  77. f:type: {}
  78. manager: kubectl-client-side-apply
  79. operation: Update
  80. time: "2021-03-12T09:46:17Z"
  81. name: metrics-server
  82. namespace: kube-system
  83. resourceVersion: "6879542"
  84. selfLink: /api/v1/namespaces/kube-system/services/metrics-server
  85. uid: 1858e3f9-28fa-4583-be32-7d7948a0042c
  86. spec:
  87. clusterIP: 10.1.77.113
  88. externalTrafficPolicy: Cluster
  89. ports:
  90. - nodePort: 30731
  91. port: 443
  92. protocol: TCP
  93. targetPort: https
  94. selector:
  95. k8s-app: metrics-server
  96. sessionAffinity: None
  97. type: NodePort
  98. status:
  99. loadBalancer: {}
  100. [root@k8s-master k8s_api]# kubectl get apiservices v1.batch -o yaml > batch.yaml
  101. [root@k8s-master k8s_api]# cat batch.yaml
  102. apiVersion: apiregistration.k8s.io/v1
  103. kind: APIService
  104. metadata:
  105. creationTimestamp: "2021-02-09T06:46:33Z"
  106. labels:
  107. kube-aggregator.kubernetes.io/automanaged: onstart
  108. name: v1.batch
  109. resourceVersion: "20"
  110. selfLink: /apis/apiregistration.k8s.io/v1/apiservices/v1.batch
  111. uid: 8bc5f1de-31b6-4d0e-92e4-cfd929f3827b
  112. spec:
  113. group: batch
  114. groupPriorityMinimum: 17400
  115. version: v1
  116. versionPriority: 15
  117. status:
  118. conditions:
  119. - lastTransitionTime: "2021-02-09T06:46:33Z"
  120. message: Local APIServices are always available
  121. reason: Local
  122. status: "True"
  123. type: Available
  124. [root@k8s-master k8s_api]# kubectl describe apiservices v1beta1.metrics.k8s.io
  125. Name: v1beta1.metrics.k8s.io
  126. Namespace:
  127. Labels: addonmanager.kubernetes.io/mode=Reconcile
  128. kubernetes.io/cluster-service=true
  129. Annotations: <none>
  130. API Version: apiregistration.k8s.io/v1
  131. Kind: APIService
  132. Metadata:
  133. Creation Timestamp: 2021-02-25T03:26:44Z
  134. Resource Version: 3510481
  135. Self Link: /apis/apiregistration.k8s.io/v1/apiservices/v1beta1.metrics.k8s.io
  136. UID: e7718cf6-7ef2-41d5-979f-f0a74900f0d9
  137. Spec:
  138. Group: metrics.k8s.io
  139. Group Priority Minimum: 100
  140. Insecure Skip TLS Verify: true
  141. Service:
  142. Name: metrics-server
  143. Namespace: kube-system
  144. Port: 443
  145. Version: v1beta1
  146. Version Priority: 100
  147. Status:
  148. Conditions:
  149. Last Transition Time: 2021-02-25T05:58:09Z
  150. Message: all checks passed
  151. Reason: Passed
  152. Status: True
  153. Type: Available
  154. Events: <none>
  155. [root@k8s-master k8s_api]# kubectl describe apiservices v1.batch
  156. Name: v1.batch
  157. Namespace:
  158. Labels: kube-aggregator.kubernetes.io/automanaged=onstart
  159. Annotations: <none>
  160. API Version: apiregistration.k8s.io/v1
  161. Kind: APIService
  162. Metadata:
  163. Creation Timestamp: 2021-02-09T06:46:33Z
  164. Resource Version: 20
  165. Self Link: /apis/apiregistration.k8s.io/v1/apiservices/v1.batch
  166. UID: 8bc5f1de-31b6-4d0e-92e4-cfd929f3827b
  167. Spec:
  168. Group: batch
  169. Group Priority Minimum: 17400
  170. Version: v1
  171. Version Priority: 15
  172. Status:
  173. Conditions:
  174. Last Transition Time: 2021-02-09T06:46:33Z
  175. Message: Local APIServices are always available
  176. Reason: Local
  177. Status: True
  178. Type: Available
  179. Events:

solution

RABC 绑定

  1. kind: Role
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. metadata:
  4. namespace: default
  5. name: metrics-reader
  6. rules:
  7. - apiGroups: ["metrics.k8s.io"]
  8. resources: ["pods"]
  9. verbs: ["get", "watch", "list"]
  10. - apiGroups: ["metrics.k8s.io"]
  11. resources: ["nodes"]
  12. verbs: ["get", "watch", "list"]
  13. ---
  14. kind: RoleBinding
  15. apiVersion: rbac.authorization.k8s.io/v1
  16. metadata:
  17. name: read-pods
  18. namespace: default
  19. subjects:
  20. - kind: User
  21. name: system:serviceaccount:zhouyj:default
  22. apiGroup: rbac.authorization.k8s.io
  23. roleRef:
  24. kind: Role
  25. name: metrics-reader
  26. apiGroup: rbac.authorization.k8s.io
  27. ---
  28. kind: ClusterRole
  29. apiVersion: rbac.authorization.k8s.io/v1
  30. metadata:
  31. name: metrics-reader
  32. rules:
  33. - apiGroups: ["metrics.k8s.io"]
  34. resources: ["pods"]
  35. verbs: ["get", "watch", "list"]
  36. - apiGroups: ["metrics.k8s.io"]
  37. resources: ["nodes"]
  38. verbs: ["get", "watch", "list"]
  39. ---
  40. apiVersion: rbac.authorization.k8s.io/v1
  41. kind: ClusterRoleBinding
  42. metadata:
  43. name: metrics
  44. roleRef:
  45. apiGroup: rbac.authorization.k8s.io
  46. kind: ClusterRole
  47. name: metrics-reader
  48. subjects:
  49. - kind: User
  50. name: system:serviceaccount:zhouyj:default
  51. apiGroup: rbac.authorization.k8s.io

end

参考: https://zhuanlan.zhihu.com/p/138995000