Descubrir y utilizar recursos personalizados

KubernetesBeginner
Practicar Ahora

Introducción

Kubernetes puede extenderse con nuevos tipos de recursos. Una definición de recurso personalizado (CustomResourceDefinition), conocida habitualmente como CRD, registra un nuevo recurso de API en el servidor de API de Kubernetes. Una vez hecho esto, puede utilizar los comandos habituales de kubectl para crear, obtener, describir, etiquetar y aplicar parches a objetos de ese nuevo tipo.

En este laboratorio, creará un pequeño CRD con ámbito de espacio de nombres llamado AppProfile, lo descubrirá mediante comandos de descubrimiento de la API de Kubernetes, creará recursos personalizados a partir de YAML y los actualizará como si fueran objetos normales de Kubernetes. No se necesita ningún controlador para este laboratorio; el objetivo es comprender cómo aparecen los tipos de recursos personalizados y cómo trabajar con sus objetos.

Preparar un espacio de nombres para recursos personalizados

En este paso, preparará un espacio de nombres limpio para practicar con recursos personalizados.

Comience en /home/labex/project. Escribirá el CRD y los manifiestos de los recursos personalizados en este directorio.

mkdir -p /home/labex/project
cd /home/labex/project

Compruebe que el servidor de API de Kubernetes sea accesible. Si la máquina virtual acaba de iniciarse y el nodo aún no está listo, espere unos segundos y vuelva a ejecutar el comando.

kubectl get nodes --request-timeout=5s

La salida esperada incluye:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

Espere a que el Pod de red del clúster esté listo antes de crear objetos de aplicación.

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

Salida esperada:

pod/calico-node-... condition met

Cree un espacio de nombres llamado ckad-prep-customresources:

kubectl create namespace ckad-prep-customresources

Establezca este espacio de nombres como el espacio de nombres del contexto actual:

kubectl config set-context --current --namespace=ckad-prep-customresources

Confirme el espacio de nombres actual:

kubectl config view --minify --output 'jsonpath={..namespace}'; echo

Salida esperada:

ckad-prep-customresources

Registrar un nuevo tipo de recurso con un CRD

En este paso, creará una definición de recurso personalizado (CRD) llamada AppProfile.

Un CRD tiene dos capas de nomenclatura importantes. El metadata.name es el nombre del recurso en plural más el grupo de la API, como appprofiles.training.labex.io. La sección spec.names define cómo se referirán las personas al recurso: kind: AppProfile, plural: appprofiles, singular: appprofile y un nombre corto appprof.

Cree app-profile-crd.yaml:

cat > app-profile-crd.yaml <<'EOF'
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: appprofiles.training.labex.io
spec:
  group: training.labex.io
  scope: Namespaced
  names:
    plural: appprofiles
    singular: appprofile
    kind: AppProfile
    shortNames:
    - appprof
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        type: object
        properties:
          spec:
            type: object
            required:
            - image
            - replicas
            properties:
              image:
                type: string
              replicas:
                type: integer
                minimum: 1
              tier:
                type: string
EOF

Aplique el CRD:

kubectl apply -f app-profile-crd.yaml

Salida esperada:

customresourcedefinition.apiextensions.k8s.io/appprofiles.training.labex.io created

Espere hasta que el servidor de API informe que el CRD está establecido:

kubectl wait --for=condition=Established crd/appprofiles.training.labex.io --timeout=120s

Salida esperada:

customresourcedefinition.apiextensions.k8s.io/appprofiles.training.labex.io condition met

Inspeccione los nombres y el ámbito del CRD:

kubectl get crd appprofiles.training.labex.io -o 'jsonpath={.spec.names.kind}{" "}{.spec.names.plural}{" "}{.spec.scope}{"\n"}'

Salida esperada:

AppProfile appprofiles Namespaced

Descubrir y crear recursos personalizados

En este paso, descubrirá el nuevo tipo de recurso y creará su primer AppProfile.

