OpenShift 4.3 之Knative-Tutorial(2) 部署Hello應用並基於Revision/Tag/Traffic實現藍綠部署和恢復發佈

部署並測試Hello的Serverless應用

  1. 創建knative-demo項目。
$ oc new-project knative-demo
  1. 部署Knative的Hello應用。其中“–env TARGET=Knative”是將字符串傳給TARGET環境變量。
$ kn service create hello --image gcr.io/knative-samples/helloworld-go --env TARGET=Knative
Creating service 'hello' in namespace 'knative-demo':
 
  0.296s The Route is still working to reflect the latest desired specification.
  0.393s Configuration "hello" is waiting for a Revision to become ready.
 33.138s ...
 33.369s Ingress has not yet been reconciled.
 33.466s Configuration "hello" is waiting for a Revision to become ready.
 33.543s Ingress has not yet been reconciled.
 74.629s Ready to serve.
 
Service 'hello' created with latest revision 'hello-nvhqs-1' and URL:
http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
  1. 查看Knative的Service對象列表。
$ kn service list
NAME    URL                                                                                      LATEST          AGE    CONDITIONS   READY   REASON
hello   http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com   hello-nvhqs-1   2m4s   3 OK / 3     True
  1. 查看knative-demo項目中的所有資源,其中包括Knative的configuration、service、revision、route對象,還有OpenShift的service、deployment、rs對象。注意:當前項目中還沒有pod資源。
$ oc get all -n knative-demo
NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP                                                       PORT(S)                             AGE
service/hello                   ExternalName   <none>           cluster-local-gateway.knative-serving-ingress.svc.cluster.local   <none>                              10m
service/hello-nvhqs-1           ClusterIP      172.30.69.130    <none>                                                            80/TCP                              10m
service/hello-nvhqs-1-private   ClusterIP      172.30.125.146   <none>                                                            80/TCP,9090/TCP,9091/TCP,8022/TCP   10m
 
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-nvhqs-1-deployment   0/0     0            0           10m
 
NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-nvhqs-1-deployment-66db57b95f   0         0         0       10m
 
NAME                                         CONFIG NAME   K8S SERVICE NAME   GENERATION   READY   REASON
revision.serving.knative.dev/hello-nvhqs-1   hello         hello-nvhqs-1      1            True
 
NAME                                      LATESTCREATED   LATESTREADY     READY   REASON
configuration.serving.knative.dev/hello   hello-nvhqs-1   hello-nvhqs-1   True
 
NAME                              URL                                                                                      READY   REASON
route.serving.knative.dev/hello   http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com   True
 
NAME                                URL                                                                                      LATESTCREATED   LATESTREADY     READY   REASON
service.serving.knative.dev/hello   http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com   hello-nvhqs-1   hello-nvhqs-1   True
  1. 在OpenShift Console中進入knative-demo的Developer視圖,可以看到和hello應用相關的資源。
    在這裏插入圖片描述
  2. 訪問hello應用的地址,確認可以返回“Hello Knative!”,其中“Knative”爲傳進去的環境變量。
$ curl $(oc get ksvc hello | grep hello | awk '{print $2}')
Hello Knative!
  1. 此時立即執行以下命令,確認此時可以查看項目在運行的Pod資源。不過在一分鐘以後會又看不到Pod了。
$ oc get pod
NAME                                          READY   STATUS    RESTARTS   AGE
pod/hello-rfgt4-1-deployment-a0cd0125-cfvny   2/2     Running   0          22s
  1. 更新名爲hello的service的環境變量內容。
$ kn service update hello --env TARGET=Kn
Updating Service 'hello' in namespace 'knative-demo':
 
 10.760s Traffic is not yet migrated to the latest revision.
 10.871s Ingress has not yet been reconciled.
 12.231s Ready to serve.
 
Service 'hello' updated with latest revision 'hello-cfvny-2' and URL:
http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
  1. 訪問hello應用的地址,確認可以返回結果已經變化。
$ curl $(oc get ksvc hello | grep hello | awk '{print $2}')
Hello Kn!
  1. 查看項目所有資源,確認OpenShift的deployment、rs對象和Knative的revision對象都已經有了一個新版的配置。
$ oc get all
NAME                                          READY   STATUS    RESTARTS   AGE
pod/hello-cfvny-2-deployment-d4cd7655-rfgt4   2/2     Running   0          22s
 
NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP                                                       PORT(S)                             AGE
service/hello                   ExternalName   <none>           cluster-local-gateway.knative-serving-ingress.svc.cluster.local   <none>                              5h6m
service/hello-cfvny-2           ClusterIP      172.30.69.131    <none>                                                            80/TCP                              6m22s
service/hello-cfvny-2-private   ClusterIP      172.30.64.141    <none>                                                            80/TCP,9090/TCP,9091/TCP,8022/TCP   6m22s
service/hello-nvhqs-1           ClusterIP      172.30.69.130    <none>                                                            80/TCP                              5h6m
service/hello-nvhqs-1-private   ClusterIP      172.30.125.146   <none>                                                            80/TCP,9090/TCP,9091/TCP,8022/TCP   5h6m
  
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-cfvny-2-deployment   1/1     1            1           6m22s
deployment.apps/hello-nvhqs-1-deployment   0/0     0            0           5h6m
 
NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-cfvny-2-deployment-d4cd7655     1         1         1       6m22s
replicaset.apps/hello-nvhqs-1-deployment-66db57b95f   0         0         0       5h6m
 
NAME                                      LATESTCREATED   LATESTREADY     READY   REASON
configuration.serving.knative.dev/hello   hello-cfvny-2   hello-cfvny-2   True
  
NAME                                         CONFIG NAME   K8S SERVICE NAME   GENERATION   READY   REASON
revision.serving.knative.dev/hello-cfvny-2   hello         hello-cfvny-2      2            True
revision.serving.knative.dev/hello-nvhqs-1   hello         hello-nvhqs-1      1            True
 
NAME                                URL                                                                                      LATESTCREATED   LATESTREADY     READY   REASON
service.serving.knative.dev/hello   http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com   hello-cfvny-2   hello-cfvny-2   True
 
NAME                              URL                                                                                      READY   REASON
route.serving.knative.dev/hello   http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com   True

藍綠部署和恢復發佈

  1. 查看名爲hello的service詳細信息。確認最新的revision(hello-cfvny-2)接收了100%的請求。
$ kn service describe hello
Name:       hello
Namespace:  knative-demo
Age:        5h
URL:        http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
 
Revisions:
  100%  @latest (hello-cfvny-2) [2] (2m)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
 
Conditions:
  OK TYPE                   AGE REASON
  ++ Ready                   2m
  ++ ConfigurationsReady     2m
  ++ RoutesReady             2m
  1. 查看Knative的revision對象。確認結果和上面(10)看到的項目包括的revision一樣。
$ kn revision list
NAME            SERVICE   GENERATION   AGE     CONDITIONS   READY   REASON
hello-cfvny-2   hello     2            45m     3 OK / 4     True
hello-nvhqs-1   hello     1            5h46m   3 OK / 4     True
  1. 執行命令,通過指定–traffic參數,將請求按照revision名稱平均發給以上2個revision。
$ kn service update hello --traffic @latest=50 --traffic hello-nvhqs-1=50
Updating Service 'hello' in namespace 'knative-demo':
 
  0.066s The Route is still working to reflect the latest desired specification.
  0.090s Ingress has not yet been reconciled.
  1.450s Ready to serve.
 
Service 'hello' updated with latest revision 'hello-cfvny-2' (unchanged) and URL:
http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
  1. 查看Knative的service對象,確認配置修改爲2個revision各自接收50%的請求。
$ kn service describe hello
Name:       hello
Namespace:  knative-demo
Age:        5h
URL:        http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
 
