Kubernetes,  QNAP

Kubernetes. k0s – KUBEVIEW: Pintando lo que está pasando en el cluster

A medida que se van instalando aplicaciones en el cluster va aumentando la complejidad y es complicado tener una visión general (monitorización) de que está instalado y las relaciones entre los diferentes elementos. Vamos, que se va liando el tema y únicamente uniendo etiquetas de los .yaml no es suficiente para ver el cluster en su conjunto.

Existen aplicaciones que permiten pintar los objetos y las relaciones de kubernetes, he incluso, como no podemos instalarlas en el propio cluster. Voy a probar con kubeview y veremos que tal funciona.

Creación de los ficheros .yaml

Esta disponible en https://artifacthub.io por lo que con helm podemos generar los templates y hacer a mano un yaml de instalación sencillo e independiente.

$ helm repo add kubeview https://benc-uk.github.io/kubeview/charts
"kubeview" has been added to your repositories

$ helm template kubeview kubeview/kubeview -f values.yaml --output-dir .
wrote ./kubeview/templates/service-account.yaml
wrote ./kubeview/templates/service-account.yaml
wrote ./kubeview/templates/service-account.yaml
wrote ./kubeview/templates/service.yaml
wrote ./kubeview/templates/deployment.yaml
wrote ./kubeview/templates/tests/test-connection.yaml

Apply de los ficheros

ServiceAccount, ClusterRole, ClusterRoleBinding

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring


---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kubeview
  namespace: monitoring


---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kubeview
rules:
  - apiGroups: ["extensions"]
    resources:
      - ingresses
    verbs: ["get", "list"]
  - apiGroups: ["apps"]
    resources:
      - deployments
      - replicasets
      - daemonsets
      - statefulsets
    verbs: ["get", "list"]
  - apiGroups: [""]
    resources:
      - pods
      - configmaps
      - secrets
      - events
      - endpoints
      - namespaces
      - nodes
      - persistentvolumes
      - persistentvolumeclaims
      - resourcequotas
      - services
    verbs: ["get", "list"]
  - apiGroups: ["networking.k8s.io"]
    resources:
      - ingresses
    verbs: ["get", "list"]

  - nonResourceURLs: ["*"]
    verbs: ["get", "list"]

Service, Ingress y Deploy

apiVersion: v1
kind: Service
metadata:
  name: kubeview
  namespace: monitoring
  labels:
    app: kubeview
spec:
  ports:
    - port: 8000
      targetPort: 8000
  selector:
    app: kubeview


---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-production
  name: monitor
  namespace: monitoring
spec:
  rules:
    - host: tu-sitio-web
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kubeview
                port:
                  number: 8000
  tls:
    - hosts:
      - tu-sitio-web
      # En este certificate cert-manager guarda el certificado.
      secretName: monitor-cert


---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kubeview
  namespace: monitoring
  labels:
    app: kubeview
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kubeview
  template:
    metadata:
      labels:
        app: kubeview
    spec:
      serviceAccountName: kubeview
      containers:
        - name: kubeview
          image: "ghcr.io/benc-uk/kubeview:0.1.31"
          imagePullPolicy: Always
          env:
            - name: IN_CLUSTER
              value: "true"
          ports:
            - containerPort: 8000

Vamos a ver si se visualiza alguna cosa

Al acceder a la url configurada en el Ingress se accede directamente al frontal. No pide autenticación lo cual es un poco raro pero supongo se podrá configurar posteriormente.

En el desplegable aparece un listado con los namespaces del cluster. En la imagen he seleccionado el namespace motioneye (donde tengo las cámaras IP) y kubeview pinta cada uno de los elementos junto a sus relaciones.

Justo la primera prueba ya me ha servido para comprobar que existe un pod marcado como error (Status – phase: Failed). Al situar el puntero del ratón encima del objeto muestra los detalles, existiendo además, la posibilidad de ampliarlos.

Desde consola llevo al cementerio de los pods al serializado como kt5q2.

$ kubectl get pods -n motioneye
NAME READY STATUS RESTARTS AGE
motioneye-8459f5ffbb-kt5q2 0/1 ContainerStatusUnknown 1 10d
motioneye-8459f5ffbb-mgsxw 1/1 Running 0 23h
$
$
$ kubectl delete pod -n motioneye motioneye-8459f5ffbb-kt5q2
pod "motioneye-8459f5ffbb-kt5q2" deleted

Volviendo a kubeview se puede observar que el pod averiado ya no está y el molesto color rojo desapareció.

A priori la utilidad no va a sustituir un sistema como Prometheus, ni al omnipresente kubectl, pero aporta una visualización refrescante que me ha servido como en cada una de las entradas de https://www.juanjosevalera.com/archivos/category/kubernetes/, para ir aprendiendo mas acerca de este mundo.