我有一个运行良好的 kubernetes 设置,但我似乎无法向外部公开服务。我想我的网络设置不正确:
kubernetes 服务地址:
--service-cluster-ip-range=172.16.0.1/16
flannel 网络配置:
etcdctl get /test.lan/network/config {"Network":"172.17.0.0/16"}
docker子网设置:
--bip=10.0.0.1/24
主机节点 IP:
192.168.4.57
我已经运行了 nginx 服务,并尝试像这样公开它:
[root@kubemaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-px6uy 1/1 Running 0 4m
[root@kubemaster ~]# kubectl get services
NAME LABELS SELECTOR IP(S) PORT(S) AGE
kubernetes component=apiserver,provider=kubernetes <none> 172.16.0.1 443/TCP 31m
nginx run=nginx run=nginx 172.16.84.166 9000/TCP 3m
然后我像这样公开服务:
kubectl expose rc nginx --port=9000 --target-port=9000 --type=NodePort
NAME LABELS SELECTOR IP(S) PORT(S) AGE
nginx run=nginx run=nginx 9000/TCP 292y
我现在希望能够访问主机节点 IP 上的 nginx 容器(192.168.4.57
)——我误解了网络吗?如果有,能否解释一下,我将不胜感激 :(
注意:这是在没有云提供商提供负载均衡器的物理硬件上,所以我认为 NodePort 是我唯一的选择?
答案1
您不必使用 NodePort,也不必使用外部负载均衡器。只需将一些集群节点专用为负载均衡器节点即可。将它们放在不同的节点组中,为它们添加一些标签:mynodelabel/ingress: nginx
,然后在该节点组上托管 nginx ingress 守护进程集。
最重要的选项是:
spec:
restartPolicy: Always
dnsPolicy: ClusterFirst
hostNetwork: true
nodeSelector:
mynodelabel/ingress: nginx
和
ports:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
您可以选择污染您的负载均衡器节点,以便常规 pod 无法在其上运行并降低 nginx 的速度。
答案2
我现在希望能够访问主机节点 IP (192.168.4.57) 上的 nginx 容器 - 我是否误解了网络?如果有,能否解释一下,我将不胜感激 :(
期望读取 hostIP:NodePort 上的 pod,您可以使用以下命令找到服务的节点端口:
kubectl get svc echoheaders --template '{{range .spec.ports}}{{.nodePort}}{{end}}'
注意:这是在没有云提供商提供负载均衡器的物理硬件上,所以我认为 NodePort 是我唯一的选择?
您可以部署入口控制器,例如: https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx或者https://github.com/kubernetes/contrib/tree/master/service-loadbalancer
答案3
NodePort 服务是小型/本地裸机集群最常见的解决方案,并且相同的端口将在运行作业的所有节点上可用(即,可能不是主节点,而是工作节点)kube-proxy
。
有一些贡献/不明显的代码它的作用类似于小型网络的 LoadBalancer,因此如果您想在本地和云中使用类型:LoadBalancer,您可以获得大致相同的机制(如果这很重要)。
当您想要混合和匹配从集群在端口 80 或 443 上公开的服务(特别是 HTTP 服务)时,入口控制器比 NodePort 非常有用,并且专门用于通过单个端点(可能是一个端口 - 映射到单独的 URI 路径等)支持多个服务。当您想要的访问不是基于 HTTP 时,入口控制器的帮助不大(例如,基于套接字的服务,如 Redis 或 MongoDB,或者您正在做的一些自定义操作)
如果您将其集成到内部 IT 项目中,那么许多商业负载均衡器建议使用自己的负载均衡器技术来配置 NodePort 配置,并引用该设置中的所有工作节点池。F5 有一个这个合理的例子在他们的文档中。