Implantar softwares no cluster Kubernetes é apenas o inicio da operação de uma aplicação. Os Desenvolvedores precisam entender os padrões de consumo de recurso e comportamento de suas aplicações com objetivo de fornecer serviços escaláveis e confiáveis.

No mundo Kubernetes, ferramentas de monitoramento como Prometheus e Datadog ajudam na coleta, processamento e visualização das informações. O exame CKAD não espera que você esteja familiarizado com ferramentas comerciais de monitoramento, logging, tracing e agregação. No entanto, é útil obter uma compreensão aproximada da infraestrutura do Kubernetes responsável pela coleta de métricas de uso, como CPU de um container e uso de memória.

Esta responsabilidade cai nas mãos do metrics server, um agregador de dados de uso de recursos de todo o cluster. Veja sua documentação para obter mais informações sobre seu processo de instalação.

Instalando Metrics Server no Cluster Kind

Inicialmente tentei instalar utilizando helm chart em um namespace específico mas ocorreram alguns erros de conexão e os Pods não foram iniciados com sucesso.

A segunda tentativa foi aplicando o manifesto YAML chamado components.yaml disponibilizado no GitHub do metrics server sem especificar o namespace.

Releases · kubernetes-sigs/metrics-server

Ocorreram alguns erros de conexão novamente. Encontrei uma issue no repositório GitHub do Kind com algumas opções que poderiam resolver e resolveram o problema.

Untitled

Detalhes Sobre as Flags

GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines.

Recursos Criados no Manifesto Metrics Server

**$ kubectl get all -l k8s-app=metrics-server --all-namespaces**
	NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
	kube-system   pod/metrics-server-955cb9c85-8zgtd   1/1     Running   0          13m
	
	NAMESPACE     NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
	kube-system   service/metrics-server   ClusterIP   10.96.83.188   <none>        443/TCP   13m
	
	NAMESPACE     NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
	kube-system   deployment.apps/metrics-server   1/1     1            1           13m
	
	NAMESPACE     NAME                                       DESIRED   CURRENT   READY   AGE
	kube-system   replicaset.apps/metrics-server-955cb9c85   1         1         1       13m

**$ kubectl get serviceaccounts -l k8s-app=metrics-server --namespace kube-system**
	NAME             SECRETS   AGE
	metrics-server   1         19m

**$ kubectl get clusterroles -l k8s-app=metrics-server**
	NAME                               CREATED AT
	system:aggregated-metrics-reader   2022-05-02T12:04:51Z
	system:metrics-server              2022-05-02T12:04:51Z

**$ kubectl get rolebindings -l k8s-app=metrics-server --all-namespaces**
	NAMESPACE     NAME                         ROLE                                             AGE
	kube-system   metrics-server-auth-reader   Role/extension-apiserver-authentication-reader   21m

**$ kubectl get ClusterRoleBinding -l k8s-app=metrics-server**
	NAME                                   ROLE                                AGE
	metrics-server:system:auth-delegator   ClusterRole/system:auth-delegator   22m
	system:metrics-server                  ClusterRole/system:metrics-server   22m

Utilizando Comandos Habilitados pelo Metrics Server

**$ kubectl top nodes**
	NAME                           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
	descomplicando-control-plane   244m         6%     903Mi           11%       
	descomplicando-worker          33m          0%     233Mi           2%        
	descomplicando-worker2         39m          0%     251Mi           3%

**$ kubectl top pods --all-namespaces**
	NAMESPACE            NAME                                                   CPU(cores)   MEMORY(bytes)   
	kube-system          coredns-558bd4d5db-5dx8d                               5m           10Mi            
	kube-system          coredns-558bd4d5db-l95cv                               7m           10Mi            
	kube-system          etcd-descomplicando-control-plane                      33m          32Mi            
	kube-system          kindnet-2fsv4                                          1m           7Mi             
	kube-system          kindnet-78jzt                                          1m           8Mi             
	kube-system          kindnet-kkwbw                                          1m           10Mi            
	kube-system          kube-apiserver-descomplicando-control-plane            94m          305Mi           
	kube-system          kube-controller-manager-descomplicando-control-plane   32m          57Mi            
	kube-system          kube-proxy-n9f2q                                       1m           12Mi            
	kube-system          kube-proxy-qhxb8                                       1m           11Mi            
	kube-system          kube-proxy-t28kt                                       1m           13Mi            
	kube-system          kube-scheduler-descomplicando-control-plane            5m           22Mi            
	kube-system          metrics-server-7f6fdd8fc5-zt9xf                        5m           14Mi            
	local-path-storage   local-path-provisioner-547f784dff-sm6lq                3m           6Mi

Manifesto Metrics Server Completo e Ajustado

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - nodes/metrics
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  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: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  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: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  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
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        ######################################################################################
        ##### <https://github.com/kubernetes-sigs/kind/issues/398#issuecomment-478311167> ######
        ################# DE ACORDO COM COMENTARIO NO GITHUB #################################
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP
        ######################################################################################
        image: k8s.gcr.io/metrics-server/metrics-server:v0.6.1
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 4443
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
        resources:
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          allowPrivilegeEscalation: false
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100