J'ai essayé de déployer Kubernetes Pods / Helm Chart avec Pulumi (Python)

Un mémo rédigé par un débutant Pulumi lorsqu'il a fait une évaluation tout en étudiant Kubernetes. Puisqu'il y a relativement beaucoup d'exemples de TypeScript dans le document officiel, je vais l'écrire comme un exemple de Python.

Aperçu

Comme le titre l'indique, nous avons essayé et évalué le déploiement de Kubernetes avec Pulumi. Voici les principales impressions.

--Depuis que le modèle pour Kubernetes (kubernetes-python) est fourni, le seuil d'introduction est relativement bas (juste en" pulumi up "à partir de l'état initial du projet, un simple déploiement nginx est créé. ça peut).

Évaluation

supposition

Le cluster Kubernetes (à l'aide d'AWS EKS) a déjà été créé et les paramètres initiaux de Plumi et Helm sont supposés être terminés. Le référentiel Helm Chart (bitnami / jenkins) utilisé pour les tests est également pré-enregistré (il semble qu'il puisse être obtenu à partir du référentiel avec la fonction de la classe FetchOps, mais il est exclu de cette cible d'évaluation).

$ pulumi version
v1.8.1
$ kubectl get nodes
NAME                                            STATUS   ROLES    AGE     VERSION
ip-10-0-0-145.ap-northeast-1.compute.internal   Ready    <none>   1h51m   v1.14.7-eks-1861c5
ip-10-0-2-96.ap-northeast-1.compute.internal    Ready    <none>   1h50m   v1.14.7-eks-1861c5
$ helm version
version.BuildInfo{Version:"v3.0.2", GitCommit:"19e47ee3283ae98139d98460de796c1be1e3975f", GitTreeState:"clean", GoVersion:"go1.13.5"}

$ helm repo list
NAME   	URL
bitnami	https://charts.bitnami.com/bitnami

Initialisation du projet

Créez un nouveau projet Pulumi en utilisant le modèle kubernetes-python (les questions posées reçoivent une réponse par défaut).

$ mkdir python-k8s && cd python-k8s
$ pulumi new kubernetes-python

