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.
Wie der Titel schon sagt, haben wir versucht, die Bereitstellung von Kubernetes mit Pulumi zu evaluieren. Das Folgende sind die wichtigsten Eindrücke.
kubernetes-python
) bereitgestellt wird, ist die Einführungsschwelle relativ niedrig (nur durch pulumi up
ab dem Anfangszustand des Projekts wird eine einfache nginx
-Bereitstellung erstellt es kann).kubectl
drücken können, scheint es keine zusätzlichen Einstellungen zu geben.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
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
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"]))
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
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
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