网站首页 > 技术教程 正文
如果使用 Knative Serving 部署一个 Nginx 你可能会发现服务起来了,但是无法访问到 Nginx 中的服务。当然这不是 Nginx 的问题,这是因为 Knative 对 Container 的端口有要求。默认 Nginx 的服务端口是 80 ,而 Knative Serving queue 8012 默认是代理到容器的 8080 端口。所以如果业务容器监听的不是 8080 端口默认配置就不能对外暴露服务。
注:当然 如果想要监听多个端口也是不行的,虽然容器能够启动成功,都是无法通过 Service 暴露服务,从而无法通过 Istio gateway 暴露到外面,所以也就不能提供服务。
当你在查看上述 Spec 定义的时候你可能已经注意到了下面这两行注释。为什么会保留这几个端口呢?
下面我通过一张图来解释一下 Knative Serving 流量转发链路:
如上图所示,业务流量并不是从 Gateway 直接打到业务容器中的,而是经过 queue 容器转发的。queue 容器默认会监听 8012 和 8013 分别用于转发 http1 的流量和 http2 的流量。具体代码参见:
queue 容器在创建的时候会设定一个叫做 USER_PORT 的环境变量,queue 是通过这个环境变量来获取应该转发到业务容器的哪个端口的。所以只要我们能够修改 USER_PORT 这个环境变量我们就能自定义监听端口了。 USER_PORT 是通过 getUserPort 函数获取的,具体函数定义如下:
代码读到这里就已经很明朗了,创建 Knative Service 的时候可以指定 Ports 端口,然后可以通过端口的 containerPort 字段指定自定义端口。不过需要注意的是 Knative 只支持一个容器端口,所以虽然 Ports 是一个数组,但也只能设置一个。
实例如下:
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: wordpress-serving namespace: default spec: template: metadata: labels: app: wordpress annotations: autoscaling.knative.dev/target: "100" spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/wordpress:5.2-20190524100810 ports: - name: http1 containerPort: 80 env: - name: WORDPRESS_DB_HOST value: rm-2xx.mysql.rds.aliyuncs.com:3306 - name: WORDPRESS_DB_USER value: wordpress - name: WORDPRESS_DB_PASSWORD value: xxx imagePullPolicy: Always
上面在分析的过程中提到了 HTTP2 协议,如果当前提供的是 grpc 类型的服务就需要使用 http2 协议。
如果使用的是 HTTP2 协议那么也去请求就需要转发到 queue 的 8013 端口上,然后由 8013 转发给容器的业务端口。那么如何指定我们使用的协议呢?
在前面的分析中我们得出的结论是通过 port[0].containerPort 来指定自定义端口,其实也可以指定 port[0].name 字段。而 Revision Controller 生成 Deployment 部署服务的时候就是这个 name 字段来判断应该使用 http1(8012端口) 协议还是 http2(8013端口) 协议的。
- http1 代表使用 http1(8012端口) 协议,同时 http1 也是默认策略,也就是说如果未指定那么默认也是 http1 协议
- h2c 代表使用 http2(8013端口) 协议
代码分析如下:
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: http1 containerPort: 80
- name 字段表示使用的协议,有效值有 http1 和 h2c 两个,其中:
- http1 表示使用 http1 协议,比如 web 服务和 websock 都可以使用 http1
- grpc 需要设置成 h2c
- containerPort 字段就是容器提供服务的唯一端口。业务端口可以设置 1-65535 这个范围中除了 8012、8013、8022、8091 和 8092 以外的任意端口
阿里云双11亿元补贴提前领,进入抽取iPhone 11 Pro:https://www.aliyun.com/1111/2019/home?utm_content=g_1000083110
作者:冬岛
猜你喜欢
- 2024-10-11 KUBERNETES的六种端口(kubernetes hostport)
- 2024-10-11 漫画:Apache Nginx80 端口争夺战(apache服务器的默认端口是)
- 2024-10-11 Nginx处理redirect 端口丢失的问题
- 2024-10-11 kubernetes nginx ingress 部署开放不同端口应用
- 2024-09-21 kubectl常用命令(二)(kubectl 命令)
- 2024-09-21 Nginx服务器-抓包分析反向代理跳转地址
- 2024-09-21 SpringCloud微服务笔记-Nginx实现网关反向代理
- 2024-09-21 将kafka集群端口映射到公网访问(kafka集群使用)
- 2024-09-21 Linux查看被占用的端口(linux 查看端口占用被哪个进程占用)
- 2024-09-21 nginx怎么配置默认端口(nginx怎么配置默认端口命令)
你 发表评论:
欢迎- 最近发表
-
- Linux新手必看:几种方法帮你查看CPU核心数量
- linux基础命令之lscpu命令(linux中ls命令的用法)
- Linux lscpu 命令使用详解(linux常用ls命令)
- 如何查询 Linux 中 CPU 的数量?这几个命令要知道!
- 在linux上怎么查看cpu信息(linux如何查看cpu信息)
- 查看 CPU 的命令和磁盘 IO 的命令
- 如何在CentOS7上改变网卡名(centos怎么改网卡名字)
- 网工必备Linux网络管理命令(网工必备linux网络管理命令是什么)
- Linux 网络命令知多少(linux 网络 命令)
- Linux通过命令行连接wifi的方式(linux命令行连接无线网)
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)