[英]Alternative solution for host port networking that allows running multiple pods in Kubernetes
我在Kubernetes上运行我的应用程序,它是作为一个黑盒子码头图像提供给我的,它使用一堆env vars,卷安装和(稍微不同寻常)使用主机端口运行。 我发现 - 有很多痛苦和汗水 - 正如预期的那样,如果我希望再次看到主机端口功能,我的部署中不能有多个pod。
我有两件事情是清楚的:1。我需要添加更多pod复制品和2.我不能使用入口控制器(需要一个单独的外部IP)。
其他信息包括:
我试过的事情:
我的yaml文件类似于以下内容:
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: x
name: x
labels:
app: x
spec:
replicas: 1
selector:
matchLabels:
app: x
template:
metadata:
labels:
app: x
spec:
# hostNetwork: true
containers:
- name: x
image: x
env:
...
volumeMounts:
...
ports:
- containerPort: 80
volumes:
...
imagePullSecrets:
- name: x
service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: x
namespace: x
name: x
spec:
type: LoadBalancer
loadBalancerIP: x
ports:
- name: out
port: 8081
targetPort: 8081
protocol: TCP
- name: node
port: 80
targetPort: 80
protocol: TCP
selector:
app: x
---
apiVersion: v1
kind: Service
metadata:
labels:
app: x
namespace: x
name: x
spec:
type: LoadBalancer
loadBalancerIP: x
ports:
- name: out
port: 8081
targetPort: 8081
protocol: UDP
- name: node
port: 80
targetPort: 80
protocol: UDP
selector:
app: x
问题是,安全替换主机端口网络的最佳实践/解决方案是什么?
经过一番汗水和泪水,我想到了这一点。 我找到了两种使用主机网络的替代方案,这两种方式都让我们可以更自由地使用其他pod中的主机端口。
1.将containerPort映射到hostPort
此方法略好于主机网络,因为它只声明主机上非常特定的端口。
优点:多个pod现在可以使用主机端口,因为它们使用不同的主机端口。 另一个优点是您可以在任何范围内使用几乎相同的端口,例如低于1000等等。
缺点:单个部署或状态集中的多个pod仍然无法与此配置共存,因为它们将使用相同的主机端口。 因此“节点端口不可用”错误将持续存在。
deployment.yaml
...
- containerPort": 9000
hostPort": 9000
...
2.在服务中使用nodePort,映射到containerPort
这基本上是为我做的。 允许在您的服务配置范围从30000到32767使用NodePorts。因此我无法将8081和443映射到其对应的nodePort。 所以我将我的443 containerPort映射到我的LoadBalancer服务中的30443节点端口,并将8081 containerPort映射到30881节点端口。 然后我对我的代码进行了一些更改(将这些新节点端口作为env var传递),以便我的应用程序需要知道正在使用的主机端口。
优点:您可以根据需要扩展部署! 如果以后需要,您也不会占用众所周知的端口。
缺点:范围(30000 - 32767)有限。 此外,没有两个服务可以共享这些nodePorts,因此您只能使用TCP或UDP服务。 此外,您还必须在应用中进行一些更改才能使用更高数量的端口。
service.yaml
...
- name: out
targetPort: 8081
port: 30881
nodePort: 30881
protocol: TCP
- name: https
nodePort: 443
port: 30443
targetPort: 30443
protocol: TCP
...
所以基本上任何使用nodePort的资源都是一个,如果你使用的是特定的主机端口,你只能拥有一个。 因此,如果您选择使用pod hostPort,则只能有一个具有该端口的pod,如果您选择使用服务nodePort,则您的节点上只能有一个具有该端口的服务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.