Revisions:
   50%  @latest (hello-cfvny-2) [2] (41m)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
   50%  hello-nvhqs-1 [1] (5h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
 
Conditions:
  OK TYPE                   AGE REASON
  ++ Ready                   6m
  ++ ConfigurationsReady    41m
  ++ RoutesReady             6m
  1. 在OpenShift控制檯的Developer視圖中可以看到名爲hello的Knative Service的Topology。
    在這裏插入圖片描述
  2. 點擊上圖的Set Traffic Distribution按鈕,可以在彈出窗口中可以爲不同的Revision分配流量比例。
    在這裏插入圖片描述
  3. 多次訪問hello應用,確認返回結果部分是“Hello Knative!”、部分是“Hello Kn!”。
$ curl $(oc get ksvc hello | grep hello | awk '{print $2}')
Hello Knative!
$ curl $(oc get ksvc hello -ojsonpath={.status.url})
Hello Kn!
  1. 除了像(13)那樣,我們還可以爲revision打tag,然後在指定–traffic參數的時候使用tag名稱區分revision。執行以下命令,給hello-cfvny-2和hello-nvhqs-1打tag。
$ kn service update hello --tag hello-cfvny-2=latest,hello-nvhqs-1=stable
Updating Service 'hello' in namespace 'knative-demo':
 
  0.033s The Route is still working to reflect the latest desired specification.
  0.174s Ingress has not yet been reconciled.
  1.608s Ready to serve.
 
Service 'hello' updated with latest revision 'hello-cfvny-2' (unchanged) and URL:
http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
  1. 查看hello的Knative Service信息,確認hello-cfvny-2和hello-nvhqs-1都有了tag。
$ kn service describe hello
Name:       hello
Namespace:  knative-demo
Age:        10h
URL:        http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
 
Revisions:
   50%  @latest (hello-cfvny-2) [2] (5h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
     +  hello-cfvny-2 (current @latest) #latest [2] (5h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
   50%  hello-nvhqs-1 #stable [1] (10h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
  1. 執行以下命令,再給2個revsion打tag。
$ kn service update hello --tag hello-cfvny-2=v2,hello-nvhqs-1=v1
Updating Service 'hello' in namespace 'knative-demo':
 
  0.158s The Route is still working to reflect the latest desired specification.
  0.326s Ingress has not yet been reconciled.
  1.500s Ready to serve.
  
Service 'hello' updated with latest revision 'hello-cfvny-2' (unchanged) and URL:
http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
  1. 看hello的Knative Service信息,確認hello-cfvny-2和hello-nvhqs-1都多了新的tag。
$ kn service describe hello
Name:       hello
Namespace:  knative-demo
Age:        10h
URL:        http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
 
Revisions:
   50%  @latest (hello-cfvny-2) [2] (5h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
     +  hello-cfvny-2 (current @latest) #latest [2] (5h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
     +  hello-cfvny-2 (current @latest) #v2 [2] (5h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
   50%  hello-nvhqs-1 #stable [1] (10h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
     +  hello-nvhqs-1 #v1 [1] (10h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
  1. 根據revision的tag分配流量。
$ kn service update hello --traffic v1=10,v2=90
Updating Service 'hello' in namespace 'knative-demo':

  0.091s The Route is still working to reflect the latest desired specification.
  0.195s Ingress has not yet been reconciled.
  2.020s Ready to serve.
 
Service 'hello' updated with latest revision 'hello-cfvny-2' (unchanged) and URL:
http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
  1. 查看hello的Knative Serivce的配置,確認流量分配。
$ kn service describe hello
Name:       hello
Namespace:  knative-demo
Age:        10h
URL:        http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com
 
Revisions:
     +  hello-cfvny-2 (current @latest) #latest [2] (5h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
   90%  hello-cfvny-2 (current @latest) #v2 [2] (5h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
     +  hello-nvhqs-1 #stable [1] (10h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
   10%  hello-nvhqs-1 #v1 [1] (10h)
        Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)
  1. 再次查看項目中的所有資源。我們可以從對應關係上看到每個Knative Revision對象對應一個OpenShift Deployment對象;每個實際的Knative Revision對應二個OpenShift Service對象(例如service/hello-cfvny-2和service/hello-cfvny-2-private);每個Knative Revision的Tag會對應一個OpenShift Service對象。
$ oc get all
NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP                                                       PORT(S)                             AGE
service/hello                   ExternalName   <none>           cluster-local-gateway.knative-serving-ingress.svc.cluster.local   <none>                              29h
service/hello-cfvny-2           ClusterIP      172.30.69.131    <none>                                                            80/TCP                              24h
service/hello-cfvny-2-private   ClusterIP      172.30.64.141    <none>                                                            80/TCP,9090/TCP,9091/TCP,8022/TCP   24h
service/hello-nvhqs-1           ClusterIP      172.30.69.130    <none>                                                            80/TCP                              29h
service/hello-nvhqs-1-private   ClusterIP      172.30.125.146   <none>                                                            80/TCP,9090/TCP,9091/TCP,8022/TCP   29h
service/latest-hello            ExternalName   <none>           cluster-local-gateway.knative-serving-ingress.svc.cluster.local   <none>                              19h
service/stable-hello            ExternalName   <none>           cluster-local-gateway.knative-serving-ingress.svc.cluster.local   <none>                              19h
service/v1-hello                ExternalName   <none>           cluster-local-gateway.knative-serving-ingress.svc.cluster.local   <none>                              19h
service/v2-hello                ExternalName   <none>           cluster-local-gateway.knative-serving-ingress.svc.cluster.local   <none>                              19h
 
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-cfvny-2-deployment   0/0     0            0           24h
deployment.apps/hello-nvhqs-1-deployment   0/0     0            0           29h
 
NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-cfvny-2-deployment-d4cd7655     0         0         0       24h
replicaset.apps/hello-nvhqs-1-deployment-66db57b95f   0         0         0       29h
 
NAME                                         CONFIG NAME   K8S SERVICE NAME   GENERATION   READY   REASON
revision.serving.knative.dev/hello-cfvny-2   hello         hello-cfvny-2      2            True
revision.serving.knative.dev/hello-nvhqs-1   hello         hello-nvhqs-1      1            True
 
NAME                                URL                                                                                      LATESTCREATED   LATESTREADY     READY   REASON
service.serving.knative.dev/hello   http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com   hello-cfvny-2   hello-cfvny-2   True
 
NAME                              URL                                                                                      READY   REASON
route.serving.knative.dev/hello   http://hello.knative-demo.apps.cluster-shanghai-3d3e.shanghai-3d3e.example.opentlc.com   True
 
NAME                                      LATESTCREATED   LATESTREADY     READY   REASON
configuration.serving.knative.dev/hello   hello-cfvny-2   hello-cfvny-2   True
  1. 先刪除一個Knative Revision對象,然後再查看項目中的Revision對象列表,發現相同名稱的Revsion又被創建出來,說明Revision對象是由OpenShift Deployment對象控制的。
$ kn revision delete hello-cfvny-2
$ kn revision list
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章