K8s单pod多容器的端口映射

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里面增加一个反向代理,如nginxtraefikcaddy等。

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

然后把traefik80端口做为服务向外暴露的端口。

此外还有一种实现方式,在service中把不同容器不同的端口分别暴露出来。然后通过ingress来实现负载均衡。

以上只是作为一种可能性的讨论,配置均为示例。

devTILk8s

wentao

写点代码,解决点问题。

可控输入法

2020年self-hosted总结