Les ressources personnalisées étendent l’API
Les contrôleurs personnalisés fournissent la fonctionnalité - qui maintient continuellement l’état souhaité - pour surveiller son état et rapprocher la ressource de la configuration.
Docs Custom Resource Definition
Définitions de ressources personnalisées (CRD) dans la version 1.7
kubectl get crds --all-namespaces
kubectl api-resources
Exemple CRD
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: pizzas.mykubernetes.acme.org
labels:
app: pizzamaker
mylabel: stuff
spec:
group: mykubernetes.acme.org
scope: Namespaced
version: v1beta2
names:
kind: Pizza
listKind: PizzaList
plural: pizzas
singular: pizza
shortNames:
- pz
Ajoutez des Pizzas
mkdir -p apps/pizzas/
vim pizza-crd.yaml
pizza-crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: pizzas.mykubernetes.acme.org
labels:
app: pizzamaker
mylabel: stuff
spec:
group: mykubernetes.acme.org
scope: Namespaced
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
description: "A custom resource for making yummy pizzas" #<.>
type: object
properties:
spec:
type: object
description: "Information about our pizza"
properties:
toppings: #<.>
type: array
items:
type: string
description: "List of toppings for our pizza"
sauce: #<.>
type: string
description: "The name of the sauce to use on our pizza"
names:
kind: Pizza #<.>
listKind: PizzaList
plural: pizzas
singular: pizza
shortNames:
- pz
kubectl create namespace pizzahat
kubectl config set-context --current --namespace=pizzahat
kubectl apply -f apps/pizzas/pizza-crd.yaml
Fait maintenant partie de l’API
kubectl get crds | grep pizza
Résultat
NAME CREATED AT
pizzas.mykubernetes.acme.org 2022-01-23T16:26:11Z
kubectl api-resources | grep pizzas
Résultat
pizzas pz mykubernetes.acme.org true Pizza
Déploiement de l’opérateur
vim apps/pizzas/pizza-deployment.yaml
pizza-deployment.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: quarkus-operator-example
rules:
- apiGroups:
- ''
resources:
- pods
verbs:
- get
- list
- watch
- create
- update
- delete
- patch
- apiGroups:
- apiextensions.k8s.io
resources:
- customresourcedefinitions
verbs:
- list
- apiGroups:
- mykubernetes.acme.org
resources:
- pizzas
verbs:
- list
- watch
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: quarkus-operator-example
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: quarkus-operator-example
subjects:
- kind: ServiceAccount
name: quarkus-operator-example
namespace: pizzahat
roleRef:
kind: ClusterRole
name: quarkus-operator-example
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: quarkus-operator-example
spec:
selector:
matchLabels:
app: quarkus-operator-example
replicas: 1
template:
metadata:
labels:
app: quarkus-operator-example
spec:
serviceAccountName: quarkus-operator-example
containers:
- image: quay.io/rhdevelopers/pizza-operator:1.0.1
name: quarkus-operator-example
imagePullPolicy: IfNotPresent
kubectl apply -f apps/pizzas/pizza-deployment.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
quarkus-operator-example-5f5bf777bc-glfg9 1/1 Running 0 58s
Faire des pizzas
vim apps/pizzas/cheese-pizza.yaml
cheese-pizza.yaml
apiVersion: mykubernetes.acme.org/v1
kind: Pizza
metadata:
name: cheesep
spec:
toppings:
- mozzarella
sauce: regular
kubectl apply -f apps/pizzas/cheese-pizza.yaml
kubectl get pizzas
NAME AGE
cheesep 4s
kubectl describe pizza cheesep
Name: cheesep
Namespace: pizzahat
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"mykubernetes.acme.org/v1beta2","kind":"Pizza","metadata":{"annotations":{},"name":"cheesep","namespace":"pizzahat"},"spec":...
API Version: mykubernetes.acme.org/v1beta2
Kind: Pizza
...
kubectl get pods
NAME READY STATUS RESTARTS AGE
cheesep-pod 0/1 Completed 0 3s
quarkus-operator-example-5f5bf777bc-glfg9 1/1 Running 0 44m
Et vérifiez les logs du Pod de fromage :
kubectl logs cheesep-pod
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2022-07-23 09:03:11,537 INFO [io.quarkus] (main) pizza-maker 1.0-SNAPSHOT (powered by Quarkus 1.4.0.CR1) started in 0.006s.
2022-07-23 09:03:11,537 INFO [io.quarkus] (main) Profile prod activated.
2022-07-23 09:03:11,537 INFO [io.quarkus] (main) Installed features: [cdi]
Doing The Base
Adding Sauce regular
Adding Toppings [mozzarella]
Baking
Baked
Ready For Delivery
2022-01-23 09:03:12,038 INFO [io.quarkus] (main) pizza-maker stopped in 0.000s
Faire plus de pizzas
vim apps/pizzas/meat-lovers.yaml
meat-lovers.yaml
apiVersion: mykubernetes.acme.org/v1 kind: Pizza metadata: name: meatsp spec: toppings:
vim apps/pizzas/veggie-lovers.yaml
vim apps/pizzas/veggie-lovers.yaml
apiVersion: mykubernetes.acme.org/v1 kind: Pizza metadata: name: veggiep spec: toppings:
kubectl apply -f apps/pizzas/meat-lovers.yaml kubectl apply -f apps/pizzas/veggie-lovers.yaml kubectl get pizzas –all-namespaces
Manger toutes les pizzas
kubectl delete pizzas –all
Supprimer les ressources
kubectl delete all –all
## Créer un peu de Kafka
Kafka pour Minikube
Créez un nouvel espace de nom pour cette expérience :
kubectl create namespace franz kubectl config set-context –current –namespace=franz
Déployer l'opérateur Kafka :
curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.20.0/install.sh | bash -s v0.20.0
kubectl create -f https://operatorhub.io/install/strimzi-kafka-operator.yaml
kubectl get csv
Attendez un peu jusqu'à l'état succès :
watch kubectl get csv
NAME DISPLAY VERSION REPLACES PHASE strimzi-cluster-operator.v0.27.1 Strimzi 0.27.1 strimzi-cluster-operator.v0.27.0 Succeeded
Démarrer une veille dans un autre terminal :
watch kubectl get pods
Ensuite, déployez la ressource en demandant un cluster Kafka :
vim apps/kubefiles/mykafka.yml
mykafka.yml
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: version: 3.0.0 replicas: 3 listeners: - name: plain port: 9092 type: internal tls: false - name: tls port: 9093 type: internal tls: true config: offsets.topic.replication.factor: 3 transaction.state.log.replication.factor: 3 transaction.state.log.min.isr: 2 log.message.format.version: ‘3.0’ inter.broker.protocol.version: ‘3.0’ storage: type: ephemeral zookeeper: replicas: 3 storage: type: ephemeral entityOperator: topicOperator: {} userOperator: {}
kubectl apply -f apps/kubefiles/mykafka.yml
Résultat :
NAME READY STATUS RESTARTS AGE my-cluster-entity-operator-66676cb9fb-fzckz 2/2 Running 0 29s my-cluster-kafka-0 2/2 Running 0 60s my-cluster-kafka-1 2/2 Running 0 60s my-cluster-kafka-2 2/2 Running 0 60s my-cluster-zookeeper-0 2/2 Running 0 92s my-cluster-zookeeper-1 2/2 Running 0 92s my-cluster-zookeeper-2 2/2 Running 0 92s
kubectl get kafkas
NAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS READY WARNINGS my-cluster 3 3 True True
Supprimer les ressources
kubectl delete namespace pizzahat kubectl delete -f apps/pizzas/pizza-crd.yaml kubectl delete kafka my-cluster kubectl delete namespace franz