Informatique sans serveur basée sur OpenWhisk, partie 4


Cet article conclut les traductions d'OpenWhisk de Priti Desai . Aujourd'hui, nous allons examiner le processus de déploiement d'OpenWhisk au-dessus de Kubernetes avec des commandes corrigées pour travailler avec les versions actuelles des applications. Il décrira également comment exécuter les fonctions OpenWhisk en utilisant Knative et TektonCD dans Kubernetes en utilisant le runtime Nodejs.


Déployer OpenWhisk sur Kubernetes


Au cours de quelques jours, j'ai expérimenté le déploiement d'OpenWhisk dans Kubernetes pour créer un terrain d'entraînement rapide et facile. Et comme je suis nouveau sur Kubernetes, je pense qu'une journée et demie a été consacrée à un déploiement réussi. Ce référentiel contient des instructions très claires pour déployer OpenWhisk sur Kubernetes. Voici les instructions de déploiement faites pour le Mac ( je ferai aussi tout sur Linux, car je préfère Linux. - Note du traducteur).


  1. Nous installons le asdf paquets asdf , après quoi nous asdf automatiquement ~/.bash_profile ou son analogue comme ceci:

 $ brew install asdf $ [ -s "/usr/local/opt/asdf/asdf.sh" ] && . /usr/local/opt/asdf/asdf.sh $ source ~/.bash_profile 

[ Sous Linux, cette étape n'est pas nécessaire, bien qu'il y ait une infusion. - env. traducteur]


  1. Ajouter des kubelet minikube et kubelet :

 $ asdf plugin-add kubectl $ asdf plugin-add minikube 

[ Encore une fois, ignorez cette étape sous Linux. - env. traducteur]


  1. Nous mettons minikube et kubelet:

 $ asdf install kubectl 1.9.0 $ asdf global kubectl 1.9.0 $ asdf install minikube 0.25.2 $ asdf global minikube 0.25.2 

