首页 文章

Kubernetes,法兰绒和露天服务

提问于
浏览
3

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

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

法兰绒网络配置:etcdctl get /test.lan/network/config {“Network”:“172.17.0.0/16”}

docker subnet setting:--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容器 - 我误解了网络吗?如果我有,可以解释将是赞赏:(

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

3 回答

  • 1

    所以这里的问题是当你使用nodePort时,这个谜题有一个缺失 .

    我的命令也犯了错误 .

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

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

    其次,您需要使用 kubectl describe svc nginx 并在每个节点上分配'll show you the NodePort it':

    [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.
    

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

  • 1

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

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

  • 2

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

    您定义容器和端口

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

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

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

    这实际上是 Cloud 提供商负载均衡器在某种程度上的工作方式 .

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

相关问题