不知大家在写deployment yaml文件的时候会不会主动地定义port字段, 相信在最开始的时候有很多同学会跟我一样对deployment中的port字段有些疑惑, 不是有service吗? 在deployment中为何还存在port的定义呢?
最简的deployment
1 | apiVersion: apps/v1 |
service
1 | apiVersion: v1 |
deployment中的port对应用端口有什么影响呢?, 如果这里的端口与service的端口不一样又该如何呢?
首先来看一下deployment关于port部分的说明:
1 | List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated |
大概的意思就是: 列举容器中需要暴露的端口列表, 但是只做起着信息说明的作用, 并不能影响端口真正暴露端口.
我们来测试一下如果deployment中的端口与service中定义的端口不一样会有什么影响?
1 | # curl clusterip port(6379) -- 正常 |
所以可以看到, **虽然在deployment中指定了port, 但这个端口只是用于起着提示类作用,也就是说deployment可以随便指定端口, 但是为了友好的告诉其它人这个应用的监听端口,所以会在deployment中指定端口列表 **
这个跟dockerfile中使用expose
来暴露端口一样, 虽然是叫暴露,也只是起着告诉别人这个应用对外监听的端口,实际上对应用真正暴露端口并没有直接关系.
在rancher中部署应用的时, 很人性化的有多种类型让我们选择
- NodePort: 所有node节点上都会开启这个端口来接收请求然后转发到这个应用上
- HostPort: 跟使用–network=host类似, 通过应用最终部署到的host上接收请求然后转发到应用上
- CLUSTERIP: service模式
- layer-4 load balancer: 这种不常用
rancher上部署应用会直接创建对应的service, 而且会在deployment中记录ports的相关信息, 还是很方便的.
1 | ... |