【问题标题】:Kubernetes, Flannel and exposing servicesKubernetes、Flannel 和暴露服务
【发布时间】:2016-03-25 12:29:31
【问题描述】:

我有一个运行良好的 kubernetes 设置,但我似乎无法在外部公开服务。我认为我的网络设置不正确:

kubernetes 服务地址:--service-cluster-ip-range=172.16.0.1/16

法兰绒网络配置: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 (192.168.4.57) 上的 nginx 容器 - 我误解了网络吗?如果有的话,可以解释一下吗:(

注意:这是在没有云提供商提供负载平衡器的物理硬件上,所以我认为 NodePort 是我唯一的选择?

【问题讨论】:

    标签: docker kubernetes coreos flannel flanneld


    【解决方案1】:

    所以这里的问题是,当您使用 nodePort 时缺少一块拼图。

    我的命令也出错了。

    首先,您需要确保公开正确的端口,在本例中为 80 用于 nginx:

    kubectl expose rc nginx --port=80 --type=NodePort
    

    其次,您需要使用kubectl describe svc nginx,它会显示它在每个节点上分配的 NodePort:

    [root@kubemaster ~]# kubectl describe svc nginx
    Name:           nginx
    Namespace:      default
    Labels:         run=nginx
    Selector:       run=nginx
    Type:           NodePort
    IP:         172.16.92.8
    Port:           <unnamed>   80/TCP
    NodePort:       <unnamed>   32033/TCP
    Endpoints:      10.0.0.126:80,10.0.0.127:80,10.0.0.128:80
    Session Affinity:   None
    No events.
    

    您当然可以在部署时分配一个,但我在使用随机分配的端口时丢失了此信息。

    【讨论】:

      【解决方案2】:

      是的,您需要使用 NodePort。 当您点击服务时,destPort 应该等于 NodePort。 服务的 destIP 应该被节点认为是本地的。例如。您可以使用其中一个节点的 hostIP..

      负载均衡器会有所帮助,因为它可以处理您的节点出现故障但其他节点仍然可以处理服务的情况。..

      【讨论】:

      • 感谢您回复阿布舍克。我原以为会是这种情况,但我什至无法让 nginx 加载到主机(在这种情况下是节点,对吗?)来加载 hello world 页面。 telnet kube1.leebriggs.lan 9000 Trying 192.168.4.56... telnet: connect to address 192.168.4.56: Connection refused
      • @Frap 确保在防火墙中启用端口 9000。
      【解决方案3】:

      如果您在裸机上或不在提供负载均衡器的提供商处运行集群,您还可以将端口定义为 pod 上的 hostPort

      你定义你的容器和端口

      containers:
      - name: ningx
        image: nginx
        ports:
        - containerPort: 80
          hostPort: 80
          name: http
      

      这会将容器绑定到主机网络并使用定义的端口。

      这里的两个限制显然是: 1) 每个主机上最多只能有一个这些 pod。 2)IP是它绑定的节点的主机IP

      这本质上是云提供商负载平衡器的工作方式。

      使用新的DaemonSet 功能,可以定义 pod 将登陆的节点并修复 IP。然而,这必然会损害高可用性方面,但在某些时候没有太多选择,因为 DNS 负载平衡不会避免转发到死节点

      【讨论】:

        猜你喜欢
        • 2021-08-13
        • 1970-01-01
        • 2018-11-21
        • 2018-10-31
        • 2020-06-18
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        相关资源
        最近更新 更多