天天看点

OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless

《OpenShift 4.x HOL教程汇总》

在完成了《OpenShift 4 之Knative(1) - 创建Knative无服务器架构环境》后,我们部署一个基于Knative的Serverless应用。本文先部署一个Serverless应用(dumpy-servless)。作为对比,然后部署一个非Serverless应用(dumpy),最后对比两个应用的运行效果。

文章目录

  • 安装OpenShift Pipelines Operator
  • 部署非Serverless应用(dumpy)
  • 部署Knative Serverless应用(dumpy-serverless)\
  • 对比dumpy与dumpy-serverless

安装OpenShift Pipelines Operator

由于以下应用是通过Tekton部署的,因此首先需要安装并配置OpenShift Pipelines Operator。这部分请参照《OpenShift 4 之基于Tekton的Pipeline入门》中的“安装OpenShift Pipelines Operator”章节完成即可。

部署非Serverless应用(dumpy)

  1. 创建项目和权限
$ 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
           
  1. 为Tekton创建openshift-client的Task和go S2I的Task。
$ 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
           
  1. 创建应用资源、Pipeline以及PipelineRource资源,然后查看这些资源。
$ 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
           
  1. 启动运行Tekton Pipeline,然后查看其运行情况和日志。
$ 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
           
  1. 还可在OpenShift Console的Developer视图中看到以下Pipelines中的deploy-pipeline运行状态和运行日志。
    OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless
    OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless
    OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless
    OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless
  2. 在Pipeline完成运行后,查看其生成的ImageStream。
$ 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
           
  1. 访问dumpy应用的Route地址,验证应用是可以访问的。
$ 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
           

部署Knative Serverless应用(dumpy-serverless)\

  1. 基于上一步生成的dumpy的ImageStream创建名为dumpy-serverless的Knative的Service。
$ 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/[email protected]: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.
           
  1. 用OpenShift Console的Administrator或命令行查看Knative相关资源的状态。

    其中“kn service list”命令等同“oc get ksvc”命令;"kn revision list”命令等同“oc get revision”命令;“kn route list”命令等同

$ 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    
           
OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless
OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless
OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless

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
           

对比dumpy与dumpy-serverless

  1. 将运行dumpy应用的Pod减到“0”个:
$ 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
           
  1. 此时查看运行dumpy应用与dumpy-serverless应用的Pod情况。注意2个应用都没有对应的Pod,其中dumpy是手工减到“0”的,而dumpy-serverless是Knative自动减到"0"的。
$ 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
           
  1. 此时在OpenShift Console的Developer视图的Toplogy看到的是下图状态:
    OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless
  2. 执行命令分别访问dumpy应用与dumpy-serverless应用。
$ 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
           
  1. 用(2)持续监控Pod的情况,其中运行dumpy应用的Pod在增加到"1"后不会自动减到“0”,而dumpy-servless的应用在响应用户请求后会自动减到“0”。此时在OpenShift Console上确认dumpy-servless应用的状态如下图。
    OpenShift 4 之Knative(2) - 第一个Serverless应用安装OpenShift Pipelines Operator部署非Serverless应用(dumpy)部署Knative Serverless应用(dumpy-serverless)\对比dumpy与dumpy-serverless

继续阅读