[ des versions spécifiques sont installées, mais j'ai tout vérifié sur les dernières versions disponibles pour Linux; Je soupçonne que vous pouvez mettre en toute sécurité la dernière. - env. traducteur]


Sous Linux, cette étape se fait comme ceci (tout est placé dans ~ / bin, que j'ai dans PATH, note du traducteur):


 $ curl -L0 minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && mv minikube ~/bin/ $ curl -L0 https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && mv kubectl ~/bin/ 

  1. Nous créons la machine virtuelle minikube (VirtualBox doit être pré-installé):

 $ minikube start --cpus 2 --memory 4096 --kubernetes-version=v1.9.0 --extra-config=apiserver.Authorization.Mode=RBAC 

[ Tout fonctionne pour moi avec la commande de minikube start du minikube start , sans paramètres et avec des valeurs par défaut. - env. traducteur]


 $ minikube start minikube v1.5.2 on Debian 8.11 Automatically selected the 'virtualbox' driver Downloading VM boot image ... > minikube-v1.5.1.iso.sha256: 65 B / 65 B [--------------] 100.00% ? p/s 0s > minikube-v1.5.1.iso: 143.76 MiB / 143.76 MiB [-] 100.00% 5.63 MiB p/s 26s Creating virtualbox VM (CPUs=2, Memory=4096MB, Disk=20000MB) ... Preparing Kubernetes v1.16.2 on Docker '18.09.9' ... Downloading kubelet v1.16.2 Downloading kubeadm v1.16.2 Pulling images ... Launching Kubernetes ... Waiting for: apiserver Done! kubectl is now configured to use "minikube" 

  1. Basculez le réseau dans Docker en mode promiscuous:

 $ minikube ssh -- sudo ip link set docker0 promisc on 

  1. Créez un espace de noms et marquez le nœud de travail:

 $ kubectl create namespace openwhisk $ kubectl label nodes --all openwhisk-role=invoker 

  1. Nous obtenons le contenu du référentiel et redéfinissons le type d'entrée dans le fichier mycluster.yaml:

 $ git clone https://github.com/apache/incubator-openwhisk-deploy-kube.git $ cd incubator-openwhisk-deploy-kube/ $ cat << "EOF" > mycluster.yaml whisk: ingress: type: NodePort api_host_name: 192.168.99.100 api_host_port: 31001 nginx: httpsNodePort: 31001 EOF 

  1. Installez Helm et déployez-le à l'aide de celui-ci:

 $ brew install kubernetes-helm $ helm init # init Helm Tiller,    Helm v3+ $ kubectl get pods -n kube-system # verify that tiller-deploy is in the running state,    helm v3+ $ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default $ helm install ./openwhisk/helm/ --namespace=openwhisk -f mycluster.yaml 

[ Sous Linux avec les dernières versions (la v3.0.1 était disponible), ce sera un peu différent. - env. traducteur]


 $ curl -L0 https://get.helm.sh/helm-v3.0.1-linux-amd64.tar.gz | tar -xzvf - linux-amd64/helm --strip-components=1; sudo mv helm /usr/local/bin $ kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default $ helm install ./openwhisk/helm/ --namespace=openwhisk --generate-name -f mycluster.yaml 

  1. Vérifiez que tout a augmenté (STATUT = En cours d'exécution ou terminé):

 $ kubectl get pods -n openwhisk NAME READY STATUS RESTARTS AGE openwhisk-1576070780-alarmprovider-6868dc694-plvpf 1/1 Running 1 1d5h openwhisk-1576070780-apigateway-8d56f4979-825hf 1/1 Running 1 1d5h openwhisk-1576070780-cloudantprovider-544bb46596-9scph 1/1 Running 1 1d5h openwhisk-1576070780-controller-0 1/1 Running 2 1d5h openwhisk-1576070780-couchdb-7fd7f6c7cc-42tw6 1/1 Running 1 1d5h openwhisk-1576070780-gen-certs-z9nsb 0/1 Completed 0 1d5h openwhisk-1576070780-init-couchdb-r2vmt 0/1 Completed 0 1d5h openwhisk-1576070780-install-packages-27dtr 0/1 Completed 0 1d4h openwhisk-1576070780-invoker-0 1/1 Running 1 1d5h openwhisk-1576070780-kafka-0 1/1 Running 1 1d5h openwhisk-1576070780-kafkaprovider-f8b4cf4fc-7z4gt 1/1 Running 1 1d5h openwhisk-1576070780-nginx-6dbdbf69bc-5x76n 1/1 Running 1 1d5h openwhisk-1576070780-redis-cfd8756f4-hkrt6 1/1 Running 1 1d5h openwhisk-1576070780-wskadmin 1/1 Running 1 1d5h openwhisk-1576070780-zookeeper-0 1/1 Running 1 1d5h wskopenwhisk-1576070780-invoker-00-1-prewarm-nodejs10 1/1 Running 0 61s wskopenwhisk-1576070780-invoker-00-2-prewarm-nodejs10 1/1 Running 0 61s wskopenwhisk-1576070780-invoker-00-3-whisksystem-invokerhealtht 1/1 Running 0 59s 

  1. Nous configurons wsk pour le travail:

 $ wsk property set --apihost 192.168.99.100:31001 $ wsk property set --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP 

Nous vérifions:


 $ wsk -i list Entities in namespace: default packages actions triggers rules 

Problèmes et solutions


getsockopt: connexion refusée


 $ wsk -i list error: Unable to obtain the list of entities for namespace 'default': Get http://192.168.99.100:31001/api/v1/namespaces/_/actions?limit=0&skip=0: dial tcp 192.168.99.100:31001: getsockopt: connection refused 

Nous vérifions que les conteneurs de l'espace de noms openwhisk en cours d' Running , car parfois, il se bloque avec des erreurs CreateContainerConfigError .


Invocateur toujours en cours d'initialisation - Init: 1/2


Le processus de téléchargement de toutes sortes d'exécutions peut prendre beaucoup de temps. Pour la vitesse, vous pouvez spécifier une liste minimale raccourcie dans le fichier mycluster.yaml :


 whisk: runtimes: "runtimes-minimal-travis.json" 

Un conteneur nommé -install-packages- tombe en erreur


Augmentez simplement les délais d'expiration pour les tests de vivacité.


Installez OpenWhisk sur Knative


Priti Desai a effectué l'installation au-dessus du cluster dans le cloud IBM, ainsi que sur le mini-cube normal, en utilisant Knative Build et BuildTemplates. Je vais également installer au-dessus de minukube, en fonction de la façon dont il a été décrit dans notre blog plus tôt - en utilisant les dernières versions du logiciel. Étant donné que Knative Build et BuildTemplates sont officiellement obsolètes, j'utiliserai le remplacement recommandé sous la forme de Tekton Pipelines. Le reste de l'article a été écrit après avoir lu la documentation de Tekton Pipelines, mais basé sur les idées de Priti. Pour travailler, vous aurez besoin d'accéder à un certain Docker Registry - moi, comme l'auteur original, j'utiliserai DockerHub.


 $ curl -L0 https://github.com/solo-io/gloo/releases/download/v1.2.10/glooctl-linux-amd64; chmod +x glooctl-linux-amd64; mv glooctl-linux-amd64 ~/bin $ glooctl install knative $ kubectl get pods -n knative-serving NAME READY STATUS RESTARTS AGE activator-77fc555665-rvrst 1/1 Running 0 2m23s autoscaler-5c98b7c9b6-x8hh4 1/1 Running 0 2m21s autoscaler-hpa-5cfd4f6845-w87kq 1/1 Running 0 2m22s controller-7fd74c8f67-tprm8 1/1 Running 0 2m19s webhook-74847bb77c-txr2g 1/1 Running 0 2m17s $ kubectl get pods -n gloo-system NAME READY STATUS RESTARTS AGE discovery-859d7fbc9c-8xhvh 1/1 Running 0 51s gloo-545886d9c6-85mwt 1/1 Running 0 51s ingress-67d4996d75-lkkmw 1/1 Running 0 50s knative-external-proxy-767dfd656c-wwv2z 1/1 Running 0 50s knative-internal-proxy-6fdddcc6b5-7vqd8 1/1 Running 0 51s 


Créez et exécutez OpenWhisk au-dessus de Knative


  1. Nous obtenons le contenu de ce référentiel :

 $ git clone https://github.com/tektoncd/catalog/ $ cd catalog/openwhisk 

  1. Nous configurons les données pour accéder au Registre sous forme de variables d'environnement et les enregistrons en tant que secret Kubernetes:

 $ export DOCKER_USERNAME=<your docker hub username> $ export DOCKER_PASSWORD=<your docker hub password> $ sed -e 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -e 's/${DOCKER_PASSWORD}/'"$DOCKER_PASSWORD"'/' docker-secret.yaml.tmpl > docker-secret.yaml $ kubectl apply -f docker-secret.yaml 

Nous vérifions:


 $ kubectl get secret NAME TYPE DATA AGE dockerhub-user-pass kubernetes.io/basic-auth 2 21s 

  1. Créez un compte pour créer des environnements:

 $ kubectl apply -f service-account.yaml 

Nous vérifions:


 $ kubectl get serviceaccount/openwhisk-runtime-builder NAME SECRETS AGE openwhisk-runtime-builder 2 31m 

  1. Créer une tâche pour créer une image pour OpenWhisk

 $ kubectl apply -f openwhisk.yaml task.tekton.dev/openwhisk created 

  1. Exécutez la tâche pour créer l'image (en utilisant NodeJS comme exemple):

Créez le fichier taskrun.yaml avec le contenu:


 # Git Pipeline Resource for OpenWhisk NodeJS Runtime apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: openwhisk-nodejs-runtime-git spec: type: git params: - name: revision value: master - name: url value: https://github.com/apache/openwhisk-runtime-nodejs.git --- # Image Pipeline Resource for OpenWhisk NodeJS Sample Application apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: openwhisk-nodejs-helloworld-image spec: type: image params: - name: url value: docker.io/${DOCKER_USERNAME}/openwhisk-nodejs-helloworld --- # Task Run to build NodeJS image with the action source apiVersion: tekton.dev/v1alpha1 kind: TaskRun metadata: name: openwhisk-nodejs-helloworld spec: serviceAccountName: openwhisk-runtime-builder taskRef: name: openwhisk inputs: resources: - name: runtime-git resourceRef: name: openwhisk-nodejs-runtime-git params: - name: DOCKERFILE value: "./runtime-git/core/nodejs10Action/knative/Dockerfile" - name: OW_ACTION_NAME value: "nodejs-helloworld" - name: OW_ACTION_CODE value: "function main() {return {payload: 'Hello World!'};}" - name: OW_PROJECT_URL value: "" outputs: resources: - name: runtime-image resourceRef: name: openwhisk-nodejs-helloworld-image --- 

Nous appliquons les données actuelles pour ce fichier:


 $ sed 's/${DOCKER_USERNAME}/'"$DOCKER_USERNAME"'/' -i taskrun.yaml 

Nous appliquons:


 $ kubectl apply -f taskrun.yaml pipelineresource.tekton.dev/openwhisk-nodejs-runtime-git created pipelineresource.tekton.dev/openwhisk-nodejs-helloworld-image created taskrun.tekton.dev/openwhisk-nodejs-helloworld created 

La vérification de l'œuvre consiste à obtenir le nom du pod, à visualiser son statut. Vous pouvez également voir le journal de chaque étape, par exemple:


 $ kubectl get taskrun NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME openwhisk-nodejs-helloworld True Succeeded 5m15s 44s $ kubectl get pod openwhisk-nodejs-helloworld-pod-4640d3 NAME READY STATUS RESTARTS AGE openwhisk-nodejs-helloworld-pod-4640d3 0/6 Completed 0 5m20s $ kubectl logs openwhisk-nodejs-helloworld-pod-4640d3 -c step-git-source-openwhisk-nodejs-runtime-git-r8vhr {"level":"info","ts":1576532931.5880227,"logger":"fallback-logger","caller":"logging/config.go:69","msg":"Fetch GitHub commit ID from kodata failed: open /var/run/ko/refs/heads/master: no such file or directory"} {"level":"info","ts":1576532936.538926,"logger":"fallback-logger","caller":"git/git.go:81","msg":"Successfully cloned https://github.com/apache/openwhisk-runtime-nodejs.git @ master in path /workspace/runtime-git"} {"level":"warn","ts":1576532936.5395331,"logger":"fallback-logger","caller":"git/git.go:128","msg":"Unexpected error: creating symlink: symlink /tekton/home/.ssh /root/.ssh: file exists"} {"level":"info","ts":1576532936.8202565,"logger":"fallback-logger","caller":"git/git.go:109","msg":"Successfully initialized and updated submodules in path /workspace/runtime-git"} 

Après l'exécution, une image apparaîtra dans notre registre qui peut être déployée à l'aide de l'utilitaire kn conçu pour fonctionner avec les services Knative, par exemple:


 kn service create nodejs-helloworld --image docker.io/${DOCKER_USERNAME}/openwhisk-nodejs-helloworld Service 'nodejs-helloworld' successfully created in namespace 'default'. Waiting for service 'nodejs-helloworld' to become ready ... OK Service URL: http://nodejs-helloworld.default.example.com 

Dans le cas de l'utilisation de Gloo, vous pouvez vérifier la fonctionnalité en:


 $ curl -H "Host: nodejs-helloworld.default.example.com" -X POST $(glooctl proxy url --name knative-external-proxy) {"OK":true} $ curl -H "Host: nodejs-helloworld.default.example.com" -X POST $(glooctl proxy url --name knative-external-proxy) {"payload":"Hello World!"} 

Autres articles de cycle


Informatique sans serveur basée sur OpenWhisk, partie 1
Informatique sans serveur basée sur OpenWhisk, partie 2
Informatique sans serveur basée sur OpenWhisk, partie 3
Informatique sans serveur basée sur OpenWhisk, partie 4

Source: https://habr.com/ru/post/fr481000/


All Articles