Kubernetes:hostPort 和 hostIp 有何用途?

问题描述 投票:0回答:3

我尝试了解 Kubernetes 中的 hostIP 和 hostPort。

这是我的集群配置:

3 个流浪节点:

nodes = [
  { :hostname => 'k8s-master', :ip => '192.168.150.200', :ram => 4096 },
  { :hostname => 'k8s-minion1', :ip => '192.168.150.201', :ram => 4096 },
  { :hostname => 'k8s-minion2', :ip => '192.168.150.202', :ram => 4096 },
]

我编写了以下清单来测试它:

apiVersion: v1
kind: Pod
metadata:
  name: firstpod
spec:
  containers:
  - name: container
    image: nginx
    ports:
    - containerPort: 80
      hostIP: 10.0.0.1
      hostPort: 8080

我使用

kubectl apply -f port.yml
进行部署 Pod 运行在 k8s-minion2 上

kubectl get pods -o wide gives :
NAME       READY     STATUS    RESTARTS   AGE       IP          NODE
firstpod   1/1       Running   0          2m        10.38.0.3   k8s-minion2

我可以从集群内部卷曲 ngnix,如下所示:

#ssh inside the cluster
    vagrant ssh k8s-master
#curl the containerPort on the pod ip
    curl 10.38.0.3:80

但是,我不知道如何使用hostIp和hostPort。 卷曲 10.0.0.1:8080 给出:

curl: (7) Failed to connect to 10.0.0.1 port 80: Connection timed out

并卷曲节点或集群 Ip 给出:

curl: (7) Failed to connect to 10.38.0.3 port 8080: Connection refused

那么 8080 端口在哪里开放,hostIp 的用途是什么?

谢谢

kubernetes port cluster-computing kubernetes-pod
3个回答
15
投票

如果您查看 kubernetes API reference,您会发现

hostIP
是在 pod 调度到节点后分配的 IP。

hostIP
(string) - Pod 所在主机的 IP 地址 分配的。如果尚未安排则为空。

如果需要,可以进一步暴露作为 pod 内的环境 (

spec.hostIP
)

使用

hostPort
可以将容器端口暴露到外部网络,地址为
<hostIP>:<hostPort>
,其中hostIP是容器运行的Kubernetes节点的IP地址,hostPort是用户请求的端口。您可以阅读更多有关这里的信息。

如果您想访问您的 Pod,还有其他方法可以实现,例如

ClusterIP
NodePort
,具体取决于请求是来自内部还是外部。 这篇文章将详细介绍它们以及它们之间的差异。


0
投票

ClusterIP
(
10.38.0.3
) 只能从集群内部访问。要从集群外部访问服务,请尝试
nodeIP:port
192.168.150.202:8080

NodePort 服务类型允许我们在每个节点上公开我们的服务 静态端口的 IP。因此,它允许从以下位置访问该服务 集群之外。


0
投票

hostIP 字段旨在区分主机系统上安装的网络接口(网卡)。这是网络的一般概念,也适用于 Kubernetes 之外。

假设您的 k8s-master 主机有两个网络接口:

eth0: 192.168.150.200
lo: 127.0.0.1

如果您不指定主机IP,则主机端口8080将绑定到所有可用的网络接口。这是默认设置,也是人们通常所期望的:

curl 192.168.150.200:8080 # works!
curl 127.0.0.1:8080 # works! (from the local host)

如果您指定了 hostIP,则 hostPort 8080 将仅绑定到具有该确切 IP 地址的网络接口。因此,如果主机 IP 是 127.0.0.1,则会发生这种情况:

curl 192.168.150.200:8080 # does NOT work!
curl 127.0.0.1:8080 # works! (from the local host)

如果您只想在本地主机上打开端口,这对于安全目的可能很有用。许多数据库传统上默认都是这样配置的。

你还可以用这个做更多的恶作剧,例如使用相同的端口启动多个 pod,并将它们绑定到不同的接口,这样就不会发生冲突。过去我不得不在一些罕见的边缘情况下使用它,例如对于只能使用端口 445 的多个 Samba 服务和 Windows 客户端。但对于 HTTP/S,最好使用反向代理(入口!)或者在防火墙中使用不同的端口和 NAT。也许 hostIP 没有被更好地描述,因为他们(可以理解)想要引导人们远离这类事情。

回答问题:由于IP地址为10.0.0.1的主机上没有网络接口,因此端口8080根本没有绑定并且无法工作(静默失败)。当然,您始终可以直接在 10.38.0.3:80 上卷曲 pod,但整个端口配置就没有意义了。如果您确实使用 hostIP,请确保 pod 仅在使用 spec/nodeName 的主机上运行,因为其他主机将具有不同的网络接口布局。

© www.soinside.com 2019 - 2024. All rights reserved.