K8s单pod多容器的端口映射
2021-01-15 • 预计阅读时间 2 分钟
2021-01-15 • 预计阅读时间 2 分钟
pod
可以通过replicas
来实现多实例,这个时候通过service
的配置将端口暴露出去。这些containers
的端口是一致的。这是比较理想的情况了。The Distributed System ToolKit: Patterns for Composite Containers | Kubernetes这篇文章介绍了常见的将服务暴露出去的方法。
自己最近给自己挖了个坑,单个pod中包含多个containers
的时候,由于网络是host network
。这个时候如何将这些不同的端口之间做负载均衡呢?
pod
做为K8s中的最小单元,里面也是可以包含多个容器的。这个时候类似于原生的docker
应用。这个时候不同容器对外暴露的端口是不能一样的。复合容器一般说的是把一组相关的应用放在一个pod中,这样能够避免一些跨node
额外的开销。但是这个仅仅能这么玩么?
同样的image
在一个pod有不同的实现,但是端口号是不一样的。但是又要对外提供服务。
如下:
apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
restartPolicy: Never
containers:
- name: first-container
image: app
ports:
- containerPort: 81
- name: second-container
image: app
ports:
- containerPort: 82
其实这种方案已经破坏了微服务无状态的要求。这里不讨论这种方案的好坏。能否实现呢?
其实可以通过在pod
里面增加一个反向代理
,如nginx
、traefik
和caddy
等。
apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
restartPolicy: Never
containers:
- name: first-container
image: app
ports:
- containerPort: 81
- name: second-container
image: app
ports:
- containerPort: 82
- name: traefik
image: traefik
ports:
- containerPort: 80
然后把traefik
的80
端口做为服务向外暴露的端口。
此外还有一种实现方式,在service中把不同容器不同的端口分别暴露出来。然后通过ingress
来实现负载均衡。
以上只是作为一种可能性的讨论,配置均为示例。