Kubernetes、flannel 和公开服务

Kubernetes、flannel 和公开服务

我有一个运行良好的 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 有一个这个合理的例子在他们的文档中。

相关内容