我尝试了解 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 API reference,您会发现
hostIP
是在 pod 调度到节点后分配的 IP。
(string) - Pod 所在主机的 IP 地址 分配的。如果尚未安排则为空。hostIP
如果需要,可以进一步暴露作为 pod 内的环境 (
spec.hostIP
)
使用
hostPort
可以将容器端口暴露到外部网络,地址为<hostIP>:<hostPort>
,其中hostIP是容器运行的Kubernetes节点的IP地址,hostPort是用户请求的端口。您可以阅读更多有关这里的信息。
如果您想访问您的 Pod,还有其他方法可以实现,例如
ClusterIP
或 NodePort
,具体取决于请求是来自内部还是外部。 这篇文章将详细介绍它们以及它们之间的差异。
ClusterIP
(10.38.0.3
) 只能从集群内部访问。要从集群外部访问服务,请尝试 nodeIP:port
192.168.150.202:8080
NodePort 服务类型允许我们在每个节点上公开我们的服务 静态端口的 IP。因此,它允许从以下位置访问该服务 集群之外。
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 的主机上运行,因为其他主机将具有不同的网络接口布局。