如果使用 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-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 协议,如果当前提供的是 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: http1containerPort: 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

原文链接
本文为云栖社区原创内容,未经允许不得转载。

Knative Service 是如何指定端口和协议的相关推荐

  1. nginx 端口转发_Knative Service 是如何指定端口和协议的

    如果使用 Knative Serving 部署一个 Nginx 你可能会发现服务起来了,但是无法访问到 Nginx 中的服务.当然这不是 Nginx 的问题,这是因为 Knative 对 Contai ...

  2. Centos7防火墙开放/关闭指定端口

    目录 1. 前提条件 2. 开启防火墙 3. 开放指定端口 4. 关闭指定端口 5. 其他命令 1. 前提条件 防火墙是开启状态 2. 开启防火墙 1)查看防火墙状态 [root@afanty bin ...

  3. python通过端口和协议查出服务名

    通过指定的端口和协议找到服务名如果想找到网络服务,最好知道该服务运行在TCP或UDP协议的哪个端口上.如果知道网络服务使用的端口可以调用socket库中的getservbyport()函数来获取服务的 ...

  4. 利用iptables来配置linux禁止所有端口登陆和开放指定端口

    原文地址:http://www.2cto.com/Article/201109/103089.html 利用iptables来配置linux禁止所有端口登陆和开放指定端口 1.关闭所有的 INPUT ...

  5. 服务器的防火墙禁止了对指定通讯端口的访问,使用iptables限制访问网站指定端口...

    Linux用得比较少,所以对iptables也不是很熟悉,最近部署网站,因为对外的80端口是通过nginx转发,而内部程序都是类似8080.3000之类的端口,不做处理的情况下,很可能会看到如:地址w ...

  6. erlang的epmd指定端口范围验证及端口权限配置

    2019独角兽企业重金招聘Python工程师标准>>> erlang的epmd指定端口范围验证及端口权限配置 1,简介 erlang的原理与linux系统非常像,有进程的概念,有进程 ...

  7. linux禁止软件连接指定网站,利用iptables来配置linux禁止所有端口登陆和开放指定端口...

    1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放. 下面是命令实现: iptables -P INPUT DROP iptables -P FORWARD DROP ipta ...

  8. Linux主机开放指定端口

    背景 一般我们的项目开发完成之后,都会部署到相应的测试环境或者生产环境.有的时候会出现我们的应用程序在linux主机上已经正常启动了,但是本地还是无法连接访问. 出现这种情况的原因一般是如下两种: 主 ...

  9. centos打开指定端口(443),Linux防火墙状态查看的方法

    1.防火墙基本操作 #查看防火墙是否开启(如果显示running,则防火墙为开启状态): firewall-cmd --state#关闭防火墙: systemctl stop firewalld.se ...

最新文章

  1. ffmpeg text relocations
  2. 锚杆拉拔试验弹性模量计算_土钉、锚杆拉拔试验检测方案 - 图文 -
  3. 你可能不知道的Python面试秘籍 干货满满(附带参考答案)上篇
  4. 机器学习——相似度算法汇总
  5. Keil5配置GCC编译器编译STM32工程
  6. 苹果华人工程师被捕后续,按“商业间谍”指控,本人不认罪
  7. 2018年AI如何发展?普华永道做出了8点预测 | 报告下载
  8. 外点罚函数matlab程序_关于图像轮廓识别的程序实现
  9. 用PHP写距离圣诞节还有多久,距离圣诞节还有多少天
  10. ADS(Advanced Design system)仿真对电路进行阻抗匹配
  11. Android开机自动循环播放视频
  12. 数加加众包:奔驰“哭诉维权”美女硕士,你“不要脸”的样子真的很美
  13. 猜数字小游戏(网页版)
  14. 黑客利用雅虎通好友列表发动钓鱼攻击
  15. mysql怎么加载bak文件_bak是什么文件格式,bak文件怎么打开? mysql 在服务器里备份(直接拷贝数据文件)-宝商在线...
  16. Java学习之路--计算圆形的面积和周长
  17. 区块链重构零售价值体系 | 苏宁区块链技术应用论坛
  18. HTML商品详情页(简单页面)
  19. matlab设计激光腔,基于Matlab软件的激光谐振腔振荡模式.doc
  20. 游戏音频三要素:响度、音调、音色

热门文章

  1. java在线网页客服聊天_管理员消息java 网站用户在线和客服聊天
  2. wp自定义帖子没标签_ofollow标签的作用有重大变化
  3. linux伙伴系统接口,Linux伙伴系统(一)--伙伴系统的概述
  4. C++ STL 容器的一些总结 --- set(multiset)和map(multimap)
  5. 云科技网络验证源码_面向虚拟化架构和容器云的开源安全工具
  6. linux 普通用户touch权限不够_Linux 开启指令
  7. tabulate matlab,matlab中用于统计矩阵数据频率,出现次数的函数
  8. Java实例化后自动执行_Java的实例化顺序(程序执行顺序)
  9. 正交变换在基下的矩阵都是可逆阵_矩阵分析与应用(一,矩阵基础知识)
  10. hashmap 扩容是元素还是数组_曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?...