A la fin de l'été, nous souhaitons vous rappeler que nous continuons à travailler sur le sujet Kubernetes et avons décidé de publier un article sur Stackoverflow démontrant l'état des lieux de ce projet début juin.
![](https://habrastorage.org/webt/cy/ch/zp/cychzpxql2r21m74tddt8loxuhk.jpeg)
Bonne lecture!
Au moment d'écrire ces lignes, Kubernetes a environ six ans et a tellement gagné en popularité au cours des deux dernières années qu'il s'est régulièrement classé parmi les plates-formes les plus favorisées . Kubernetes occupe la troisième place cette année. Pour rappel, Kubernetes est une plateforme pour exécuter et orchestrer des charges de travail conteneurisées.
Les conteneurs sont originaires d'une construction spéciale pour l'isolation des processus sous Linux; les conteneurs sont des groupes de contrôle depuis 2007 et des espaces de noms depuis 2002. Les conteneurs ont pris forme encore mieux en 2008, lorsque LXC est devenu disponible , et Google a développé son propre mécanisme interne appelé Borg.où «tout le travail est effectué dans des conteneurs». À partir de là, avancez rapidement jusqu'en 2013, lorsque la première version de Docker a eu lieu, et les conteneurs sont finalement passés à la catégorie des solutions de masse populaires. À cette époque, Mesos était le principal outil d'orchestration des conteneurs , même s'il n'était pas très populaire. La première version de Kubernetes a eu lieu en 2015, après quoi cet outil est devenu le standard de facto dans le domaine de l'orchestration de conteneurs.
Pour essayer de comprendre pourquoi Kubernetes est si populaire, essayons de répondre à quelques questions. À quand remonte la dernière fois que les développeurs ont pu s'entendre sur la manière de déployer des applications en production? Combien de développeurs connaissez-vous utilisent des outils tels qu'ils sont fournis prêts à l'emploi? Combien d'administrateurs cloud ne comprennent pas aujourd'hui le fonctionnement des applications? Nous examinerons les réponses à ces questions dans cet article.
Infrastructure comme YAML
Dans le monde qui est passé de Puppet and Chef à Kubernetes, l'un des plus grands changements a été le passage de l'infrastructure en tant que code à l'infrastructure en tant que données - en particulier comme YAML. Toutes les ressources de Kubernetes, qui incluent des pods, des configurations, des instances déployées, des volumes, etc., peuvent être facilement décrites dans un fichier YAML. Par exemple:
apiVersion: v1
kind: Pod
metadata:
name: site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
Cette vue permet aux DevOps ou aux SRE d'exprimer plus facilement leurs charges de travail sans avoir à écrire du code dans des langages tels que Python ou Javascript.
Les autres avantages de l'organisation de l'infrastructure sous forme de données, en particulier, sont les suivants:
- GitOps Git Operations Version. YAML- Kubernetes git, , , , . , , , , . , Kubernetes – pull-.
- . YAML, Kubernetes, . Kubernetes , , , , . , , - , maxReplicas 10 20:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp-deployment
minReplicas: 1
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- . YAML , Kubernetes. , , , , - , . conftest, YAML/JSON, Open Policy Agent, , , SecurityContext . , rego, :
package main
deny[msg] {
input.kind = "Deployment"
not input.spec.template.spec.securityContext.runAsNonRoot = true
msg = "Containers must not run as root"
}
- . – . cloud-provider Kubernetes , . , Kubernetes AWS ,
LoadBalancer
, Amazon Elastic Load Balancer, .
Kubernetes est très extensible et les développeurs l'adorent. Il existe une collection de ressources disponibles, telles que des pods, des balayages, des
StatefulSets
secrets ConfigMaps
, etc. Cependant, les utilisateurs et les développeurs peuvent ajouter d'autres ressources sous la forme de définitions de ressources personnalisées .
Par exemple, si nous voulions définir une ressource
CronTab
, nous pourrions faire quelque chose comme ceci:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.my.org
spec:
group: my.org
versions:
- name: v1
served: true
storage: true
Schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'
replicas:
type: integer
minimum: 1
maximum: 10
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
Plus tard, nous pouvons créer une ressource CronTab quelque chose comme ceci:
apiVersion: "my.org/v1"
kind: CronTab
metadata:
name: my-cron-object
spec:
cronSpec: "* * * * */5"
image: my-cron-image
replicas: 5
Une autre option d'extensibilité dans Kubernetes est que le développeur peut écrire ses propres opérateurs. Un opérateur est un processus spécial dans un cluster Kubernetes qui fonctionne selon un modèle de « boucle de contrôle » . Avec l'aide d'un opérateur, l'utilisateur peut automatiser la gestion des CRD (définitions de ressources personnalisées) en échangeant des informations avec l'API Kubernetes.
Il existe plusieurs outils dans la communauté qui permettent aux développeurs de créer facilement leurs propres opérateurs. Parmi eux se trouvent le Framework Operator et son Operator SDK . Ce SDK fournit un cadre à partir duquel un développeur peut très rapidement commencer à créer une instruction. Disons que vous pouvez commencer à partir de la ligne de commande quelque chose comme ceci:
$ operator-sdk new my-operator --repo github.com/myuser/my-operator
Cela crée tout le code stéréotypé pour votre opérateur, y compris les fichiers YAML et le code Golang:
.
|____cmd
| |____manager
| | |____main.go
|____go.mod
|____deploy
| |____role.yaml
| |____role_binding.yaml
| |____service_account.yaml
| |____operator.yaml
|____tools.go
|____go.sum
|____.gitignore
|____version
| |____version.go
|____build
| |____bin
| | |____user_setup
| | |____entrypoint
| |____Dockerfile
|____pkg
| |____apis
| | |____apis.go
| |____controller
| | |____controller.go
Ensuite, vous pouvez ajouter l'API et le contrôleur de votre choix, comme ceci:
$ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService
$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppService
Puis, enfin, récupérez l'opérateur et envoyez-le au registre de votre conteneur:
$ operator-sdk build your.container.registry/youruser/myapp-operator
Si le développeur a besoin d'encore plus de contrôle, vous pouvez modifier le code stéréotypé dans les fichiers en Go. Par exemple, pour modifier les spécificités du contrôleur, vous pouvez apporter des modifications au fichier
controller.go
.
Un autre projet, KUDO , vous permet de créer des instructions en utilisant uniquement des fichiers YAML déclaratifs. Par exemple, un opérateur pour Apache Kafka serait défini comme ceci . Avec lui, vous pouvez installer un cluster Kafka sur Kubernetes avec seulement quelques commandes:
$ kubectl kudo install zookeeper
$ kubectl kudo install kafka
Et puis configurez-le avec une autre commande:
$ kubectl kudo install kafka --instance=my-kafka-name \
-p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181 \
-p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m \
-p BROKER_COUNT=5 -p BROKER_MEM=4096m \
-p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3 \
-p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20
Innovation
Au cours des dernières années, les principales versions de Kubernetes ont été publiées tous les quelques mois, c'est-à-dire trois à quatre versions majeures par an. Le nombre de nouvelles fonctionnalités implémentées dans chacun d'eux ne diminue pas. De plus, il n'y a aucun signe de ralentissement même dans nos moments difficiles - regardez l' activité actuelle du projet Kubernetes sur Github .
De nouvelles fonctionnalités vous permettent de mettre en cluster les opérations de manière plus flexible sur une variété de charges de travail. De plus, les programmeurs aiment plus de contrôle lors du déploiement d'applications directement en production.
Communauté
Un autre aspect majeur de la popularité de Kubernetes est la force de sa communauté. En 2015, après avoir atteint la version 1.0, Kubernetes était sponsorisé par la Cloud Native Computing Foundation .
Il existe également une variété de communautés SIG (Special Interest Groups) pour explorer différents domaines de Kubernetes à mesure que le projet évolue. Ces groupes ajoutent constamment de nouvelles fonctionnalités pour rendre l'utilisation de Kubernetes plus pratique et plus pratique.
La Cloud Native Foundation héberge également CloudNativeCon / KubeCon, qui est la plus grande conférence open source au monde au moment de la rédaction de cet article. Généralement organisé trois fois par an, il rassemble des milliers de professionnels qui souhaitent améliorer Kubernetes et son écosystème, ainsi que maîtriser les nouvelles fonctionnalités qui apparaissent tous les trois mois.
De plus, la Cloud Native Foundation dispose d'un comité de supervision technique qui, en collaboration avec les SIG, examine les projets nouveaux et existants de la fondation axés sur l'écosystème cloud. La plupart de ces projets contribuent à améliorer les atouts de Kubernetes.
Enfin, je crois que Kubernetes n'aurait pas eu un tel succès sans les efforts délibérés de toute la communauté, où les gens s'accrochent les uns aux autres, mais en même temps, acceptent volontiers les nouveaux venus dans leurs rangs.
Futur
L'un des principaux défis auxquels les développeurs devront faire face à l'avenir est la capacité de se concentrer sur les détails du code lui-même, plutôt que sur l'infrastructure dans laquelle il opère. C'est à ces tendances que répond le paradigme de l'architecture sans serveur , qui est l'un des leaders aujourd'hui. Il existe déjà des frameworks avancés comme Knative et OpenFaas qui utilisent Kubernetes pour soustraire l'infrastructure au développeur.
Dans cet article, nous n'avons couvert que brièvement l'état actuel de Kubernetes - en fait, ce n'est que la pointe de l'iceberg. Les utilisateurs de Kubernetes ont de nombreuses autres ressources, capacités et configurations à leur disposition.