kubectl api-resources enumera los tipos de recursos conocidos por el servidor de API. Una vez que se establece un CRD, aparece en esta salida de descubrimiento junto a los tipos de recursos integrados.

kubectl api-resources --api-group=training.labex.io

La salida esperada incluye:

NAME          SHORTNAMES   APIVERSION              NAMESPACED   KIND
appprofiles   appprof      training.labex.io/v1    true         AppProfile

Utilice kubectl explain para leer el esquema que Kubernetes aprendió del CRD. El campo spec es donde residen los ajustes específicos de la aplicación.

kubectl explain appprofile.spec

La salida esperada incluye:

GROUP:      training.labex.io
KIND:       AppProfile
VERSION:    v1

FIELD: spec <Object>

Cree frontend-profile.yaml:

cat > frontend-profile.yaml <<'EOF'
apiVersion: training.labex.io/v1
kind: AppProfile
metadata:
  name: frontend
  labels:
    app.kubernetes.io/part-of: storefront
    tier: web
spec:
  image: nginx:1.27
  replicas: 2
  tier: web
EOF

Aplique el recurso personalizado:

kubectl apply -f frontend-profile.yaml

Salida esperada:

appprofile.training.labex.io/frontend created

Enumere los recursos personalizados con el nombre en plural:

kubectl get appprofiles

La salida esperada incluye:

NAME       AGE
frontend   ...

Lea los campos del recurso personalizado con jsonpath:

kubectl get appprofile frontend -o 'jsonpath={.spec.image}{" "}{.spec.replicas}{" "}{.spec.tier}{"\n"}'

Salida esperada:

nginx:1.27 2 web

Actualizar y seleccionar recursos personalizados

En este paso, gestionará recursos personalizados con los mismos patrones de kubectl que ya utiliza para los objetos integrados.

Aplique un parche al recurso personalizado frontend para cambiar su número deseado de réplicas. La opción --type=merge le indica a Kubernetes que combine su objeto JSON con el objeto existente en lugar de reemplazar todo el recurso.

kubectl patch appprofile frontend --type=merge -p '{"spec":{"replicas":3}}'

Salida esperada:

appprofile.training.labex.io/frontend patched

Confirme el valor actualizado:

kubectl get appprofile frontend -o 'jsonpath={.spec.replicas}{"\n"}'

Salida esperada:

3

Cree un segundo recurso personalizado llamado worker:

cat > worker-profile.yaml <<'EOF'
apiVersion: training.labex.io/v1
kind: AppProfile
metadata:
  name: worker
  labels:
    app.kubernetes.io/part-of: storefront
    tier: worker
spec:
  image: busybox:1.36
  replicas: 1
  tier: worker
EOF
kubectl apply -f worker-profile.yaml

Salida esperada:

appprofile.training.labex.io/worker created

Enumere solo los recursos personalizados que pertenecen a la aplicación storefront. Esto funciona porque los recursos personalizados admiten etiquetas normales de Kubernetes.

kubectl get appprofiles -l app.kubernetes.io/part-of=storefront

La salida esperada incluye:

NAME       AGE
frontend   ...
worker     ...

Utilice el nombre corto appprof para imprimir el nombre de cada recurso y su número de réplicas:

kubectl get appprof -o 'jsonpath={range .items[*]}{.metadata.name}{"="}{.spec.replicas}{"\n"}{end}'

La salida esperada incluye:

frontend=3
worker=1

Resumen

Ha creado un CRD, ha esperado a que se estableciera, ha descubierto el nuevo recurso de API con kubectl api-resources y kubectl explain, ha creado recursos personalizados, ha aplicado un parche a un recurso personalizado, los ha seleccionado por etiqueta y ha utilizado un nombre corto. Estas son las mismas habilidades operativas que utilizará cuando las tareas de CKAD involucren recursos instalados por un operador, controlador o extensión de plataforma.