Descobrir e Utilizar Recursos Personalizados

KubernetesBeginner
Pratique Agora

Introdução

O Kubernetes pode ser estendido com novos tipos de recursos. Uma CustomResourceDefinition, geralmente chamada de CRD, registra um novo recurso de API no servidor de API do Kubernetes. Após isso, você pode usar os comandos familiares do kubectl para criar, obter, descrever, rotular e aplicar patches em objetos desse novo tipo.

Neste laboratório, você criará um pequeno CRD com escopo de namespace chamado AppProfile, descobrirá o recurso com comandos de descoberta da API do Kubernetes, criará recursos personalizados a partir de YAML e os atualizará como objetos comuns do Kubernetes. Nenhum controlador é necessário para este laboratório; o foco é entender como os tipos de recursos personalizados aparecem e como trabalhar com seus objetos.

Preparar um Namespace para Recursos Personalizados

Nesta etapa, você preparará um namespace limpo para praticar com recursos personalizados.

Comece em /home/labex/project. Você escreverá os manifestos do CRD e do recurso personalizado neste diretório.

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

Verifique se o servidor de API do Kubernetes está acessível. Se a VM acabou de iniciar e o nó ainda não está pronto, aguarde alguns segundos e execute o comando novamente.

kubectl get nodes --request-timeout=5s

A saída esperada inclui:

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

Aguarde até que o Pod de rede do cluster esteja pronto (Ready) antes de criar objetos de aplicação.

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

Saída esperada:

pod/calico-node-... condition met

Crie um namespace chamado ckad-prep-customresources:

kubectl create namespace ckad-prep-customresources

Defina este namespace como o namespace do contexto atual:

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

Confirme o namespace atual:

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

Saída esperada:

ckad-prep-customresources

Registrar um Novo Tipo de Recurso com um CRD

Nesta etapa, você criará uma CustomResourceDefinition chamada AppProfile.

Um CRD possui duas camadas importantes de nomenclatura. O metadata.name é o nome do recurso no plural mais o grupo da API, como appprofiles.training.labex.io. A seção spec.names define como as pessoas se referirão ao recurso: kind: AppProfile, plural: appprofiles, singular: appprofile e um nome curto appprof.

Crie o arquivo 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 o CRD:

kubectl apply -f app-profile-crd.yaml

Saída esperada:

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

Aguarde até que o servidor de API informe que o CRD foi estabelecido:

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

Saída esperada:

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

Inspecione os nomes e o escopo do CRD:

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

Saída esperada:

AppProfile appprofiles Namespaced

Descobrir e Criar Recursos Personalizados

Nesta etapa, você descobrirá o novo tipo de recurso e criará seu primeiro AppProfile.

O comando kubectl api-resources lista os tipos de recursos conhecidos pelo servidor de API. Após um CRD ser estabelecido, ele aparece nesta saída de descoberta ao lado dos tipos de recursos nativos.

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

A saída esperada inclui:

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

Use o kubectl explain para ler o esquema que o Kubernetes aprendeu a partir do CRD. O campo spec é onde as configurações específicas da aplicação residem.

kubectl explain appprofile.spec

A saída esperada inclui:

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

FIELD: spec <Object>

Crie o arquivo 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 o recurso personalizado:

kubectl apply -f frontend-profile.yaml

Saída esperada:

appprofile.training.labex.io/frontend created

Liste os recursos personalizados usando o nome no plural:

kubectl get appprofiles

A saída esperada inclui:

NAME       AGE
frontend   ...

Leia os campos do recurso personalizado com jsonpath:

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

Saída esperada:

nginx:1.27 2 web

Atualizar e Selecionar Recursos Personalizados

Nesta etapa, você gerenciará recursos personalizados com os mesmos padrões do kubectl que você já utiliza para objetos nativos.

Aplique um patch no recurso personalizado frontend para alterar sua contagem de réplicas desejada. A opção --type=merge instrui o Kubernetes a mesclar seu objeto JSON no objeto existente, em vez de substituir todo o recurso.

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

Saída esperada:

appprofile.training.labex.io/frontend patched

Confirme o valor atualizado:

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

Saída esperada:

3

Crie um segundo recurso personalizado chamado 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

Saída esperada:

appprofile.training.labex.io/worker created

Liste apenas os recursos personalizados que pertencem à aplicação storefront. Isso funciona porque os recursos personalizados suportam rótulos (labels) normais do Kubernetes.

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

A saída esperada inclui:

NAME       AGE
frontend   ...
worker     ...

Use o nome curto appprof para imprimir o nome de cada recurso e a contagem de réplicas:

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

A saída esperada inclui:

frontend=3
worker=1

Resumo

Você criou um CRD, aguardou até que ele fosse estabelecido, descobriu o novo recurso de API com kubectl api-resources e kubectl explain, criou recursos personalizados, aplicou um patch em um recurso personalizado, selecionou-os por rótulo e utilizou um nome curto. Estas são as mesmas habilidades operacionais que você usará quando as tarefas do CKAD envolverem recursos instalados por um operador, controlador ou extensão de plataforma.