做者 | 冬島 阿里雲容器平臺工程師git
導讀:雖說 Knative 默認就支持 WebSocket 和 gRPC,但在使用中會發現,有時想要把本身的 WebSocket 或 gRPC 部署到 Knative 中,仍是存在各類不順利。雖然最後排查發現,大可能是本身的程序問題或是配置錯誤致使的。本文分別給出了一個 WebSocket 和 gRPC 的例子,當須要在生產或者測試環境部署相關服務時,可使用本文給出的示例進行 Knative 服務的測試。github
若是本身手動的配置 Istio Gateway 支持 WebSocket 就須要開啓 websocketUpgrade
功能。但使用 Knative Serving 部署其實就自帶了這個能力。本示例的完整代碼放在 https://github.com/knative-sample/websocket-chat ,這是一個基於 WebSocket 實現的羣聊的例子。web
使用瀏覽器鏈接到部署的服務中就能夠看到一個接收信息的窗口和發送信息的窗口。當你發出一條信息之後全部鏈接進來的用戶都能收到你的消息。因此你可使用兩個瀏覽器窗口分別鏈接到服務中,一個窗口發送消息一個窗口接收消息,以此來驗證 WebSocket 服務是否正常。docker
本示例是在 gorilla/websocket 基礎之上進行了一些優化:api
service.yaml
),你能夠直接提交到 Knative 集羣中使用registry.cn-hangzhou.aliyuncs.com/knative-sample/websocket-chat:2019-10-15
Knative Service 配置:瀏覽器
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: websocket-chat spec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/websocket-chat:2019-10-15 ports: - name: http1 containerPort: 8080
代碼 clone 下來之後執行 kubectl apply -f service.yaml
把服務部署到 Knative 中,而後直接訪問服務地址便可使用。websocket
查看 ksvc 列表,並獲取訪問域名。app
└─# kubectl get ksvc NAME URL LATESTCREATED LATESTREADY READY REASON websocket-chat http://websocket-chat.default.serverless.kuberun.com websocket-chat-7ghc9 websocket-chat-7ghc9 True
如今使用瀏覽器打開 http://websocket-chat.default.serverless.kuberun.com 便可看到羣聊窗口。less
打開兩個窗口,在其中一個窗口發送一條消息,另一個窗口經過 WebSocket 也收到了這條消息。socket
gRPC 不能經過瀏覽器直接訪問,須要經過 client 端和 server 端進行交互。本示例的完整代碼放在 https://github.com/knative-sample/grpc-ping-go ,本示例會給一個能夠直接使用的鏡像,測試 gRPC 服務。
Knative Service 配置:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: grpc-ping spec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/grpc-ping-go:2019-10-15 ports: - name: h2c containerPort: 8080
代碼 clone 下來之後執行 kubectl apply -f service.yaml
把服務部署到 Knative 中。
獲取 ksvc 列表和訪問域名:
└─# kubectl get ksvc NAME URL LATESTCREATED LATESTREADY READY REASON grpc-ping http://grpc-ping.default.serverless.kuberun.com grpc-ping-p2tft Unknown RevisionMissing websocket-chat http://websocket-chat.default.serverless.kuberun.com websocket-chat-6hgld websocket-chat-6hgld True
如今咱們已經知道 gRPC server 的地址是 grpc-ping.default.serverless.kuberun.com,端口是 80,那麼咱們能夠發起測試請求:
└─# docker run --rm registry.cn-hangzhou.aliyuncs.com/knative-sample/grpc-ping-go:2019-10-15 /client -server_addr="grpc-ping.default.serverless.kuberun.com:80" -insecure 2019/10/16 11:35:07 Ping got hello - pong 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854794231 +0800 CST m=+73.061909052 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854827273 +0800 CST m=+73.061942072 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854835802 +0800 CST m=+73.061950606 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854842843 +0800 CST m=+73.061957643 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854849211 +0800 CST m=+73.061964012 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854855249 +0800 CST m=+73.061970049 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854861659 +0800 CST m=+73.061976460 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854875071 +0800 CST m=+73.061989873 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854905416 +0800 CST m=+73.062020221 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.85491183 +0800 CST m=+73.062026630 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.85492533 +0800 CST m=+73.062040133 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854932285 +0800 CST m=+73.062047083 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854946977 +0800 CST m=+73.062061782 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854953311 +0800 CST m=+73.062068112 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854966639 +0800 CST m=+73.062081440 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854973939 +0800 CST m=+73.062088739 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854985463 +0800 CST m=+73.062100268 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854993275 +0800 CST m=+73.062108073 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.854999812 +0800 CST m=+73.062114613 2019/10/16 11:35:07 Got pong 2019-10-16 11:35:07.855012676 +0800 CST m=+73.062127479
本文經過兩個例子分別展現了 WebSocket 和 gRPC 的部署方法:
做者簡介:
冬島,阿里雲容器平臺工程師,負責阿里雲容器平臺 Knative 相關工做。
瞭解更多 ACK 詳情:https://www.aliyun.com/product/kubernetes
「 阿里巴巴雲×××icloudnative×××erverless、容器、Service Mesh等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發×××