Z.S.K.'s Records

Kubernetes学习(关于deployment中的port定义)

不知大家在写deployment yaml文件的时候会不会主动地定义port字段, 相信在最开始的时候有很多同学会跟我一样对deployment中的port字段有些疑惑, 不是有service吗? 在deployment中为何还存在port的定义呢?

最简的deployment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: kua100201
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
strategy: {}
template:
metadata:
labels:
app: redis
spec:
containers:
- image: redis
name: redis
ports:
- containerPort: 16379 # here
resources: {}
status: {}

service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
labels:
app: redis
service: redis
name: ratings
namespace: default
spec:
ports:
- name: http
port: 6379
selector:
app: redis
status:
loadBalancer: {}

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
2
3
# curl clusterip port(6379) -- 正常
# curl podip + port(6379) -- 正常
# curl podip + 16379 --curl: (7) Failed to connect to 10.244.0.104 port 16379: Connection refused

所以可以看到, **虽然在deployment中指定了port, 但这个端口只是用于起着提示类作用,也就是说deployment可以随便指定端口, 但是为了友好的告诉其它人这个应用的监听端口,所以会在deployment中指定端口列表 **

这个跟dockerfile中使用expose来暴露端口一样, 虽然是叫暴露,也只是起着告诉别人这个应用对外监听的端口,实际上对应用真正暴露端口并没有直接关系.

在rancher中部署应用的时, 很人性化的有多种类型让我们选择

  • NodePort: 所有node节点上都会开启这个端口来接收请求然后转发到这个应用上
  • HostPort: 跟使用–network=host类似, 通过应用最终部署到的host上接收请求然后转发到应用上
  • CLUSTERIP: service模式
  • layer-4 load balancer: 这种不常用

rancher上部署应用会直接创建对应的service, 而且会在deployment中记录ports的相关信息, 还是很方便的.

1
2
3
4
5
...      
ports:
- containerPort: 8232
name: 8232tcp2
protocol: TCP

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?