Escanee los archivos de Kubernetes en busca de errores con KubeLinter

KubeLinter es un proyecto de código abierto lanzado por Stackrox para analizar los archivos YAML de Kubernetes en busca de problemas de seguridad y código incorrecto. La herramienta cubre los gráficos de Helm y los archivos de configuración de Kubernetes, incluidos Imaginativo Archivo. Su uso puede mejorar el desarrollo nativo de la nube, reducir el tiempo de desarrollo y fomentar las mejores prácticas de DevOps.

Índice

Descargar e instalar

¡Para este tutorial, usé Pop_OS! 20.10, Helm 3, Go 1.13.8 y Minikube con Kubernetes 1.19.

Tiene varias opciones para instalar KubeLinter.

Puede instalar manualmente desde el repositorio de Git:

$ git clone git@github.com:stackrox/kube-linter.git
$ cd kube-linter && make build
$ .gobin/kube-linter version

Si usa Homebrew, puede instalarlo con el brew mando:

$ brew install kube-linter

También puedes instalarlo con Go (como hice yo):

$ GO111MODULE=on go get golang.stackrox.io/kube-linter/cmd/kube-linter
go: finding golang.stackrox.io/kube-linter latest
go: downloading golang.stackrox.io/kube-linter v0.0.0-20201204022312-475075c74675
go: extracting golang.stackrox.io/kube-linter v0.0.0-20201204022312-475075c74675
[...]

Después de la instalación, debe crear un alias en el suyo ~/.bashrc:

$ echo "alias kube-linter=$HOME/go/bin/kube-linter" >> ~/.bashrc
$ source ~/.bashrc

Timón con KubeLinter

Ahora que la herramienta está instalada, pruébela en un gráfico de Helm. Primero, inicie Minikube con una compilación limpia y algunos pequeños cambios de configuración:

$ minikube config set kubernetes-version v1.19.0
$ minikube config set memory 8000
❗  These changes will take effect upon a minikube delete and then a minikube start
$ minikube config set cpus 12
❗  These changes will take effect upon a minikube delete and then a minikube start
$ minikube delete
?  Deleting "minikube" in docker ...
?  Deleting container "minikube" ...
?  Removing /home/jess/.minikube/machines/minikube ...
?  Removed all traces of the "minikube" cluster.

$ minikube start
?  minikube v1.14.2 on Debian bullseye/sid
✨  Using the docker driver based on user configuration
?  Starting control plane node minikube in cluster minikube
?  minikube 1.15.1 is available! Download it
: https://github.com/kubernetes/minikube/releases/tag/v1.15.1
?  To disable this notice, run
: 'minikube config set WantUpdateNotification false'

?  Downloading Kubernetes v1.19.0 preload ...

Una vez que todo esté funcionando, cree un gráfico de Helm de muestra llamado first_test:

$ helm create first_test
Creating first_test
$ ls
first_test

Pruebe KubeLinter con el nuevo gráfico inédito. ejecutar el kube-linter comando para ver los comandos y banderas disponibles:

$ kube-linter
Usage:
  /home/jess/go/bin/kube-linter [command]

Available Commands:
  checks      View more information on lint checks
  help        Help about any command
  lint        Lint Kubernetes YAML files and Helm charts
  templates   View more information on check templates
  version     Print version and exit

Flags:
  -h, --help   help for /home/jess/go/bin/kube-linter

Use "/home/jess/go/bin/kube-linter [command] --help" for more information about a command.

Así que prueba lo básico lint comando hace a su gráfico de ejemplo. Terminarás con muchos errores, así que tomaré un fragmento de algunos problemas:

$ kube-linter lint first_test/

