$ kubectl top nodes
W1008 19:23:53.157850   69063 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
error: Metrics API not available

See: How Can I Deploy the Kubernetes-Metrics Server on LKE?

file: metrics-server.yaml

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: system:aggregated-metrics-reader
  labels:
    rbac.authorization.k8s.io/aggregate-to-view: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
rules:
- apiGroups: ["metrics.k8s.io"]
  resources: ["pods", "nodes"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: metrics-server
  namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    k8s-app: metrics-server
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  template:
    metadata:
      name: metrics-server
      labels:
        k8s-app: metrics-server
    spec:
      serviceAccountName: metrics-server
      volumes:
      # Mount in tmp so we can safely use from-scratch images and/or read-only containers
      - name: tmp-dir
        emptyDir: {}
      containers:
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.6
        imagePullPolicy: Always
        command:
          - /metrics-server
          # * metrics-server must reach kubelets by Node private IP
          - --kubelet-preferred-address-types=InternalIP
          # * metrics-server connects to each Node's kubelet
          # * each Node's kubelet presents a CA certificate
          #     echo | \
          #       openssl s_client -showcerts -connect localhost:10250 2>/dev/null | \
          #       openssl x509 -inform pem -noout -text
          # * The Common Name and Subject Alternative Names do not include the Node's private IP
          #     Subject: CN = lke3578-4746-5e97658362af@1586980323
          #     X509v3 extensions:
          #       X509v3 Subject Alternative Name:
          #       DNS:lke3578-4746-5e97658362af
          # * This certificate is generated frequently and dynamically by kubelet
          # * There is not currently a way to add Node private IP as a SAN
          - --kubelet-insecure-tls
        volumeMounts:
        - name: tmp-dir
          mountPath: /tmp
---
apiVersion: v1
kind: Service
metadata:
  name: metrics-server
  namespace: kube-system
  labels:
    kubernetes.io/name: "Metrics-server"
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: metrics-server
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  - nodes/stats
  - namespaces
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - "extensions"
  resources:
  - deployments
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system

I’ve updated the APIService apiVersion.

I’ve had no luck with a newer version: image: k8s.gcr.io/metrics-server-amd64:v0.5.1.

Apply

$ kubectl apply -f metrics-server.yaml
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created

Top Node

$ kubectl top node
W1008 19:36:11.335849   69582 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
NAME                          CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
lke39473-64379-615ec4bfcab8   212m         21%    1171Mi          62%
lke39473-64379-615ec4c02cea   116m         11%    1034Mi          54%
$ kubectl top node --use-protocol-buffers
NAME                          CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
lke39473-64379-615ec4bfcab8   178m         17%    1171Mi          62%
lke39473-64379-615ec4c02cea   117m         11%    1034Mi          54%

Top Pod

$ kubectl top pod -A
W1008 19:36:45.178974   69605 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
NAMESPACE      NAME                                        CPU(cores)   MEMORY(bytes)
cert-manager   cert-manager-7998c69865-qf6xf               2m           35Mi
cert-manager   cert-manager-cainjector-7b744d56fb-ldrsn    3m           47Mi
cert-manager   cert-manager-webhook-97f8b47bc-tl9z7        2m           27Mi
default        ingress-nginx-controller-5cc57bf6c7-75lxg   2m           71Mi
default        static-site-deployment-79f595f9b-27gf6      0m           3Mi
default        static-site-deployment-79f595f9b-gtmgz      0m           2Mi
kube-system    calico-kube-controllers-75f955b89b-vwczx    4m           25Mi
kube-system    calico-node-glrdw                           27m          103Mi
kube-system    calico-node-r99kr                           44m          99Mi
kube-system    coredns-65648f44c6-7qfsl                    2m           19Mi
kube-system    coredns-65648f44c6-vl22s                    2m           20Mi
kube-system    csi-linode-controller-0                     2m           49Mi
kube-system    csi-linode-node-4trm4                       1m           21Mi
kube-system    csi-linode-node-sgsql                       1m           20Mi
kube-system    kube-proxy-62nnr                            1m           22Mi
kube-system    kube-proxy-x6ggg                            1m           22Mi
kube-system    metrics-server-7f976b7d7d-zj8pd             2m           12Mi
$ kubectl top pod -A --use-protocol-buffers
NAMESPACE      NAME                                        CPU(cores)   MEMORY(bytes)
cert-manager   cert-manager-7998c69865-qf6xf               2m           35Mi
cert-manager   cert-manager-cainjector-7b744d56fb-ldrsn    5m           47Mi
cert-manager   cert-manager-webhook-97f8b47bc-tl9z7        2m           27Mi
default        ingress-nginx-controller-5cc57bf6c7-75lxg   2m           71Mi
default        static-site-deployment-79f595f9b-27gf6      0m           3Mi
default        static-site-deployment-79f595f9b-gtmgz      0m           2Mi
kube-system    calico-kube-controllers-75f955b89b-vwczx    4m           25Mi
kube-system    calico-node-glrdw                           38m          103Mi
kube-system    calico-node-r99kr                           39m          109Mi
kube-system    coredns-65648f44c6-7qfsl                    2m           19Mi
kube-system    coredns-65648f44c6-vl22s                    2m           20Mi
kube-system    csi-linode-controller-0                     1m           49Mi
kube-system    csi-linode-node-4trm4                       1m           21Mi
kube-system    csi-linode-node-sgsql                       1m           20Mi
kube-system    kube-proxy-62nnr                            1m           22Mi
kube-system    kube-proxy-x6ggg                            1m           22Mi
kube-system    metrics-server-7f976b7d7d-zj8pd             1m           10Mi
$ kubectl top pod --use-protocol-buffers
NAME                                        CPU(cores)   MEMORY(bytes)
ingress-nginx-controller-5cc57bf6c7-75lxg   2m           71Mi
static-site-deployment-79f595f9b-27gf6      0m           3Mi
static-site-deployment-79f595f9b-gtmgz      0m           2Mi

<
Previous Post
Homestead
>
Next Post
kubeconfig