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.
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).
kubectl
, il ne semble pas y avoir de paramètres supplémentaires.helm list
.Pulumi.Output
(le paramètre de sortie de la ressource générée) a nécessité quelques essais et erreurs (quelque peu difficile à comprendre, comme autour de la fonction ʻapply`).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
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
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"]))
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
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
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 (type
Pulumi.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