Knative Service 是如何指定端口和协议的
如果使用 Knative Serving 部署一個 Nginx 你可能會發(fā)現服務起來了,但是無法訪問到 Nginx 中的服務。當然這不是 Nginx 的問題,這是因為 Knative 對 Container 的端口有要求。默認 Nginx 的服務端口是 80 ,而 Knative Serving queue 8012 默認是代理到容器的 8080 端口。所以如果業(yè)務容器監(jiān)聽的不是 8080 端口默認配置就不能對外暴露服務。
注:當然 如果想要監(jiān)聽多個端口也是不行的,雖然容器能夠啟動成功,都是無法通過 Service 暴露服務,從而無法通過 Istio gateway 暴露到外面,所以也就不能提供服務。
當你在查看上述 Spec 定義的時候你可能已經注意到了下面這兩行注釋。為什么會保留這幾個端口呢?
下面我通過一張圖來解釋一下 Knative Serving 流量轉發(fā)鏈路:
如上圖所示,業(yè)務流量并不是從 Gateway 直接打到業(yè)務容器中的,而是經過 queue 容器轉發(fā)的。queue 容器默認會監(jiān)聽 8012 和 8013 分別用于轉發(fā) http1 的流量和 http2 的流量。具體代碼參見:
queue 容器在創(chuàng)建的時候會設定一個叫做 USER_PORT 的環(huán)境變量,queue 是通過這個環(huán)境變量來獲取應該轉發(fā)到業(yè)務容器的哪個端口的。所以只要我們能夠修改 USER_PORT 這個環(huán)境變量我們就能自定義監(jiān)聽端口了。 USER_PORT 是通過 getUserPort 函數獲取的,具體函數定義如下:
代碼讀到這里就已經很明朗了,創(chuàng)建 Knative Service 的時候可以指定 Ports 端口,然后可以通過端口的 containerPort 字段指定自定義端口。不過需要注意的是 Knative 只支持一個容器端口,所以雖然 Ports 是一個數組,但也只能設置一個。
實例如下:
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata:name: wordpress-servingnamespace: default spec:template:metadata:labels:app: wordpressannotations:autoscaling.knative.dev/target: "100"spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/wordpress:5.2-20190524100810ports:- name: http1containerPort: 80env:- name: WORDPRESS_DB_HOSTvalue: rm-2xx.mysql.rds.aliyuncs.com:3306- name: WORDPRESS_DB_USERvalue: wordpress- name: WORDPRESS_DB_PASSWORDvalue: xxximagePullPolicy: Always上面在分析的過程中提到了 HTTP2 協(xié)議,如果當前提供的是 grpc 類型的服務就需要使用 http2 協(xié)議。
如果使用的是 HTTP2 協(xié)議那么也去請求就需要轉發(fā)到 queue 的 8013 端口上,然后由 8013 轉發(fā)給容器的業(yè)務端口。那么如何指定我們使用的協(xié)議呢?
在前面的分析中我們得出的結論是通過 port[0].containerPort 來指定自定義端口,其實也可以指定 port[0].name 字段。而 Revision Controller 生成 Deployment 部署服務的時候就是這個 name 字段來判斷應該使用 http1(8012端口) 協(xié)議還是 http2(8013端口) 協(xié)議的。
- http1 代表使用 http1(8012端口) 協(xié)議,同時 http1 也是默認策略,也就是說如果未指定那么默認也是 http1 協(xié)議
- h2c 代表使用 http2(8013端口) 協(xié)議
代碼分析如下:
https://github.com/kubedemo/serving/blob/release-0.6/pkg/apis/serving/v1alpha1/revision_lifecycle.go#L104
?
那么怎樣才能指定容器的自定義端口呢?通過查閱代碼可知
https://github.com/kubedemo/serving/blob/release-0.6/pkg/reconciler/serverlessservice/resources/services.go#L32
小結
Knative Service 可以給容器添加 ports 字段,并且 ports 只能設置一個端口。ports 有兩個關鍵字段 Name 和 ContainerPort
ports:- name: http1containerPort: 80-
name 字段表示使用的協(xié)議,有效值有 http1 和 h2c 兩個,其中:
- http1 表示使用 http1 協(xié)議,比如 web 服務和 websock 都可以使用 http1
- grpc 需要設置成 h2c
- containerPort 字段就是容器提供服務的唯一端口。業(yè)務端口可以設置 1-65535 這個范圍中除了 8012、8013、8022、8091 和 8092 以外的任意端口
阿里云雙11億元補貼提前領,進入抽取iPhone 11 Pro:https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110
原文鏈接
本文為云棲社區(qū)原創(chuàng)內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的Knative Service 是如何指定端口和协议的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 时尚电商新赛道:揭秘 FashionAI
- 下一篇: 应用架构的核心使命是什么?阿里高级技术专