在完成了《OpenShift 4 之Knative(1) - 创建Knative无服务器架构环境》后,我们部署一个基于Knative的Serverless应用。本文先部署一个Serverless应用(dumpy-servless)。作为对比,然后部署一个非Serverless应用(dumpy),最后对比两个应用的运行效果。
由于以下应用是通过Tekton部署的,因此首先需要安装并配置OpenShift Pipelines Operator。这部分请参照《OpenShift 4 之基于Tekton的Pipeline入门》中的“安装OpenShift Pipelines Operator”章节完成即可。
$ oc new-project kn-demo
$ oc create serviceaccount pipeline
$ oc adm policy add-scc-to-user privileged -z pipeline
$ oc adm policy add-role-to-user edit -z pipeline
$ oc create -f https://raw.githubusercontent.com/tektoncd/catalog/master/openshift-client/openshift-client-task.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-catalog/master/s2i-go/s2i-go-task.yaml
$ tkn tasks list
NAME AGE
openshift-client 3 minutes ago
s2i-go 4 seconds ago
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/knative-on-ocp4/master/pipeline/openshift-objects.yaml
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/knative-on-ocp4/master/pipeline/pipeline.yaml
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/knative-on-ocp4/master/pipeline/pipeline-resources.yaml
$ oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dumpy ClusterIP 172.30.208.196 <none> 8080/TCP 7m56s
$ oc get dc
NAME REVISION DESIRED CURRENT TRIGGERED BY
deploymentconfig.apps.openshift.io/dumpy 0 1 0
$ oc get is
NAME IMAGE REPOSITORY TAGS UPDATED
imagestream.image.openshift.io/dumpy default-route-openshift-image-registry.apps.cluster-jinan-e485.jinan-e485.example.opentlc.com/kn-demo/dumpy
$ oc get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
route.route.openshift.io/dumpy dumpy-kn-demo.apps.cluster-jinan-e485.jinan-e485.example.opentlc.com dumpy 8080-tcp None
$ tkn pipeline list
NAME AGE LAST RUN STARTED DURATION STATUS
deploy-pipeline 3 minutes ago --- --- --- ---
$ tkn resource list
NAME TYPE DETAILS
sourcecode-git git url: https://github.com/liuxiaoyu-git/openshift-knative-application
application-image image url: image-registry.openshift-image-registry.svc:5000/kn-demo/dumpy
$ tkn pipeline start deploy-pipeline -s pipeline -r app-git=sourcecode-git -r app-image=application-image
$ tkn pipelinerun list
NAME STARTED DURATION STATUS
deploy-pipeline-run-m65rw 1 minute ago --- Running
$ tkn pipeline logs -f -n kn-demo
Pipelinerun started: deploy-pipeline-run-m65rw
Showing logs...
[build : create-dir-image-wj45n] {"level":"warn","ts":1576916492.4300456,"logger":"fallback-logger","caller":"logging/config.go:69","msg":"Fetch GitHub commit ID from kodata failed: \"KO_DATA_PATH\" does not exist or is empty"}
[build : create-dir-image-wj45n] {"level":"info","ts":1576916492.4334698,"logger":"fallback-logger","caller":"bash/main.go:64","msg":"Successfully executed command \"sh -c mkdir -p /workspace/output/image\"; output "}
[build : git-source-sourcecode-git-h5kt6] {"level":"warn","ts":1576916492.9045074,"logger":"fallback-logger","caller":"logging/config.go:69","msg":"Fetch GitHub commit ID from kodata failed: \"KO_DATA_PATH\" does not exist or is empty"}
[build : git-source-sourcecode-git-h5kt6] {"level":"info","ts":1576916496.1496713,"logger":"fallback-logger","caller":"git/git.go:103","msg":"Successfully cloned https://github.com/redhatworkshops/openshift-knative-application @ master in path /workspace/source"}
[build : generate] Application dockerfile generated in /gen-source/Dockerfile.gen
[build : build] STEP 1: FROM registry.access.redhat.com/devtools/go-toolset-rhel7
[build : build] Getting image source signatures
[build : build] Copying blob sha256:d327c1598329494579ba3d62999df41f11bff9a2bfad57fb49b30324404ac42a
[build : build] Copying blob sha256:b3f9e500f5dfaff6c8eddc3ed2dd16669c83e7f1efb3ee1aa70d16d649f5dd2c
[build : build] Copying blob sha256:f6aa8ea214cf89cc2d98e9a37b312efca60118d3426b54d9301a88aa475f5721
[build : build] Copying blob sha256:77a3ebe83e4572edc5ae967ff01e7a5caebe18dff17cb35f1f8f7aa7967ab9ab
[build : build] Copying blob sha256:48ed3bfd822646e50676cd7606af43e984db141bb1755904362f1eb64684c68a
[build : build] Copying config sha256:79f73d426b92b081c8f2bab53aa6384fbe0d06ddb96807034ce7c49123a17e98
[build : build] Writing manifest to image destination
[build : build] Storing signatures
[build : build] STEP 2: LABEL "io.openshift.s2i.build.image"="registry.access.redhat.com/devtools/go-toolset-rhel7" "io.openshift.s2i.build.source-location"="."
[build : build] 6ed01800dd8587ceabbfdf0d7e73b395f3fb12e3b96d1395a66cbdeb60265156
[build : build] STEP 3: USER root
[build : build] 2ed70b4d5fc6ec25a620dde236ea8a64af9edf655c6db46a50b3d1c8f9c23884
[build : build] STEP 4: COPY upload/src /tmp/src
[build : build] 8414df122ca80dbb8a3af67e9e01ab47bbec3c1c0f1c220db2534005a30e30ba
[build : build] STEP 5: RUN chown -R 1001:0 /tmp/src
[build : build] fd686c4cabcbb709904f607e88da99d4928b4d4ac2547d5a9bc985411c605881
[build : build] STEP 6: USER 1001
[build : build] 05a48e0336d343840417e02dc75ae06e8310903f82d9d115dba7a308911c46fb
[build : build] STEP 7: RUN /usr/libexec/s2i/assemble
[build : build] /tmp/src ~
[build : build] ~
[build : build] 14074381c9c89dafd170d21f9e5905808ecbe572c65774bd0c3f3db650940b5a
[build : build] STEP 8: CMD /usr/libexec/s2i/run
[build : build] STEP 9: COMMIT image-registry.openshift-image-registry.svc:5000/kn-demo/dumpy
[build : build] cf7a757b4c3a59a3c8571b43de9bc01ec0f4a36f4db11597d9389db745555b50
[build : push] Getting image source signatures
[build : push] Copying blob sha256:08c4aa164cbaadfb32414e39d9b252a5382b9db1dd8e028fb11805074edbe608
[build : push] Copying blob sha256:49823a90179137e22fcd21aeabeb7b986cc1a1a368577a18125dbb7d7fdfbc5e
[build : push] Copying blob sha256:79078fe79bd38d7b89566544dc788f0080ed121121c846774033d93731732a0c
[build : push] Copying blob sha256:a551fb857b61df88ae64cded378611456294ee7143bc068eb3a9ee1a29934658
[build : push] Copying blob sha256:0ad3798cc88fadad4a391d25671685eb1c5e3714d1256eba133647aabaee76bc
[build : push] Copying blob sha256:c4ab366b65c5e7e2c77b7311575a5a62318eb862ed2846492c576a2a5318fc0b
[build : push] Copying blob sha256:7257654ef482b678e08febe660281e803a6c0e1f3f9c68ea2ce078b36d96a15a
[build : push] Copying blob sha256:71da8c1ba5badb93fb5ea4b2fee3de0f09b8635d397cc7c0ec72c17e09cfe476
[build : push] Copying config sha256:cf7a757b4c3a59a3c8571b43de9bc01ec0f4a36f4db11597d9389db745555b50
[build : push] Writing manifest to image destination
[build : push] Copying config sha256:cf7a757b4c3a59a3c8571b43de9bc01ec0f4a36f4db11597d9389db745555b50
[build : push] Writing manifest to image destination
[build : push] Storing signatures
[build : image-digest-exporter-vk4tr] {"level":"warn","ts":1576916688.3277884,"logger":"fallback-logger","caller":"logging/config.go:69","msg":"Fetch GitHub commit ID from kodata failed: \"KO_DATA_PATH\" does not exist or is empty"}
[build : image-digest-exporter-vk4tr] {"level":"info","ts":1576916688.3279572,"logger":"fallback-logger","caller":"imagedigestexporter/main.go:58","msg":"ImageResource application-image doesn't have an index.json file: stat /builder/home/image-outputs/image/index.json: no such file or directory"}
[deploy : oc] deploymentconfig.apps.openshift.io/dumpy rolled out
$ oc get is
NAME IMAGE REPOSITORY TAGS UPDATED
dumpy default-route-openshift-image-registry.apps.cluster-jinan-e485.jinan-e485.example.opentlc.com/kn-demo/dumpy latest 21 minutes ago
$ oc get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
dumpy dumpy-kn-demo.apps.cluster-jinan-e485.jinan-e485.example.opentlc.com dumpy 8080-tcp None
$ curl http://$(oc get route dumpy |awk 'NR==2 {print $2}')/health
888 888 888
888 888 888
888 888 888
888d888 .d88b. .d88888 88888b. 8888b. 888888
888P" d8P Y8bd88" 888 888 "88b "88b888
888 88888888888 888 888 888.d888888888
888 Y8b. Y88b 888 888 888888 888Y88b.
888 "Y8888 "Y88888 888 888"Y888888 "Y888
$ oc describe is dumpy
Name: dumpy
Namespace: kn-demo
Created: 2 hours ago
Labels: app=dumpy
Annotations: <none>
Image Repository: default-route-openshift-image-registry.apps-crc.testing/kn-demo/dumpy
Image Lookup: local=false
Unique Images: 1
Tags: 1
latest
no spec tag
. image-registry.openshift-image-registry.svc:5000/kn-demo/dumpy@sha256:9c5b1dc90f9b9fc54b1dec625251340d8b774e15bcad6664869c3db8529314f0
$ kn service create dumpy-serverless --image=image-registry.openshift-image-registry.svc:5000/kn-demo/dumpy -l app.kubernetes.io/name=golang
Creating service 'dumpy-serverless' in namespace 'kn-demo':
0.136s The Route is still working to reflect the latest desired specification.
0.161s Configuration "dumpy-serverless" is waiting for a Revision to become ready.
28.368s ...
28.551s Ingress has not yet been reconciled.
69.596s Ready to serve.
$ kn service list
NAME URL LATEST AGE CONDITIONS READY REASON
dumpy-serverless http://dumpy-serverless.kn-demo.apps-crc.testing dumpy-serverless-tbcvz-1 79m 3 OK / 3 True
$ oc get ksvc -n kn-demo
NAME URL LATESTCREATED LATESTREADY READY REASON
dumpy-serverless http://dumpy-serverless.kn-demo.apps-crc.testing dumpy-serverless-tbcvz-1 dumpy-serverless-tbcvz-1 True
$ kn revision list
NAME SERVICE GENERATION AGE CONDITIONS READY REASON
dumpy-serverless-tbcvz-1 dumpy-serverless 1 79m 3 OK / 4 True
$ oc get revision -n kn-demo
NAME CONFIG NAME K8S SERVICE NAME GENERATION READY REASON
dumpy-serverless-tbcvz-1 dumpy-serverless dumpy-serverless-tbcvz-1 1 True
$ kn route list
NAME URL READY
dumpy-serverless http://dumpy-serverless.kn-demo.apps-crc.testing True
$ oc get route.serving.knative.dev -n kn-demo
NAME URL READY REASON
dumpy-serverless http://dumpy-serverless.kn-demo.apps-crc.testing True
3. 访问dumpy-serverless应用的Route地址,验证应用是可以访问的。
$ kn route list
NAME URL READY
dumpy-serverless http://dumpy-serverless.kn-demo.apps-crc.testing True
$ curl $(kn route list -n dumpy-serverless |awk 'NR==2 {print $2}')/health
888 888 888
888 888 888
888 888 888
888d888 .d88b. .d88888 88888b. 8888b. 888888
888P" d8P Y8bd88" 888 888 "88b "88b888
888 88888888888 888 888 888.d888888888
888 Y8b. Y88b 888 888 888888 888Y88b.
888 "Y8888 "Y88888 888 888"Y888888 "Y888
$ oc idle dumpy
WARNING: idling when network policies are in place may cause connections to bypass network policy entirely
The service "kn-demo/dumpy" has been marked as idled
The service will unidle DeploymentConfig "kn-demo/dumpy" to 1 replicas once it receives traffic
DeploymentConfig "kn-demo/dumpy" has been idled
$ oc get pod -w
NAME READY STATUS RESTARTS AGE
deploy-pipeline-run-m65rw-build-zc926-pod-4c22ce 0/6 Completed 0 70m
deploy-pipeline-run-m65rw-deploy-wtz72-pod-6bf2ef 0/1 Completed 0 63m
dumpy-1-deploy 0/1 Completed 0 63m
$ curl http://$(oc get route dumpy |awk 'NR==2 {print $2}')/health
888 888 888
888 888 888
888 888 888
888d888 .d88b. .d88888 88888b. 8888b. 888888
888P" d8P Y8bd88" 888 888 "88b "88b888
888 88888888888 888 888 888.d888888888
888 Y8b. Y88b 888 888 888888 888Y88b.
888 "Y8888 "Y88888 888 888"Y888888 "Y888
$ curl $(kn route list -n dumpy-serverless |awk 'NR==2 {print $2}')/health
888 888 888
888 888 888
888 888 888
888d888 .d88b. .d88888 88888b. 8888b. 888888
888P" d8P Y8bd88" 888 888 "88b "88b888
888 88888888888 888 888 888.d888888888
888 Y8b. Y88b 888 888 888888 888Y88b.
888 "Y8888 "Y88888 888 888"Y888888 "Y888