Ich habe versucht, Kubernetes Pods / Helm Chart mit Pulumi (Python) bereitzustellen.

Ein Memo, das von einem Pulumi-Anfänger geschrieben wurde, als er eine Bewertung durchführte und gleichzeitig Kubernetes studierte. Da das offizielle Dokument relativ viele Beispiele für TypeScript enthält, werde ich es als Beispiel für Python aufschreiben.

Überblick

Wie der Titel schon sagt, haben wir versucht, die Bereitstellung von Kubernetes mit Pulumi zu evaluieren. Das Folgende sind die wichtigsten Eindrücke.

Auswertung

Annahme

Der Kubernetes-Cluster (mit AWS EKS) wurde bereits erstellt, und die anfänglichen Einstellungen für Plumi und Helm werden als abgeschlossen angenommen. Das zum Testen verwendete Helm Chart-Repository (bitnami / jenkins) ist ebenfalls vorregistriert (es scheint, dass es mit der Funktion der Klasse FetchOps aus dem Repository abgerufen werden kann, ist jedoch von diesem Bewertungsziel ausgeschlossen).

$ 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

Projektinitialisierung

Erstellen Sie ein neues Pulumi-Projekt mit der Vorlage "kubernetes-python" (gestellte Fragen werden standardmäßig beantwortet).

$ 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'

Richten Sie die "virtualenv" -Umgebung von Python ein (und installieren Sie abhängige Bibliotheken), wie in der Nachricht gezeigt.

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

Implementierung

Der Python-Implementierungscode (`__main __. Py ') wurde geändert, um die folgenden zwei Arten von Ressourcen zu erstellen. Darüber hinaus ist definiert, dass der Hostname jedes Dienstes (Hostname, der AWS Elastic Load Balancer zugewiesen ist) in der Ausgabe ausgegeben wird.

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"]))

Lauf

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

Die an "Outputs" ausgegebenen Hostnamen sind "Service (Load Balancer)", was "Jenkins" bzw. "Nginx" entspricht. Wenn Sie mit "curl" auf jedes zugreifen, wird eine Antwort zurückgegeben.

$ 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

Überprüfen Sie die Ressourcen

Sie können die generierten Ressourcen auch mit dem Befehl kubectl überprüfen. Das Helmdiagramm wird jedoch nicht angezeigt (die Liste bleibt leer), da Pulumi es unabhängig entwickelt.

$ 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

Referenzinformationen

Beschreibung des Plugins für 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.

Erläuterung, dass Pulumis Helm-Provider Chart unabhängig voneinander bereitstellt und bereitstellt. Aus diesem Grund scheint es, dass es nicht im Ergebnis der "Steuerliste" ausgegeben wird.

Beschreibung der Ausgabekonvertierung von Ausgabe. Es ist erforderlich, die Funktion "Apply" zu verwenden, wenn die von Pulumi ausgegebene Ausgabe (Typ "Pulumi.Output") verarbeitet wird (möglicherweise wird intern eine spezielle Verarbeitung durchgeführt, oder das einfache Konvertieren des Objekts funktioniert nicht gut. Ich bin zum Beispiel auf ein Phänomen gestoßen, bei dem die Verarbeitung wie "pulumi up" blockiert ist und die Verarbeitung nicht fortgesetzt wird.

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

Ich habe versucht, Kubernetes Pods / Helm Chart mit Pulumi (Python) bereitzustellen.
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
Ich habe Python> autopep8 ausprobiert
Ich habe Python> Decorator ausprobiert
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Mayungos Python-Lernfolge 1: Ich habe versucht, mit Druck zu drucken
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
Ich habe versucht, mit Python eine E-Mail von Amazon SES zu senden
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
Ich habe einen Blackjack mit Python gemacht!
Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe versucht, mit PyCaret zu clustern
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe die C-Erweiterung von Python ausprobiert