first_test/first_test/templates/deployment.yaml: (object: <no namespace>/test-release-first_test apps/v1, Kind=Deployment) container "first_test" does not have a read-only root file system (check: no-read-only-root-fs, remediation: Set readOnlyRootFilesystem to true in your container's securityContext.)

first_test/first_test/templates/deployment.yaml: (object: <no namespace>/test-release-first_test apps/v1, Kind=Deployment) container "first_test" is not set to runAsNonRoot (check: run-as-non-root, remediation: Set runAsUser to a non-zero number, and runAsNonRoot to true, in your pod or container securityContext. See https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ for more details.)
[...]
Error: found 12 lint errors

En aras de la brevedad, he elegido dos problemas de seguridad que me resultan fáciles de solucionar. Con el tiempo, a medida que realice más pruebas, podrá solucionar cualquier problema que encuentre.

El kube-linter la salida proporciona sugerencias sobre las correcciones requeridas. Por ejemplo, el primer error termina con:

remediation: Set readOnlyRootFilesystem to true in your container's securityContext.

El siguiente paso es claro: abrir el archivo values.yaml archivo en un editor de texto (yo uso Vi, pero puedes usar lo que quieras) y localiza el archivo securityContext sección:

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

Descomente la sección y elimine los corchetes:

securityContext:
   capabilities
:
     drop
:
    - ALL
   readOnlyRootFilesystem
: true
   runAsNonRoot
: true
   runAsUser
: 1000

Guarde el archivo y vuelva a ejecutar el linter. Estos errores ya no aparecen en la lista y el recuento de errores cambia.

Error: found 10 lint errors

¡Felicidades! ¡Has resuelto los problemas de seguridad!

Kubernetes con KubeLinter

Este ejemplo usa un archivo de aplicación de mi artículo anterior de Knative para probar los archivos de configuración de Kubernetes. Ya tengo Knative en funcionamiento, por lo que es posible que desee revisar ese artículo si no se está ejecutando en su sistema.

Descargué el archivo YAML del servicio Kourier para este ejemplo:

$ ls
kourier.yaml   first_test

Comience haciendo el linter contra kourier.yaml. Una vez más, hay varios problemas. Me centraré en los problemas de recursos:

$ kube-linter lint kourier.yaml

kourier.yaml: (object: kourier-system/3scale-kourier-gateway apps/v1, Kind=Deployment) container "kourier-gateway" has cpu limit 0 (check: unset-cpu-requirements, remediation: Set your container's CPU requests and limits depending on its requirements. See https://kubernetes.io/docs/concepts/configuration/manage-resources-Contenedores/#requests-and-limits for more details.)

kourier.yaml: (object: kourier-system/3scale-kourier-gateway apps/v1, Kind=Deployment) container "kourier-gateway" has memory request 0 (check: unset-memory-requirements, remediation: Set your container's memory requests and limits depending on its requirements. See https://kubernetes.io/docs/concepts/configuration/manage-resources-Contenedores/#requests-and-limits for more details.)

Error: found 12 lint errors

Dado que se trata de un único archivo de distribución, puede editarlo directamente. Ábralo en un editor de texto y cambie los valores en el archivo. El archivo es largo, por lo que solo incluiré las partes que deben editarse.

Comience con la distribución:

apiVersion: apps/v1
kind
: Deployment
metadata
:
  name
: 3scale-kourier-gateway
  namespace
: kourier-system
  labels
:
    Redes.knative.dev/ingress-provider
: kourier
[...]

La sección de contenedores tiene algunos problemas:

   spec:
      Contenedores
:
      - args
:
       - --base-id 1
        - -c /tmp/config/envoy-bootstrap.yaml
        - --log-level info
        command
:
       - /usr/local/bin/envoy
        image
: docker.io/maistra/proxyv2-ubi8:1.1.5
        imagePullPolicy
: Always
        name
: kourier-gateway
        ports
:
        - name
: http2-external
          containerPort
: 8080
          protocol
: TCP
        - name
: http2-internal
          containerPort
: 8081
          protocol
: TCP
        - name
: https-external
          containerPort
: 8443
          protocol
: TCP

Agregue algunos detalles a la configuración del contenedor:

   spec:
      Contenedores
:
      - args
:
       - --base-id 1
        - -c /tmp/config/envoy-bootstrap.yaml
        - --log-level info
        command
:
       - /usr/local/bin/envoy
        image
: docker.io/maistra/proxyv2-ubi8:1.1.5
        imagePullPolicy
: Always
        name
: kourier-gateway
        ports
:
        - name
: http2-external
          containerPort
: 8080
          protocol
: TCP
        - name
: http2-internal
          containerPort
: 8081
          protocol
: TCP
        - name
: https-external
          containerPort
: 8443
          protocol
: TCP
 resources
:
    limits
:
      cpu
: 100m
      memory
: 128Mi
    requests
:
      cpu
: 100m
      memory
: 128Mi

Cuando vuelva a ejecutar el linter, notará que estos problemas ya no aparecen en la salida y el recuento de errores cambia:

Error: found 8 lint errors

¡Felicidades! ¡Ha resuelto problemas de recursos en su archivo de Kubernetes!

Pensamientos finales

KubeLinter es una gran herramienta y una gran oportunidad para iniciar un nuevo proceso DevOps para proteger y administrar los recursos de todas las configuraciones y aplicaciones de Kubernetes. Agregar esta función a las pruebas automatizadas aumenta el entorno y el ciclo DevOps.

Creo que la mejor parte de KubeLinter es que cada mensaje de error incluye documentación, por lo que incluso si no sabe qué significa el resultado del error de pelusa, la documentación lo ayuda a aprender y planificar con anticipación. Recomiendo esta herramienta para uso diario y para trabajar con código retroactivo.

Artículos de interés

Subir