Serverloos computergebruik met OpenWhisk, deel 4

Serverloos computergebruik met OpenWhisk, deel 4

Dit artikel beëindigt de reeks vertaalde opmerkingen over OpenWhisk van de auteur Priti Desai. Vandaag kijken we naar het proces van het implementeren van OpenWhisk via Kubernetes met gecorrigeerde opdrachten om met de huidige versies van applicaties te werken. Het behandelt ook het proces van het uitvoeren van OpenWhisk-functies met behulp van Knative en TektonCD op Kubernetes met behulp van de Nodejs-runtime.

OpenWhisk implementeren op Kubernetes

In de loop van een paar dagen heb ik geëxperimenteerd met de implementatie van OpenWhisk in Kubernetes om een ​​eenvoudige en snelle proeftuin te creëren. En aangezien ik nieuw ben bij Kubernetes, geloof ik dat er anderhalve dag aan een succesvolle implementatie is besteed. IN deze De repositories hebben zeer duidelijke instructies voor het implementeren van OpenWhisk op Kubernetes. Hier zijn de implementatie-instructies gemaakt voor Mac (Ik zal ook alles op Linux doen omdat ik de voorkeur geef aan Linux. — ca. vertaler).

  1. De pakketbeheerder installeren asdf, waarna we automatisch corrigeren ~/.bash_profile of het equivalent hiervan, zoals dit:

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

[Op Linux is deze stap niet nodig, hoewel brew wel beschikbaar is. — ca. vertaler]

  1. Plug-ins toevoegen minikube и kubelet:

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

[Nogmaals, sla deze stap over op Linux. — ca. vertaler]

  1. Installeer minikube en 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

[specifieke versies zijn geïnstalleerd, maar ik heb alles gecontroleerd op de nieuwste beschikbare versies voor Linux; Ik vermoed dat je de nieuwste versie veilig kunt installeren. — ca. vertaler]

Op Linux wordt deze stap ongeveer als volgt uitgevoerd (alles wordt in ~/bin geplaatst, wat vermeld staat in mijn PATH, de opmerking van de vertaler):

$ 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. Maak een virtuele minikube-machine (VirtualBox moet vooraf zijn geïnstalleerd):

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

[Alles werkt voor mij met het team minikube start , zonder parameters en met standaardwaarden. — ca. vertaler]

$ 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. Het netwerk in Docker naar promiscue modus schakelen:

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

  1. Maak een naamruimte en markeer het werkknooppunt:

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

  1. We halen de inhoud van de repository op en overschrijven het type voor toegang tot het bestand 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. Installeer Helm en implementeer het met behulp van:

$ 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

[Op Linux met de nieuwste versies (v3.0.1 was beschikbaar) zal het een beetje anders zijn. — ca. vertaler]

$ 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. We controleren of alles is gestegen (STATUS = Running of Completed):

$ 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. WSK configureren om te werken:

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

controleren:

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

Problemen en oplossingen

getockopt: verbinding geweigerd

$ 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

Controleren of de containers zich in de naamruimte bevinden openwhisk in status Running, omdat soms crasht het met fouten CreateContainerConfigError.

Invoker is nog steeds aan het initialiseren - Init:1/2

Het downloaden van verschillende runtime-omgevingen kan lang duren. Om de zaken te versnellen, kunt u een verkorte minimumlijst in het bestand opgeven mycluster.yaml:

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

Houder met naam -installatiepakketten- crasht naar Error

Vergroot gewoon de time-outs voor liveness-tests.

OpenWhisk installeren via Knative

Priti Desai voerde de installatie uit bovenop een cluster in de IBM-cloud, maar ook op een reguliere minikube, met behulp van Knative Build en BuildTemplates. Ik zal ook bovenop minukube installeren, op basis van hoe het werd beschreven in onze blog eerder - met behulp van de nieuwste softwareversies. Omdat Knative Build en BuildTemplates officieel verouderd zijn, zal ik de aanbevolen vervanging gebruiken in de vorm van Tekton Pipelines. De rest van het artikel is geschreven na het lezen van de documentatie voor Tekton Pipelines, maar is gebaseerd op de ideeën van Priti. Om te werken heb je toegang nodig tot een Docker-register. Ik zal, net als de oorspronkelijke auteur, DockerHub gebruiken.

$ 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

Serverloos computergebruik met OpenWhisk, deel 4
OpenWhisk bouwen en uitvoeren bovenop Knative

  1. Het verkrijgen van de inhoud deze opslagplaats:

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

  1. We stellen de gegevens voor toegang tot het register in als omgevingsvariabelen en slaan ze op als een Kubernetes-geheim:

$ 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

controleren:

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

  1. Maak een account aan voor bouwomgevingen:

$ kubectl apply -f service-account.yaml

controleren:

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

  1. Maak een taak om een ​​image voor OpenWhisk te bouwen

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

  1. We voeren de taak uit om de afbeelding te bouwen (met NodeJS als voorbeeld):

Maak een taskrun.yaml-bestand met de inhoud:

# 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
---

Voor dit bestand hanteren wij de actuele gegevens:

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

Wij passen toe:

$ 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

Het controleren van het werk bestaat uit het ophalen van de naam van de pod en het bekijken van de status ervan. U kunt ook het uitvoeringslogboek van elke stap bekijken, bijvoorbeeld:

$ 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"}

Na uitvoering hebben we een afbeelding in het register die kan worden geïmplementeerd met behulp van het kn-hulpprogramma, ontworpen om te werken met Knative-services, bijvoorbeeld:

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

Als u Gloo gebruikt, kunt u de functionaliteit als volgt controleren:

$ 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!"}

Andere artikelen in de serie

Serverloos computergebruik met OpenWhisk, deel 1
Serverloos computergebruik met OpenWhisk, deel 2
Serverloos computergebruik met OpenWhisk, deel 3
Serverloos computergebruik met OpenWhisk, deel 4

Bron: www.habr.com

Voeg een reactie