{"id":348,"date":"2019-04-11T00:15:02","date_gmt":"2019-04-10T16:15:02","guid":{"rendered":"https:\/\/blog.espnlol.com\/?p=348"},"modified":"2022-04-20T18:28:37","modified_gmt":"2022-04-20T10:28:37","slug":"kubernetes%e7%9a%84metrics-api%e5%92%8cmetrics-server","status":"publish","type":"post","link":"https:\/\/blog.espnlol.com\/?p=348","title":{"rendered":"Kubernetes\u7684Metrics API\u548cMetrics Server"},"content":{"rendered":"<p>\u4ece v1.8 \u5f00\u59cb\uff0c\u8d44\u6e90\u4f7f\u7528\u60c5\u51b5\u7684\u5ea6\u91cf\uff08\u5982\u5bb9\u5668\u7684 CPU \u548c\u5185\u5b58\u4f7f\u7528\uff09\u53ef\u4ee5\u901a\u8fc7 Metrics API \u83b7\u53d6\u3002\u6ce8\u610f\uff1a<\/p>\n<p>Metrics API \u53ea\u53ef\u4ee5\u67e5\u8be2\u5f53\u524d\u7684\u5ea6\u91cf\u6570\u636e\uff0c\u5e76\u4e0d\u4fdd\u5b58\u5386\u53f2\u6570\u636e<br \/>\nMetrics API URI \u4e3a \/apis\/metrics.k8s.io\/\uff0c\u5728 k8s.io\/metrics \u7ef4\u62a4<br \/>\n\u5fc5\u987b\u90e8\u7f72 metrics-server \u624d\u80fd\u4f7f\u7528\u8be5 API\uff0cmetrics-server \u901a\u8fc7\u8c03\u7528 Kubelet Summary API \u83b7\u53d6\u6570\u636e<\/p>\n<p>\u4e0b\u9762\u8bb0\u5f55\u4e86\u4e00\u4e0bKubernetes1.13\u5b89\u88c5metrics-server\u53ca\u586b\u5751\uff0c\u8fd9\u91cc\u6211\u4f7f\u7528\u4e86yaml\u7684\u65b9\u5f0f\u5b89\u88c5<\/p>\n<p>\u5c06metrics-server\u514b\u9686\u5230\u76ee\u6807\u673a\u5668\uff08\u53ef\u64cd\u4f5ckubectl\u547d\u4ee4\u7684\u673a\u5668\uff09<\/p>\n<pre class=\"lang:default decode:true \">git clone https:\/\/github.com\/kubernetes-incubator\/metrics-server.git<\/pre>\n<p>\u76ee\u524dmetrics-server\u7684\u6700\u65b0\u7248\u672c\u662fv0.3.1,\u5982\u679c\u90e8\u7f72v0.2\u7248\u672c\u4ee5\u4e0a\u7684\u8fdb1.8+\u8fd9\u4e2a\u76ee\u5f55\uff0c\u5982\u679c\u662fv0.2\u7248\u672c\u4ee5\u4e0b\u8fdb\u51651.7\u8fd9\u4e2a\u76ee\u5f55\uff0c\u6b64\u6b21 \u6211\u90e8\u7f72\u7684\u662fv0.3.1\uff0c\u6240\u4ee5\u8fdb\u51651.8+\u76ee\u5f55<\/p>\n<pre class=\"lang:default decode:true \">[root@localhost ~]# ls metrics-server\/deploy\/1.8+ \r\naggregated-metrics-reader.yaml  auth-delegator.yaml  auth-reader.yaml  metrics-apiservice.yaml  metrics-server-deployment.yaml  metrics-server-service.yaml  resource-reader.yaml<\/pre>\n<p>\u5b89\u88c5<\/p>\n<pre class=\"lang:default decode:true \">kubectl apply -f .\/<\/pre>\n<p>\u9a8c\u8bc1\u5b89\u88c5\u662f\u5426\u6210\u529f,\u5982\u4e0b\u663e\u793a\u8bc1\u660e\u5b89\u88c5\u6210\u529f\uff0c\u63a5\u53e3\u5df2\u7ecf\u901a\u4e86<\/p>\n<pre class=\"lang:default decode:true\">[root@localhost ~]# kubectl api-versions |grep metrics\r\nmetrics.k8s.io\/v1beta1\r\n[root@localhost ~]# kubectl get --raw \"\/apis\/metrics.k8s.io\/v1beta1\/nodes\" | jq \r\n{\r\n  \"kind\": \"NodeMetricsList\",\r\n  \"apiVersion\": \"metrics.k8s.io\/v1beta1\",\r\n  \"metadata\": {\r\n    \"selfLink\": \"\/apis\/metrics.k8s.io\/v1beta1\/nodes\"\r\n  },<\/pre>\n<p>\u4f7f\u7528kubectl top \u67e5\u770b\u8282\u70b9\u4fe1\u606f<\/p>\n<pre class=\"lang:default decode:true\">kubectl top node\r\nerror: metrics not available yet<\/pre>\n<p>\u4e0a\u8ff0\u547d\u4ee4\u53d1\u73b0\u65e0\u6cd5\u4f7f\u7528\uff0c\u4e0b\u9762\u5f00\u59cb\u6392\u9519<\/p>\n<pre class=\"lang:default decode:true \">kubectl logs metrics-server-68d85f76bb-8mmw6 -n kube-system\r\nE0304 09:14:52.776119 1 reststorage.go:129] unable to fetch node metrics for node \"node1\": no metrics known for node\r\n\r\nE0304 09:15:03.649147 1 manager.go:102] unable to fully collect metrics: [unable to fully scrape metrics from source kubelet_summary:node1: unable to fetch metrics from Kubelet node1 (node1): Get https:\/\/node1:10250\/stats\/summary\/: dial tcp: lookup node1 on 10.80.0.10 :53: no such host, unable to fully scrape metrics from source kubelet_summary:k8s-master: unable to fetch metrics from Kubelet k8s-master (k8s-master): Get https:\/\/k8s-master:10250\/stats\/summary\/: dial tcp: lookup k8s-master on 10.80.0.10 :53: no such host, unable to fully scrape metrics from source kubelet_summary:k8s-node1: unable to fetch metrics from Kubelet k8s-node1 (k8s-node1): Get https:\/\/k8s-node1:10250\/stats\/summary\/: dial tcp: lookup k8s-node1 on 10.80.0.10 :53: no such host]<\/pre>\n<p>\u901a\u8fc7\u65e5\u5fd7\u53d1\u73b0\u4e24\u4e2a\u95ee\u9898:<br \/>\n1,coredns\u65e0\u6cd5\u89e3\u6790node1\u8fd9\u4e2a\u8282\u70b9\uff0c\u5bfc\u81f4metrics-server\u65e0\u6cd5\u83b7\u53d6\u8282\u70b9\u4fe1\u606f<br \/>\n2,10250\u662f\u4e2ahttps\u7aef\u53e3\uff0c\u9700\u8981\u8bc1\u4e66\u8ba4\u8bc1<\/p>\n<pre class=\"lang:default decode:true\">---\r\napiVersion: v1\r\nkind: ServiceAccount\r\nmetadata:\r\n  name: metrics-server\r\n  namespace: kube-system\r\n---\r\napiVersion: extensions\/v1beta1\r\nkind: Deployment\r\nmetadata:\r\n  name: metrics-server\r\n  namespace: kube-system\r\n  labels:\r\n    k8s-app: metrics-server\r\nspec:\r\n  selector:\r\n    matchLabels:\r\n      k8s-app: metrics-server\r\n  template:\r\n    metadata:\r\n      name: metrics-server\r\n      labels:\r\n        k8s-app: metrics-server\r\n    spec:\r\n      serviceAccountName: metrics-server\r\n      volumes:\r\n      # mount in tmp so we can safely use from-scratch images and\/or read-only containers\r\n      - name: tmp-dir\r\n        emptyDir: {}\r\n      containers:\r\n      - name: metrics-server\r\n        image: k8s.gcr.io\/metrics-server-amd64:v0.3.1\r\n        imagePullPolicy: IfNotPresent\r\n        command:\r\n        - \/metrics-server\r\n        - --kubelet-insecure-tls\r\n        - --kubelet-preferred-address-types=InternalIP\r\n        volumeMounts:\r\n        - name: tmp-dir\r\n          mountPath: \/tmp<\/pre>\n<p>\u7f16\u8f91metrics-server-deployment.yaml,\u589e\u52a0\u5982\u4e0b\u53c2\u6570<br \/>\ncommand:<br \/>\n&#8211; \/metrics-server<br \/>\n&#8211; &#8211;kubelet-insecure-tls #\u8868\u793a\u4e0d\u9a8c\u8bc1\u5ba2\u6237\u7aef\u8bc1\u4e66<br \/>\n&#8211; &#8211;kubelet-preferred-address-types=InternalIP #\u8868\u793a\u76f4\u63a5\u8bf7\u6c42IP<\/p>\n<pre class=\"lang:default decode:true \">kubectl apply -f metrics-server-deployment.yaml<\/pre>\n<p>\u518d\u6b21\u4f7f\u7528kubectl top node\u67e5\u770b<\/p>\n<pre class=\"lang:default decode:true \">[root@localhost 1.8+]# kubectl top nodes\r\nNAME                    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   \r\nlocalhost.localdomain   244m         24%    1222Mi          70%       \r\nnode1                   113m         11%    718Mi           19%       \r\nnode2                   68m          6%     444Mi           12%<\/pre>\n<p>\u5982\u4e0a\u8ff0\u64cd\u4f5c\u6267\u884c\u540e\uff0ccoredns\u4f9d\u65e7\u4f1a\u62a5\u9519\uff0c\u4e0b\u9762\u63d0\u4f9b\u4e24\u79cd\u89e3\u51b3\u529e\u6cd5<\/p>\n<p>\u7f16\u8f91coredns\u7684ConfigMap\u6587\u4ef6<\/p>\n<p>\u65b9\u6cd5\u4e00\uff1a\u589e\u52a0hosts\u4fe1\u606f<\/p>\n<pre class=\"lang:default decode:true \">[root@localhost 1.8+]# cat metrics-server-deployment.yaml\r\n---\r\napiVersion: v1\r\nkind: ServiceAccount\r\nmetadata:\r\n  name: metrics-server\r\n  namespace: kube-system\r\n---\r\napiVersion: extensions\/v1beta1\r\nkind: Deployment\r\nmetadata:\r\n  name: metrics-server\r\n# Please edit the object below. Lines beginning with a '#' will be ignored,\r\n# and an empty file will abort the edit. If an error occurs while saving this file will be\r\n# reopened with the relevant failures.\r\n#\r\napiVersion: v1\r\ndata:\r\n  Corefile: |\r\n    .:53 {\r\n        errors\r\n        health\r\n        hosts {\r\n           $IP node1\r\n           fallthrough\r\n        }\r\n        kubernetes cluster.local in-addr.arpa ip6.arpa {\r\n           pods insecure\r\n           upstream\r\n           fallthrough in-addr.arpa ip6.arpa\r\n        }<\/pre>\n<p>\u65b9\u6cd5\u4e8c\uff1a\u83b7\u53d6\u5916\u90e8dns\u4fe1\u606f<\/p>\n<pre class=\"lang:default decode:true \">kind: ConfigMap\r\nmetadata:  name: coredns\r\n  namespace: kube-system\r\ndata:  Corefile: |\r\n    .:53 {\r\n        errors\r\n        log stdout\r\n        health\r\n        kubernetes cluster.local {\r\n          cidrs 10.3.0.0\/24\r\n        }\r\n        proxy . \/etc\/resolv.conf\r\n        cache 30\r\n    }<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4ece v1.8 \u5f00\u59cb\uff0c\u8d44\u6e90\u4f7f\u7528\u60c5\u51b5\u7684\u5ea6\u91cf\uff08\u5982\u5bb9\u5668\u7684 CPU \u548c\u5185\u5b58\u4f7f\u7528\uff09\u53ef\u4ee5\u901a\u8fc7  &hellip; <a href=\"https:\/\/blog.espnlol.com\/?p=348\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-348","post","type-post","status-publish","format-standard","hentry","category-k8s"],"_links":{"self":[{"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=\/wp\/v2\/posts\/348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=348"}],"version-history":[{"count":2,"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=\/wp\/v2\/posts\/348\/revisions"}],"predecessor-version":[{"id":350,"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=\/wp\/v2\/posts\/348\/revisions\/350"}],"wp:attachment":[{"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espnlol.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}