This command will walk you through creating a new Pulumi project.
 
 Enter a value or leave blank to accept the (default), and press <ENTER>.
 Press ^C at any time to quit.
 
 project name: (python-k8s)
 project description: (A minimal Kubernetes Python Pulumi program)
 Created project 'python-k8s'
 
 Please enter your desired stack name.
 To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`).
 stack name: (dev)
 Created stack 'dev'
 
 Your new project is ready to go! ✨
 
 To perform an initial deployment, run the following commands:
 
    1. virtualenv -p python3 venv
    2. source venv/bin/activate
    3. pip3 install -r requirements.txt
 
 Then, run 'pulumi up'

Configurez l'environnement virtualenv de Python (et installez les bibliothèques dépendantes) comme indiqué dans le message.

$ pip3 install virtualenv
$ virtualenv -p python3 venv
$ source venv/bin/activate
$ pip3 install -r requirements.txt

la mise en oeuvre

Modification du code d'implémentation Python (__main __. Py) pour créer les deux types de ressources suivants. En outre, il est défini pour afficher le nom d'hôte de chaque service (nom d'hôte attribué à AWS Elastic Load Balancer) dans Output.

import base64
import pulumi
from pulumi_kubernetes.apps.v1 import Deployment
from pulumi_kubernetes.core.v1 import Service
from pulumi_kubernetes.helm.v2 import Chart, ChartOpts

def deploy_nginx_service():
    app_name = "nginx"
    app_labels = { "app": app_name }

    nginx_deployment = Deployment(
        app_name,
        spec={
            "selector": { "match_labels": app_labels },
            "replicas": 1,
            "template": {
                "metadata": { "labels": app_labels },
                "spec": { "containers": [{ "name": app_name, "image": "nginx" }] }
            }
        })

    nginx_service = Service(
        app_name,
        metadata={
            "labels": nginx_deployment.spec["template"]["metadata"]["labels"],
        },
        spec={
            "type": "LoadBalancer",
            "ports": [{ "port": 80, "target_port": 80, "protocol": "TCP" }],
            "selector": app_labels,
        })

    return nginx_service

def deploy_jenkins_chart():
    return Chart("jenkins", ChartOpts(
        chart="jenkins",
        repo="bitnami",
        values={},
    ))

nginx_service = deploy_nginx_service()
jenkins_chart = deploy_jenkins_chart()

pulumi.export("nginx_hostname",
    nginx_service.status.apply(
        lambda x: x["load_balancer"]["ingress"][0]["hostname"]))

pulumi.export("jenkins_hostname",
    jenkins_chart.resources.apply(
        lambda x: x["v1/Service:jenkins"].status["load_balancer"]["ingress"][0]["hostname"]))

Courir

pulumi up
Previewing update (dev):

     Type                                         Name            Plan
 +   pulumi:pulumi:Stack                          python-k8s-dev  create
 +   ├─ kubernetes:helm.sh:Chart                  jenkins         create
 +   │  ├─ kubernetes:core:PersistentVolumeClaim  jenkins         create
 +   │  ├─ kubernetes:core:Secret                 jenkins         create
 +   │  ├─ kubernetes:core:Service                jenkins         create
 +   │  └─ kubernetes:apps:Deployment             jenkins         create
 +   ├─ kubernetes:apps:Deployment                nginx           create
 +   └─ kubernetes:core:Service                   nginx           create

Resources:
    + 8 to create

Do you want to perform this update? yes
Updating (dev):

     Type                                         Name            Status
 +   pulumi:pulumi:Stack                          python-k8s-dev  created
 +   ├─ kubernetes:helm.sh:Chart                  jenkins         created
 +   │  ├─ kubernetes:core:Secret                 jenkins         created
 +   │  ├─ kubernetes:core:Service                jenkins         created
 +   │  ├─ kubernetes:core:PersistentVolumeClaim  jenkins         created
 +   │  └─ kubernetes:apps:Deployment             jenkins         created
 +   ├─ kubernetes:apps:Deployment                nginx           created
 +   └─ kubernetes:core:Service                   nginx           created

Outputs:
    jenkins_hostname: "xxx.ap-northeast-1.elb.amazonaws.com"
    nginx_hostname  : "yyy.ap-northeast-1.elb.amazonaws.com"

Resources:
    + 8 created

Les noms d'hôte sortis vers «Outputs» sont «Service (Load Balancer)» correspondant à «jenkins» et «nginx», respectivement. Si vous accédez à chacun avec curl, une réponse sera renvoyée.

$ curl -s --head xxx.ap-northeast-1.elb.amazonaws.com | grep X-Jenkins:
X-Jenkins: 2.204.1
$ curl -s --head yyy.ap-northeast-1.elb.amazonaws.com | grep Server
Server: nginx/1.17.6

Vérifier les ressources

Vous pouvez également vérifier les ressources générées avec la commande kubectl. Cependant, Helm Chart n'est pas affiché (la liste reste vide) car Pulumi le développe indépendamment.

$ kubectl get deployments
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
jenkins          1/1     1            1           32m
nginx-nziiq5rs   1/1     1            1           32m
$ kubectl get services
NAME             TYPE           CLUSTER-IP      EXTERNAL-IP                            PORT(S)                      AGE
jenkins          LoadBalancer   172.20.125.15   xxx.ap-northeast-1.elb.amazonaws.com   80:32525/TCP,443:31321/TCP   33m
kubernetes       ClusterIP      172.20.0.1      <none>                                 443/TCP                      1h42m
nginx-6hbjq6d7   LoadBalancer   172.20.14.82    yyy.ap-northeast-1.elb.amazonaws.com   80:32325/TCP                 33m
$ helm list
NAME	NAMESPACE	REVISION	UPDATED	STATUS	CHART	APP VERSION

Informations de référence

Description du plugin pour Kubernetes.

API Reference。

In this tutorial, we’ll use the Helm API of @pulumi/kubernetes to deploy v2.1.3 of the Wordpress Helm Chart to a Kubernetes cluster. The Tiller server is not required to be installed. Pulumi will expand the Helm Chart and submit the expanded YAML to the cluster.

Explication que le fournisseur Helm de Pulumi déploie et déploie Chart indépendamment. Pour cette raison, il semble qu'il ne soit pas affiché dans le résultat de helm list.

Description de la conversion de sortie de Output. Il est nécessaire d'utiliser la fonction ʻapplylors du traitement de la sortie Output (typePulumi.Output`) par Pulumi (peut-être fait-il un traitement spécial en interne, ou simplement convertir l'objet ne fonctionne pas bien. Par exemple, j'ai rencontré un phénomène selon lequel le traitement tel que «pulumi up» est bloqué et le traitement ne se poursuit pas).

The apply method accepts a callback which will be passed the value of the Output when it is available, and which returns the new value. The result of the call to apply is a new Output whose value is the value returned from the callback, and which includes the dependencies of the original Output. If the callback itself returns an Output, the dependencies of that output are unioned into the dependencies of the returned Output.

Recommended Posts

J'ai essayé de déployer Kubernetes Pods / Helm Chart avec Pulumi (Python)
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé webScraping avec python.
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé des centaines de millions de SQLite avec python
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé L-Chika avec Razpai 4 (édition Python)
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé d'exécuter faiss avec python, Go, Rust
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
J'ai essayé d'envoyer un email avec SendGrid + Python
J'ai essayé Python> autopep8
J'ai essayé Python> décorateur
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le perceptron artificiel avec python
Mayungo's Python Learning Episode 1: J'ai essayé d'imprimer avec impression
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
J'ai essayé de frapper l'API avec le client python d'echonest
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai essayé d'envoyer un e-mail d'Amazon SES avec Python
J'ai essayé Learning-to-Rank avec Elasticsearch!
J'ai fait un blackjack avec du python!
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
J'ai essayé le clustering avec PyCaret
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé l'extension C de Python